如何为有效值设置不同的边缘颜色(pcolormesh)

How to set different edge colors for valid values (pcolormesh)

我想突出显示其值有效的网格边缘。

举个例子。 黄色网格的值为 2,而紫色网格的值为 1。 目的是用不同的颜色绘制它们的边缘。

import numpy as np
import matplotlib.pyplot as plt

z = np.full([5, 5], np.nan)

# grids with value = 1
z[1, 1] = 1
z[0, 2] = 1
z[1, 3] = 1

# grids with value = 2
z[3, 1] = 2
z[3, 2] = 2
z[3, 3] = 2

plt.pcolormesh(z)
plt.pcolormesh(z, edgecolors='red', facecolors='none')

目标:

您可以遍历 Z 并在每个不是 NaN 的位置绘制一个矩形。矩形的宽度和高度为 1clip_on=False 可用于避免矩形在绘图边界附近被部分剪掉。

import matplotlib.pyplot as plt
import numpy as np

z = np.full([5, 5], np.nan)

# grid cells with value = 1
z[1, 1] = 1
z[0, 2] = 1
z[1, 3] = 1
# grid cells with value = 2
z[3, 1:4] = 2

fig, ax = plt.subplots()
ax.pcolormesh(z, cmap='Pastel1')
for i in range(z.shape[0]):
    for j in range(z.shape[1]):
        if not np.isnan(z[i, j]):
            color = 'dodgerblue' if z[i, j] == 1 else 'crimson'
            ax.add_patch(plt.Rectangle((j, i), 1, 1, fc='none', ec=color, lw=3, clip_on=False))
ax.axis('off')  # hide axes
plt.show()

对于您的新问题,边界不规则,代码可能如下所示。请注意,每个维度中的单元格数比边界数少一个。另请注意,Rect 的参数顺序仍为 Rect((x,y),width,height),并且 pcolormesh 仍将 z[i,j] 的内容绘制在第 i 行和 j 第 1 列。 np.meshgrid 负责排序。

import matplotlib.pyplot as plt
import numpy as np

x1d = np.random.uniform(1, 3, 9).cumsum()
y1d = np.random.uniform(1, 3, 7).cumsum()
x, y = np.meshgrid(x1d, y1d)

z = np.random.randint(0, 3, (x.shape[0] - 1, x.shape[1] - 1)).astype(float)
z[z == 0] = np.nan

fig, ax = plt.subplots()
ax.pcolormesh(x, y, z, cmap='spring')
for i in range(z.shape[0]):
    for j in range(z.shape[1]):
        if not np.isnan(z[i, j]):
            color = 'dodgerblue' if z[i, j] == 1 else 'crimson'
            ax.add_patch(
                plt.Rectangle((x[i, j], y[i, j]), x[i, j + 1] - x[i, j], y[i + 1, j] - y[i, j],
                              fc='none', ec=color, lw=3, clip_on=False))
ax.axis('off')  # hide axes
plt.show()