Python-根据值绘制网格

时间:2019-04-04 13:21:58

标签: python matplotlib plot

我检查了类似的线程,而我的问题将比这个问题更进一步:Plotting colored grid based on values

我的网格尺寸为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. 第二,我想用3D绘图从以前的点升级2D绘图,其中单元格值为列。

您能给我一些建议吗?

2 个答案:

答案 0 :(得分:1)

怎么样?

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

答案 1 :(得分:1)

“网格尺寸20 x 10”与右上角ID = 99之间存在矛盾。因此,我假设您的意思是“网格尺寸10 x 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