Я написал следующую функцию, которая позволяет динамически создавать сетку с размером (и цветом), который вы предпочитаете над графиком.
Я даю вам ввод для функции 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 точки.клетка.
или если я хочу создать сетку 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.]])
илиесли я хочу создать зеленую сетку 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.]])
РЕДАКТИРОВАТЬ : если вы хотите напечатать больше данных втот же график, просто переключитесь на функции, вам просто нужно передать списки списков в качестве значений, также, если вы хотите добавить легенду, вам просто нужно передать список меток в качестве параметра:
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.]])