使用类标签

时间:2018-01-28 14:22:09

标签: python numpy matplotlib contour

我有一个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图的一个例子,它产生了太多的彩色区域:

实际上,网格中只有两个标签。但是,在两个区域之间的边界处,绘制了几条额外的轮廓线。

对于上面的示例,应该有一条轮廓线将两个区域(青色和蓝色)分开

我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你需要类似pcolormesh的情节,但只有轮廓。实现此目的的一种方法是扩展(或扩展)数组,使其在xy方向上多次包含相同的值。这基本上意味着你的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()

产生这种情节:

result of the code above

如您所见,线条仍然不是很直,有时可以看到彼此相邻的两条线。这是因为不同平台之间的梯度不相等。我使用N=200运行了另一个示例,在这种情况下,线条更直:

same as above, but with 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()

enter image description here

请注意,contourf图的颜色与散点图的颜色略有不同。问题的答案中解释了原因:How does pyplot.contourf choose colors from a colormap?

相关问题