实现colorbar自由还是得靠自己啊:
官方文档:https://matplotlib.org/devdocs/api/_as_gen/matplotlib.colors.LinearSegmentedColormap.html?highlight=colors%20linearsegmentedcolormap%20from_list#matplotlib.colors.LinearSegmentedColormap.from_list
第一眼看到这个cdict真的挺晕的,不过仔细分析就很容易看明白啦。
首先,这里用的是RGB来调色
以’red’为例,我们来看看这个3*3的矩阵,每行的三个数字分别对应为x,y0和y1,x代表了这个颜色在colorbar上的位置,比如0就是colorbar的最小值,1是colorbar的最大值,所以x必须单调增加;然后其实真的需要看的就是每一行的y1和下一行的y0,这个函数其实就是在对应的x位置将y1-y0进行了差值(如上图所示),所以说,第一行的y0和第三行的y1其实设置为多少都不影响最终的结果,因为第一行的y0没有对应的上一行的y1,最后一行的y0没有对应下一行的y0,所以这俩数就是来占位的,明白了这一点这个矩阵应该就明白了。
下面是两个例子供大家理解:
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
tem = np.zeros((100,100))
tem[:]=np.nan
cdict = {'red': [(0.0, 0.0, 0.0),
(0.5, 0.5, 0.5),
(1.0, 1.0, 0.0)],
'green': [(0.0, 0.0, 0.0),
(0.5, 0.0, 0.0),
(1.0, 0.0, 0.0)],
'blue': [(0.0, 0.0, 0.0),
(0.5, 0.0, 0.0),
(1.0, 0.0, 0.0)]}
cmap = mpl.colors.LinearSegmentedColormap('cmap', cdict, 256)
plt.imshow(tem,cmap = cmap)
plt.colorbar()
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
tem = np.zeros((100,100))
tem[:]=np.nan
cdict = {'red': [(0.0, 0.0, 0.0),
(0.5, 1.0, 0.0),
(1.0, 1.0, 0.0)],
'green': [(0.0, 0.0, 0.0),
(0.5, 0.0, 0.0),
(1.0, 0.0, 0.0)],
'blue': [(0.0, 0.0, 0.0),
(0.5, 0.0, 0.0),
(1.0, 0.0, 0.0)]}
cmap = mpl.colors.LinearSegmentedColormap('cmap', cdict, 256)
plt.imshow(tem,cmap = cmap)
plt.colorbar(orientation = 'horizontal')
除了用cdict来定义colorbar,我们还可以使用颜色列表来定义,mpl会自动对这些颜色列表进行插值,我认为也是很好用的,比如说我认为bwr这个色条两端颜色太深了,我就可以选出来中间的一段色条重新构建colorbar:
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
tem = np.zeros((100,100))
tem[:]=np.nan
cmap0=plt.get_cmap('bwr',12)
bwr_10 = mpl.colors.LinearSegmentedColormap.from_list('bwr_10', cmap0(np.arange(1,11)), 10)
#The number of rgb quantization levels.如果想要分级的colorbar,这里的数值就和级数相同即可
#如果想要连续的这里就调成255肉眼就看不出来了
plt.imshow(tem,cmap = 'bwr')
plt.colorbar(orientation = 'horizontal')
plt.imshow(tem,cmap = bwr_10)
plt.colorbar(orientation = 'horizontal')
bwr:
bwr_10: