python - 使用 'set_under' 或 'set_over' 后重置默认 matplotlib 颜色图值

标签 python matplotlib colormap

这件事困扰了我一段时间。每当我使用 cmap.set_under()cmap.set_over() 方法更改越界值的颜色时,它们似乎将这些更改应用于所有实例我在哪里使用该颜色图。下面是我所指的示例。

import matplotlib.pyplot as plt 
import numpy as np

rand_data = np.random.randint(50, size=(20,20))

plt.figure()
plt.subplot(211)
cmap1 = plt.cm.rainbow
im1 = plt.pcolormesh(rand_data, cmap=cmap1, vmin=10)
im1.cmap.set_under('w')
plt.colorbar(extend='min')

plt.subplot(212)
cmap2 = plt.cm.rainbow
im2 = plt.pcolormesh(rand_data, cmap=cmap2, vmin=10)
im2.cmap.set_under('k')
plt.colorbar(extend='min')

plt.show()

我在这里尝试创建两个具有相同值的图。在第一个图中,我希望所有低于 10 的值都为白色。在第二个图中,我希望所有低于 10 的值都为黑色。结果是这样的:

看来,我第二次使用 set_under 时,它为所有使用彩虹色图的现有绘图重置了 set_under。如果我在第二个图中使用不同的颜色图,我可以设置不同的 set_under 颜色:

enter image description here

更奇怪的是,如果在函数或脚本中使用 cmap.set_under()cmap.set_over(),退出该函数后此设置不会重置。也就是说,如果我注释掉我显式定义 set_under 的行并重新运行我的脚本,我会得到与以前相同的结果。

所以我有几个问题:

  1. 有没有办法在不影响任何现有绘图的颜色图的情况下为单个绘图设置颜色图越界值的颜色

  2. 如何将越界值重置为其原始颜色?

对于第二个问题,我知道我可以通过执行以下操作手动添加回原始颜色:

N = cmap.N
cmap.set_under(cmap(1))
cmap.set_over(cmap(N-1))

但是,我觉得应该有更简单的方法。

最佳答案

您描述的行为是预期的。只有一个颜色图存在,即 plt.cm.rainbow。当您首先 set_under('w') 和稍后的 set_under('k') 时,under 的颜色将为黑色。

您实际上想要做的是使用同一颜色图的两个不同实例,然后将每个实例更改为具有不同的下限值。
这可以使用 copy 轻松完成,

cmap1 = copy.copy(plt.cm.rainbow)

现在操作 cmap1 不会改变彩虹颜色图本身,因此以后可以创建它的另一个副本并应用不同的设置。

import matplotlib.pyplot as plt 
import numpy as np
import copy

rand_data = np.random.randint(50, size=(20,20))

plt.figure()
plt.subplot(211)
cmap1 = copy.copy(plt.cm.rainbow)
im1 = plt.pcolormesh(rand_data, cmap=cmap1, vmin=10)
im1.cmap.set_under('w')
plt.colorbar(extend='min')

plt.subplot(212)
cmap2 = copy.copy(plt.cm.rainbow)
im2 = plt.pcolormesh(rand_data, cmap=cmap2, vmin=10)
im2.cmap.set_under('k')
plt.colorbar(extend='min')

plt.show()

enter image description here

关于python - 使用 'set_under' 或 'set_over' 后重置默认 matplotlib 颜色图值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42843669/

相关文章:

python - 为什么我的 pyinstaller 不提取任何 exe 文件

python - 如何使 matplotlib/pandas 条形图看起来像直方图?

python - mayavi 在表面上映射一个离散的颜色条

python - 如何在seaborn中将matplotlib颜色图设置为调色板

带有 slider 的imagesc的Matlab实时更新

python - 将文件转换为字典

python - 迭代和更新列值时出现 ValueError

python - 使用 MySQLdb 在 python 中发出警告

python - 为绘制列表的曲线下面积着色

python - 在 seaborn 中使用 FacetGrid 为所有面重复 x 轴标签