在contourf中显示不同颜色
我想展示一个二维矩阵,比如下面这个:
2 3 4 5 6 3
1 2 2 4 5 5
1 2 2 2 2 4
我使用 contourf
在 matplotlib
中来完成这个工作,
cmap = colors.ListedColormap(['0.75', (0.2, 0.3, 0.5), 'r', 'b', 'g', 'c'])
bounds = [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5]
norm = colors.BoundaryNorm(bounds, cmap.N)
map = plt.contourf(x, y, Cordi, cmap=cmap, norm=norm,
level=[1,2,3,4,5], vmin=1, vmax=6)
现在问题来了,设置颜色的方式有很多,我想知道这些设置各自负责什么,以及它们的优先级是怎样的。
在我的颜色映射中,有一个
bounds
,它限制了颜色在特定范围内。在
contourf
中,有一个level
,它控制着同样的事情。在
contour
中,还有vmin
和vmax
,它们也控制着同样的事情。
我知道 imshow
更适合我的情况,并且它已经成功运行了。但现在谈到 contourf
时,里面有一个 level
,这让我感到困惑。
感谢你查看我的问题。
1 个回答
借助这篇文章,
我大致搞明白了。
整个过程分为两个部分,一个是contourf,另一个是色图(colormap)。
对于色图,主要是定义颜色并进行归一化。这部分决定了在绘图时应该使用什么颜色。
而对于contourf,level则是用来处理你想要绘制的部分。看起来,vmin和vmax在这部分用处不大,或者我还没找到它们的用法。
举个例子,
首先定义一个色图(cmap):
import matplotlib.pyplot as plt
from matplotlib import colors
cmap1 = plt.cm.jet
cmap = colors.ListedColormap(['r','b','g'])
bounds = [0,1,2,3]
norm = colors.BoundaryNorm(bounds, cmap.N)
a = plt.contourf([[1, 1], [3, 3],[5,5]], cmap = cmap, \
norm = norm, levels = [0,1,2])
plt.colorbar()
plt.show()
这意味着在[0,1]之间,颜色是红色;在[1,2]之间,颜色是蓝色,依此类推。
然后,如果你在contourf中定义一个level,比如说[0,1,2],程序会根据你的level把数据分成不同的部分。在这里,程序只关注[0,1,2],因为你之前已经设定了这些级别。
在[0,1]之间,中点是0.5,根据色图,它应该是红色,但查看数据发现[0,1]之间没有数据,所以继续。
当涉及到[1,2]时,中点应该是1.5,根据色图,它应该是蓝色,并且在这个范围内有数据,所以数据会被绘制出来。
在这里,level的处理到此结束。程序停止了,尽管你有超过2的数据。

如果我把level改为[0,1,2,3,4,5,6,7],结果如下。当level超过色图的范围时,超出的部分会显示相同的颜色。在这个例子中,当值超过3时,色图中没有定义处理超过3的颜色,所以它保持与[2,3]范围内相同的颜色。

现在把范围改为[1,2,3,4],level改为[0.6,1.5,2.5,3.5],结果如下:

所以,首先的区间[0.6,1.5],中点是1.05,根据色图,它应该是红色。其余部分遵循相同的规则。