Используйте сетку для оценки данных - PullRequest
1 голос
/ 23 сентября 2019

предположим, у меня есть списки типа

x = [1,2,3,4,5]
y = [1,4,9,16,25]

Я хочу построить эти списки, но таким образом, чтобы, например, я бы разделил построенную область на 4 одинаково больших квадрата.

Я хочу что-то вроде:

plt.plot(x,y)
plt.grid(True but into 2x2 squares)
plt.show()

Дополнительно , я хочу быть сеткой не только что-то, что красиво выглядит на сюжете, но и имеет реальное назначение.

Например, я хочу иметь возможность проверить сколько точек находится в любом интересующем меня квадрате. Например, если я хочу проверить, сколько точек находится в нижнем левом квадрате(при условии, что у нас 2x2 квадрата) Я хочу получить четкий результат.

Также, если возможно, я хочу иметь возможность изменять размер / количество квадратов.Может быть, я хочу 2x2 квадрата, но, может быть, я хочу, чтобы он был более точным, и хочу 10x10 квадратов.

Наконец, было бы хорошо, если бы я решил разделить построенную область на 10x10 квадратов, чтобы я мог получить доступ кинформация о каждом квадрате о том, что такие же квадраты также будут визуально показаны на участке .

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Я написал следующую функцию, которая позволяет динамически создавать сетку с размером (и цветом), который вы предпочитаете над графиком.
Я даю вам ввод для функции plot_grid() данных, которые вы хотите нарисовать x и y, размер сетки (size_grid_x и size_grid_y) и, возможно, цвет (color_)и степень прозрачности (alpha_).

Функция, а также построение графика возвращает матрицу map_points (с использованием np.histogram2d ), содержащую количество точек в каждой ячейке сетки.

Код выглядит следующим образом:

import matplotlib.pyplot as plt
import numpy as np

def plot_grid(lx, ly, legend_labels=[], size_grid_x=2, size_grid_y=2, alpha_=0.9, color_='red'):

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)

    min_x, max_x = np.min(np.min(lx)), np.max(np.max(lx))
    min_y, max_y = np.min(np.min(ly)), np.max(np.max(ly)) 

    ticks_x = np.arange(min_x, max_x, (max_x-min_x)/size_grid_x)
    ticks_y = np.arange(min_y, max_y, (max_y-min_y)/size_grid_y)

    ax.set_xticks(ticks_x)
    ax.set_yticks(ticks_y)
    ax.set_xlim([min_x,max_x])
    ax.set_ylim([min_y, max_y])

    ax.grid(which='major', alpha=alpha_, color=color_)
    ax.grid(True)

    if not isinstance(lx[0], list):
        lx, ly = [lx], [ly]

    map_points_tot = np.zeros((size_grid_x,size_grid_y))
    for x,y in zip(lx, ly):
        ax.scatter(x,y)
        map_points, _, _ = np.histogram2d(x, y, bins=[size_grid_x, size_grid_y])
        map_points_tot += map_points

    if legend_labels:    
        plt.legend(legend_labels,loc='lower right')
    plt.show()
    plt.close()

    return map_points_tot

Примеры использования

С учетом следующих данных:

x = [1,2,3,4,5,9,8,7]
y = [1,4,9,16,25,7,4,18]

Возможно динамическое рисованиесетка, передавая размеры сетки в качестве параметров функции plot_grid().Например, если я хочу создать сетку 2x2:

map_points = plot_grid(x, y, size_grid_x=2, size_grid_y=2)

# Map points in every cell:
array([[3., 1.],
       [2., 2.]])

ПРИМЕЧАНИЕ: Как интерпретировать результаты в map_points?
в этомПример map_points должен интерпретироваться следующим образом: в ячейке lower left графика будет 3 точки, в ячейке upper left 1, в ячейке lower right 2 точки, в upper right 2 точки.клетка.enter image description here

или если я хочу создать сетку 4x4:

map_points = plot_grid(x, y, size_grid_x=4, size_grid_y=4)

# Map points in every cell:
array([[2., 0., 0., 0.],
       [0., 1., 1., 0.],
       [0., 0., 0., 1.],
       [1., 1., 1., 0.]])

enter image description here

илиесли я хочу создать зеленую сетку 4x3:

plot_grid(x, y, size_grid_x=4, size_grid_y=3, color_='green')

# Map points in every cell:
array([[2., 0., 0.],
       [0., 2., 0.],
       [0., 0., 1.],
       [2., 0., 1.]])

enter image description here

РЕДАКТИРОВАТЬ : если вы хотите напечатать больше данных втот же график, просто переключитесь на функции, вам просто нужно передать списки списков в качестве значений, также, если вы хотите добавить легенду, вам просто нужно передать список меток в качестве параметра:

lx = [[1,2,3,4,5,9,8,7], [5,4,10,11,3], [3,6,7,12,7,9]]
ly = [[1,4,9,16,25,7,4,18], [8,20,21,11,17], [13,8,10,12,17,19]]
legend_labels = ['data1', 'data2', 'data3']

plot_grid(lx, ly, legend_labels, size_grid_x=4, size_grid_y=3)

# Map points in every cell:
array([[2., 1., 2.],
       [3., 2., 1.],
       [0., 0., 2.],
       [3., 1., 2.]])

enter image description here

1 голос
/ 25 сентября 2019

Ответьте на второй вопрос. Если вы хотите напечатать больше линий на одном графике, указав маркеры и цвет (и многое другое ... см. ):

import numpy as np
import matplotlib.pyplot as plt

x1, y1 = np.arange(0., 5., 0.2), np.exp(np.arange(0., 5., 0.2)) + 25
x2, y2 = np.arange(0., 5., 0.2), np.arange(0., 5., 0.2)**2
x3, y3 = np.arange(0., 5., 0.2), np.arange(0., 5., 0.2)**3
x4, y4 = np.arange(0., 5., 0.2), np.arange(0., 5., 0.2)**2.5 + 10

# red dot, blue squares and green triangles.
# You can add the plots all in the same command 
plt.plot(x1, y1, 'ro', x2, y2, 'bs', x3, y3, 'g^')
# or individually
plt.plot(x4, y4, 'y*')

plt.show()

enter image description here Здесь вы найдете таблицу с matplotlib.markers , а здесь официальная документация

...