Python - построение сетки на основе значений - PullRequest
2 голосов
/ 04 апреля 2019

Я проверил похожие темы, и мой вопрос будет на шаг дальше от этого: Построение цветной сетки на основе значений

У меня размер сетки 20 x 10, гдепервая ячейка (внизу слева) имеет ID = 0, а последняя (вверху справа) имеет ID = 99. Допустим, у меня есть два списка.Первый - это список ячеек, значение которых больше 0, а второй список состоит из этих значений, например, ячейка с ID = 11 имеет значение 77.

Cellid = [2, 4 ,5, 11 ,45 ,48 ,98]
Cellval = [20, 45 ,55, 77,45 ,30 ,15]
  1. Я быхотел бы сделать 2D-график этой сетки, где цвет ячейки основан на значении.Пустые ячейки являются пустыми, в остальном: чем больше значение, тем зеленее ячейка.
  2. Во-вторых, я хотел бы обновить 2D-график с точки видимости с 3D-графиком, где значения ячеек являются столбцами.

Можете ли вы дать мне совет, как подойти к этому?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Существует противоречие между «размером сетки 20 х 10» и верхним правым ID = 99. Поэтому я предполагаю, что вы имеете в виду «размер сетки 10 х 10» здесь.

Затем вы можете создать массив, который равен 0 везде, кроме позиций, заданных Cellid. Здесь я предполагаю, что ID проходит вдоль x в первую очередь. Вы можете замаскировать его так, чтобы 0 вообще не раскрашивался; они составляют его как imshow.

import numpy as np
import matplotlib.pyplot as plt

nrows = 10
ncols = 10

Cellid = [2, 4 ,5, 11 ,45 ,48 ,98]
Cellval = [20, 45 ,55, 77,45 ,30 ,15]

data = np.zeros(nrows*ncols)
data[Cellid] = Cellval
data = np.ma.array(data.reshape((nrows, ncols)), mask=data==0)

fig, ax = plt.subplots()
ax.imshow(data, cmap="Greens", origin="lower", vmin=0)

# optionally add grid
ax.set_xticks(np.arange(ncols+1)-0.5, minor=True)
ax.set_yticks(np.arange(nrows+1)-0.5, minor=True)
ax.grid(which="minor")
ax.tick_params(which="minor", size=0)

plt.show()

enter image description here

1 голос
/ 04 апреля 2019

Как насчет этого?

x = 20
y = 10

scale_factor = 3

fig, ax = plt.subplots(figsize=(x / scale_factor, y / scale_factor))

ax.axis(xmin=0, xmax=x, ymin=0, ymax=y)
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
ax.xaxis.set_major_locator(ticker.MultipleLocator(1.0))
ax.yaxis.set_major_locator(ticker.MultipleLocator(1.0))

ax.grid(color='black')

cell_ids = [2, 4, 5, 11, 45, 48, 98]
cell_values = [20, 45, 55, 77, 45, 30, 15]

cdict = {'red':   [[0.0, 0.0, 0.0],
                   [0.5, 0.0, 0.0],
                   [1.0, 0.5, 0.5]],
         'green': [[0.0, 0.0, 0.0],
                   [0.5, 1.0, 1.0],
                   [1.0, 1.0, 1.0]],
         'blue':  [[0.0, 0.0, 0.0],
                   [0.5, 0.0, 0.0],
                   [1.0, 0.5, 0.5]]}

cmap = colors.LinearSegmentedColormap('greens', cdict)

for cell_id, cell_value in zip(cell_ids, cell_values):
    cell_x = cell_id % x
    cell_y = cell_id // y
    ax.add_artist(patches.Rectangle((cell_x, cell_y), 1.0, 1.0, color=cmap(cell_value * 255 // 100)))

(Вы можете задать отдельный вопрос для 3D-детали - это не совсем понятно)

Result

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