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

Matplotlib中plt.contourf()使用jet色图无法显示超9种颜色问题

解决plt.contourf()使用jet色图无法显示超过9种颜色的问题

我明白你遇到的困扰了——这不是jet色图本身的限制,而是plt.contourf()的默认参数设置在搞鬼。

问题根源

matplotlib的contourf()函数默认会自动生成10个levels(分界点),这意味着它会把你的数据划分成9个区间,对应9种不同的颜色。不管你传入的数据有多少个不同的离散值,只要不手动指定levels,它都会用这默认的9个区间来映射颜色,所以你设置num_colors=10时,看不到10种独立的颜色。

解决方案:手动指定levels参数

要显示对应数量的颜色,你需要手动设置levels参数,分界点的数量要比你想要的颜色数多1(因为n个分界点会划分出n-1个区间,对应n-1种颜色)。针对你的代码,有两种实用的修改方式:

方式1:基于你的离散值生成精确分界点

因为你的数据是固定的离散值(values = [0.5,1.5,...,9.5]),可以在这些值的中间位置设置分界点,确保每个值对应唯一的颜色:

import matplotlib.pyplot as plt
import numpy as np
num_colors = 10
values = [x / 10.0 for x in range(5, (10*num_colors)+5, 10)] # [0.5, 1.5,..., 9.5]
# 创建示例颜色映射(垂直步长)
list = []
for k in range(10*num_colors):
    tmp_list = []
    for i in range(len(values)):
        for j in range(10):
            tmp_list.append(values[i])
    list.append(tmp_list)
Z = np.array(list)
x = np.arange(0, num_colors, 0.1)
y = np.arange(0, num_colors, 0.1)
xx, yy = np.meshgrid(x, y)

# 手动生成levels:在每个values的中间位置设置分界,确保每个值对应唯一颜色
levels = np.linspace(min(values)-0.5, max(values)+0.5, num_colors+1)
plt.contourf(xx, yy, Z, levels=levels, cmap='jet', alpha=1.0)
plt.colorbar() # 加上颜色条可以直观验证所有颜色是否显示
plt.show()

方式2:直接指定levels数量

如果你不需要严格匹配离散值,只是想要更多颜色区间,可以直接基于数据的最大最小值生成对应数量的分界点:

# 替代上面的levels生成代码
levels = np.linspace(Z.min(), Z.max(), num_colors + 1)

额外提示

  • jet色图本身包含的颜色数量远不止9种,只要设置足够的levels,就能显示出更多的颜色梯度或离散色块。
  • 加上plt.colorbar()可以更直观地看到所有生成的颜色,方便确认是否达到了预期效果。

内容的提问来源于stack exchange,提问作者T. Holmström

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:52:50