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
相关产品推荐
相关产品推荐

