Кажется, вопрос требует способа построения значений на сетке, которая является регулярной в одном измерении, но нерегулярной в другом.
Насколько я понимаю, такая сетка будет определяться массивом 1D, например, x-направление и 2D-массив в y-направлении. Оба массива будут обозначать края ячеек сетки в соответствующем измерении.
Для сетки M x N x_edges
, следовательно, будет иметь N+1
элементов, а y_edges
будет иметь форму (M+1, N)
. Следующее будет сетка 4 х 3.
x_edges = np.array([0,1,2,3])
y_edges = np.array([[0.,0.,0.],
[.3,.2,.2],
[.5,.6,.4],
[.8,.9,.7],
[1.,1.,1.]])
Обычные инструменты matplotlib, такие как imshow
или pcolor
, делают - насколько я вижу - не позволяют строить такие сетки. Следовательно, альтернативой является использование PolyCollection
и нанесение на него соответствующих прямоугольников.
Массив значений, которые должны быть сопоставлены с цветом, может быть установлен для этой коллекции. Этот массив должен иметь на одно значение меньше размера и быть плоским, т.е. иметь M * N элементов.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
# Starting data: A grid, regular in x-direction and irregular in y direction.
x_edges = np.array([0,1,2,3])
y_edges = np.array([[0.,0.,0.],
[.3,.2,.2],
[.5,.6,.4],
[.8,.9,.7],
[1.,1.,1.]])
######## Grid creation ################
#y_edges = np.concatenate((y_edges, np.zeros(len(y_edges))))
s = np.array(y_edges.shape)
# make x_edges 2D as well.
x_edges = np.tile(x_edges, s[0]-1).reshape((s[0]-1, s[1]+1))
# you may also have an array of values.
# This should be of shape one less than the edges and flattened.
values = np.arange(np.prod(s+np.array((-1,0))))
# Produce a vertices array of the edges of rectangles that form each pixel.
x = np.c_[x_edges[:,:-1].flatten(), x_edges[:,:-1].flatten(),
x_edges[:,1: ].flatten(), x_edges[:,1: ].flatten()]
y = np.c_[y_edges[:-1,:].flatten(), y_edges[1: ,:].flatten(),
y_edges[1: ,:].flatten(), y_edges[:-1,:].flatten()]
xy = np.stack((x,y), axis=2)
# Create collection of rectangles.
pc = PolyCollection(xy, closed=True, edgecolors="k", linewidth=0.72, cmap="inferno")
pc.set_array(values)
######## Plotting ################
fig, ax = plt.subplots()
ax.add_collection(pc)
fig.colorbar(pc, ax=ax)
ax.margins(0)
ax.autoscale()
plt.show()

Эта сетка использует небольшое количество ячеек, чтобы показать принцип. Если вы хотите иметь больше ячеек, постарайтесь не рисовать края прямоугольников, удалив аргументы edgecolors
и linewidth
.