Python中替代已弃用方法创建离散Colormap与Colorbar
问题
我希望使用指定的colormap(例如viridis)创建带有离散颜色的绘图和colorbar。此前我使用mpl.cm.get_cmap("viridis", 7)生成7种离散颜色,但该方法已被弃用并将被移除。官方推荐使用matplotlib.colormaps[name]或matplotlib.colormaps.get_cmap(obj)替代,但这两种方式均无法指定离散颜色数量。目前我仅找到复杂的变通方案,请问是否存在像原方法一样简单直接的实现方式?
我已调整好colorbar轴的样式,因此希望保留现有代码结构,不更换plt.colorbar()的实现方案。
原示例代码:
import os.path as op import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams.update({'font.size': 30}) from mpl_toolkits.axes_grid1 import make_axes_locatable PLOT = '/tmp/' def main(): data = np.random.random((20,20)) data[5,:] = np.nan fig, ax = plt.subplots(figsize=(8.3,12)) divider = make_axes_locatable(ax) cm = mpl.cm.get_cmap('viridis', 7) cm.set_bad('darkgrey', alpha=1) plt.pcolormesh(data, cmap=cm, vmin=0,vmax=1) ax.axis('off') cax = divider.append_axes("right", size="5%", pad=0.2) cb = plt.colorbar(cax=cax) plt.savefig(op.join(PLOT, 'test.png'), bbox_inches='tight', dpi=300) plt.clf() plt.close() if __name__ == "__main__": main()
解决方案
可以通过matplotlib.colors.LinearSegmentedColormap.from_list()方法,结合官方推荐的方式获取连续colormap,快速生成指定数量的离散色阶,完全兼容原有代码结构,步骤如下:
- 先获取指定的连续colormap:
cmap = mpl.colormaps['viridis'] - 从该colormap中均匀提取N个颜色样本,生成离散colormap:
discrete_cmap = mpl.colors.LinearSegmentedColormap.from_list('自定义名称', cmap(np.linspace(0, 1, N)), N) - 后续设置
set_bad()、绘图、colorbar逻辑完全沿用原有代码
修改后的完整代码:
import os.path as op import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams.update({'font.size': 30}) from mpl_toolkits.axes_grid1 import make_axes_locatable PLOT = '/tmp/' def main(): data = np.random.random((20,20)) data[5,:] = np.nan fig, ax = plt.subplots(figsize=(8.3,12)) divider = make_axes_locatable(ax) # 替换弃用的get_cmap方法,生成7种离散颜色的viridis色阶 cmap = mpl.colormaps['viridis'] cm = mpl.colors.LinearSegmentedColormap.from_list('discrete_viridis', cmap(np.linspace(0, 1, 7)), 7) cm.set_bad('darkgrey', alpha=1) plt.pcolormesh(data, cmap=cm, vmin=0,vmax=1) ax.axis('off') cax = divider.append_axes("right", size="5%", pad=0.2) cb = plt.colorbar(cax=cax) plt.savefig(op.join(PLOT, 'test.png'), bbox_inches='tight', dpi=300) plt.clf() plt.close() if __name__ == "__main__": main()
说明
- 该方式和原
get_cmap(name, N)的效果完全一致,都是从原colormap中均匀采样N个颜色生成离散色阶 - 原有代码中设置缺失值颜色、绘图参数、colorbar的创建逻辑均不需要改动,完美适配现有结构
内容的提问来源于stack exchange,提问作者Therese
相关产品推荐
相关产品推荐

