You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:00:03