如何为有效值设置不同的边缘颜色(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 的位置绘制一个矩形。矩形的宽度和高度为 1
; clip_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()
我想突出显示其值有效的网格边缘。
举个例子。 黄色网格的值为 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 的位置绘制一个矩形。矩形的宽度和高度为 1
; clip_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()