如何在matplotlib中使colorbar一端的颜色变暗?

Kri*_*673 9 python colors matplotlib

假设我有以下情节:

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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

颜色条具有分配给最低值的(几乎)白色。怎么让它稍微暗一点?我希望它不是从白色到蓝色的颜色条,而是从浅蓝色到深蓝色。例如,值 0 的颜色应该类似于上图中值 0.4 的颜色。

我在搜索时发现了一点,但问题(和解决方案)是关于使所有颜色变暗,这不是我想要的。

Tom*_*eus 9

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

import matplotlib as mpl

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

你的例子然后变成

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()
Run Code Online (Sandbox Code Playgroud)

这使

在此处输入图片说明

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

对于其他颜色图,结果可能大不相同。例如,对于jet

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

    在此处输入图片说明

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

    在此处输入图片说明


use*_*203 6

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

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)
Run Code Online (Sandbox Code Playgroud)

然后只需将其插入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()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明