我有一个2D网格点,其中每个点都有一个相应的标签,其范围为[0.0, 5.0]
。现在我想做以下事情:
绘制网格中的所有点,并根据其标签对其进行着色。
但是,我不想使用scatter plot来执行此操作。我已尝试使用 contourf 和 pcolormesh 绘图:
import matplotlib.pyplot as plt
np.random.seed(1234)
x = np.linspace(-1.0, 1.0, num=5)
xx, yy = np.meshgrid(x, x)
z = np.random.randint(low=0, high=6, size=xx.shape)
levels = np.arange(0, 6)
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0, 0].contourf(xx, yy, z)
axes[0, 1].contour(xx, yy, z, colors='k')
axes[1, 0].scatter(xx, yy, marker='.', c=z)
axes[1, 1].pcolormesh(xx, yy, z)
plt.show()
我应该如何指定contourf
图的等级,以便我获得分隔标签的轮廓线。 (类似于 pcolormesh 图)
此外,如何修复每个标签的颜色,即标签4应始终为红色?
编辑:这是contourf
图的一个例子,它产生了太多的彩色区域:
实际上,网格中只有两个标签。但是,在两个区域之间的边界处,绘制了几条额外的轮廓线。
对于上面的示例,应该有一条轮廓线将两个区域(青色和蓝色)分开
我感谢任何帮助。
答案 0 :(得分:1)
如果我理解正确,你需要类似pcolormesh
的情节,但只有轮廓。实现此目的的一种方法是扩展(或扩展)数组,使其在x
和y
方向上多次包含相同的值。这基本上意味着你的z
由许多高原组成,其间具有非常陡峭的梯度。您可以使用np.repeat
轻松完成此操作。下面我展示一个示例,其中原始数据中的每个点都扩展到20x20高原。
可以通过创建自定义色彩图来修复图表的颜色。在您的情况下,使用ListedColormap
就足够了。使用contour
时,您还必须指定应绘制轮廓的级别,以使其正常工作。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors
cmap = colors.ListedColormap([
'royalblue', 'cyan','yellow', 'orange', 'red', 'green'
])
np.random.seed(1234)
num = 5
x = np.linspace(-1.0, 1.0, num=num)
xx, yy = np.meshgrid(x, x)
z = np.random.randint(low=0, high=6, size=xx.shape)
levels = np.arange(0, 6)
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0, 0].contourf(xx, yy, z)
axes[0, 1].contour(xx, yy, z, colors='k')
axes[1, 0].scatter(xx, yy, marker='.', c=z)
axes[1, 1].pcolormesh(xx, yy, z, cmap=cmap) ##I added here the custom colormap for reference
##expanding the arrays
N = 20
x1 = np.linspace(-1.0, 1.0, num=N*num)
xx1, yy1 = np.meshgrid(x1,x1)
z1 = np.repeat(np.repeat(z, N,axis=0),N).reshape(xx1.shape)
fig2, ax2 = plt.subplots()
ax2.contour(xx1, yy1, z1, cmap=cmap, levels = levels)
plt.show()
产生这种情节:
如您所见,线条仍然不是很直,有时可以看到彼此相邻的两条线。这是因为不同平台之间的梯度不相等。我使用N=200
运行了另一个示例,在这种情况下,线条更直:
希望这有帮助。
答案 1 :(得分:1)
可能你只是忘了提供你想要展示的关卡。对于N个标签,需要7个级别,例如对于标签[0 1 2 3 4 5]
,可以选择级别,使标签位于级别间隔的中间[-0.5 0.5 1.5 2.5 3.5 4.5 5.5]
。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
np.random.seed(1234)
x = np.linspace(-1.0, 1.0, num=5)
xx, yy = np.meshgrid(x, x)
z = np.random.randint(low=0, high=6, size=xx.shape)
levels = np.arange(0, z.max()+2)-0.5
fig, ax = plt.subplots()
im = ax.contourf(xx, yy, z, levels=levels)
fig.colorbar(im, ax=ax, ticks=np.unique(z))
ax.contour(xx, yy, z, colors='k',levels=levels)
ax.scatter(xx, yy, marker='.', c=z)
plt.show()
请注意,contourf图的颜色与散点图的颜色略有不同。问题的答案中解释了原因:How does pyplot.contourf choose colors from a colormap?