在contourf中显示不同颜色

2 投票
1 回答
2653 浏览
提问于 2025-04-18 17:51

我想展示一个二维矩阵,比如下面这个:

2 3 4 5 6 3
1 2 2 4 5 5
1 2 2 2 2 4

我使用 contourfmatplotlib 中来完成这个工作,

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)

现在问题来了,设置颜色的方式有很多,我想知道这些设置各自负责什么,以及它们的优先级是怎样的。

  1. 在我的颜色映射中,有一个 bounds,它限制了颜色在特定范围内。

  2. contourf 中,有一个 level,它控制着同样的事情。

  3. contour 中,还有 vminvmax,它们也控制着同样的事情。

我知道 imshow 更适合我的情况,并且它已经成功运行了。但现在谈到 contourf 时,里面有一个 level,这让我感到困惑。

感谢你查看我的问题。

1 个回答

2

借助这篇文章,

matplotlib标准色图的使用

我大致搞明白了。

整个过程分为两个部分,一个是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的数据。

enter image description here

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

enter image description here

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

enter image description here

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

撰写回答