Как построить на сетке с уточнениями? - PullRequest
0 голосов
/ 26 ноября 2018

Смежный вопрос

Мои данные поступают в виде (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]

Здесь показано желаемое положение и пространственный экстент для пикселей, соответствующих фиктивным данным выше.

enter image description here

Теперь я могу интерполировать свои данные, чтобы они соответствовали точным точкам сетки, но это будет неэффективно и не очень элегантно.Некоторые области моей сетки могут быть гораздо более изощренными, чем другие.

Есть ли способ сделать этот тип графика в 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).Позиции всегда относятся к центру пикселя.

1 Ответ

0 голосов
/ 26 ноября 2018

Нет встроенной функции, которая позволила бы построить неправильную сетку, подобную той, которая указана в вопросе.Решение было бы определить коллекцию «пикселей» с соответствующими краями.

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()

enter image description here

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