【问题标题】:Reset default matplotlib colormap values after using 'set_under' or 'set_over'使用“set_under”或“set_over”后重置默认 matplotlib 颜色图值
【发布时间】:2017-08-08 04:38:40
【问题描述】:

这是困扰我一段时间的事情。每当我使用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 颜色:

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

所以我有几个问题:

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

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

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

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

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

【问题讨论】:

    标签: python matplotlib colormap


    【解决方案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()
    

    【讨论】:

    • 谢谢!我什至没有考虑制作颜色图的副本。我想我的印象是使用im.cmap.set_under( ) 而不是仅使用cmap.set_under 只会改变im 中使用的颜色图的实例。但是,你的解释很有道理。
    猜你喜欢
    • 2020-04-08
    • 2016-01-16
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2014-09-24
    相关资源
    最近更新 更多