如何在matplotlib中使颜色栏一端的颜色更深?

时间:2018-06-26 03:19:53

标签: python matplotlib colors

说我有以下情节:

import numpy as np
import matplotlib.pyplot as plt    

np.random.seed(1)
data =  np.sort(np.random.rand(8,12))
plt.figure()
c = plt.pcolor(data, edgecolors='k', linewidths=4, cmap='Blues', vmin=0.0, vmax=1.0)
plt.colorbar(c)
plt.show()

enter image description here

颜色栏的(几乎)白色分配为最低值。我如何使它稍微变暗?我希望它的颜色范围应该从浅蓝色到深蓝色,而不是从白色到蓝色。就像,在上图中,值为0的颜色应该类似于值为0.4的颜色。

我在搜索this时发现了它,但问题(以及解决方法)是使所有颜色都变暗,这不是我想要的。

3 个答案:

答案 0 :(得分:4)

只需定义自己的自定义颜色图:

from matplotlib.colors import LinearSegmentedColormap

colors = [(0.6, 0.76, 0.98), (0, 0.21, 0.46)] # Experiment with this
cm = LinearSegmentedColormap.from_list('test', colors, N=10)

然后将其插入cmap参数:

import numpy as np
import matplotlib.pyplot as plt    

np.random.seed(1)
data =  np.sort(np.random.rand(8,12))
plt.figure()
c = plt.pcolor(data, edgecolors='k', linewidths=4, cmap=cm, vmin=0.0, vmax=1.0)
plt.colorbar(c)
plt.show()

结果:

enter image description here

答案 1 :(得分:2)

尽管@ user3483203的建议非常好,但是您还是可以重新插入颜色图。您可以通过首先将颜色图作为颜色矩阵(基于原始插值)然后选择该矩阵的一部分作为新的颜色图来避免这种情况:

import matplotlib as mpl

cmap = mpl.cm.Blues(np.linspace(0,1,20))
cmap = mpl.colors.ListedColormap(cmap[10:,:-1])

您的示例变为

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

cmap = mpl.cm.Blues(np.linspace(0,1,20))
cmap = mpl.colors.ListedColormap(cmap[10:,:-1])

np.random.seed(1)
data = np.sort(np.random.rand(8,12))

plt.figure()
c = plt.pcolor(data, edgecolors='k', linewidths=4, cmap=cmap, vmin=0.0, vmax=1.0)
plt.colorbar(c)
plt.show()

给出

enter image description here

在这种情况下可能等同于重新插值的颜色图,因为Blues本身来自某种插值。

对于其他颜色图,结果可能会完全不同。例如,对于jet

  • 没有新的插值,而只是原始颜色图的子集(即当前解决方案):

    enter image description here

  • 使用重新插值(即@ user3483203的解决方案):

    enter image description here

答案 2 :(得分:1)

使用set_clim是一种可以根据需要调整颜色的简单方法:

c.set_clim(-0.5, 1.0)

这将设置颜色限制(第一个值为vmin,第二个值为vmax)。

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.clim.html