Мои данные поступают в виде (3 × N) массива
[[x_0, ..., x_N-1],
[y_0, ..., y_N-1],
[z_0, ..., z_N-1]]
Я хочу построить его так, чтобы первые две строки кодировали позицию X, Y пикселя, а третья строка устанавливает цвет пикселя.
Однако я не хочу никакой интерполяции. Скорее, пространство покрыто мозаикой тем фактом, что все точки лежат на сетке, а более низкие деления являются уточнениями исходной сетки. Вот некоторые фиктивные данные
[[4, 12, 24, 4, 12, 20, 28, 8, 18, 22, 28, 17, 19, 22, 17, 19], # X
[4, 4, 8, 12, 12, 20, 20, 24, 26, 26, 28, 29, 29, 30, 31, 31], # Y
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] # Z (color)
Эти пиксели имеют размер
D = [8, 8, 16, 8, 8, 8, 8, 16, 4, 4, 8, 2, 2, 4, 2, 2]
Здесь проиллюстрировано желаемое положение и пространственный экстент для пикселей, соответствующих фиктивным данным выше.
Теперь я могу интерполировать свои данные, чтобы они соответствовали лучшим точкам сетки, но это будет неэффективно и не очень элегантно. Некоторые области моей сетки могут быть гораздо более изысканными, чем другие.
Есть ли способ сделать такой сюжет в matplotlib?
РЕДАКТИРОВАТЬ Для пояснения, уточнение пикселя в позиции (x, y) размера (d × d) дает 4 пикселя в позициях (x - d/4, y - d/4), (x + d/4, y - d)./4), (x - d/4, y + d/4), (x + d/4, y + d/4), каждый из которых имеет размер (d/2 × d/2). Позиции всегда относятся к центру пикселя.
Нет встроенной функции, которая позволила бы построить неправильную сетку, подобную той, которая указана в вопросе. Решение было бы определить коллекцию "пикселей" с соответствующими краями.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
from matplotlib.ticker import MultipleLocator
x = np.array([4, 12, 24, 4, 12, 20, 28, 8, 18, 22, 28, 17, 19, 22, 17, 19]) # X
y = np.array([4, 4, 8, 12, 12, 20, 20, 24, 26, 26, 28, 29, 29, 30, 31, 31]) # Y
z = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) # Z (color)
D = np.array([8, 8, 16, 8, 8, 8, 8, 16, 4, 4, 8, 2, 2, 4, 2, 2])
def irregularmesh(x, y, s, c, ax=None, **kwargs):
xedge = np.c_[-s, s, s, -s]/2. + np.atleast_2d(x).T
yedge = np.c_[-s, -s, s, s]/2. + np.atleast_2d(y).T
xy = np.stack((xedge,yedge), axis=2)
# Create collection of rectangles.
pc = PolyCollection(xy, closed=True, **kwargs)
pc.set_array(c)
ax = ax or plt.gca()
ax.add_collection(pc)
return pc
######## Plotting ################
fig, ax = plt.subplots()
pc = irregularmesh(x, y, D, z, ax=ax, linewidth=0, cmap="inferno")
fig.colorbar(pc, ax=ax)
ax.margins(0)
ax.autoscale()
for axis in [ax.xaxis, ax.yaxis]:
axis.set_major_locator(MultipleLocator(4))
plt.show()
d
здесь?