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

如何让Matplotlib散点图颜色刻度与等高线图(contourf)的levels参数对齐?

让散点图颜色刻度与填充等高线图对齐的解决方案

这个问题我之前也碰到过!核心原因是contourf用了自定义levels后,它的颜色映射是基于你设置的这些断点来做归一化的,但scatter默认会用数据本身的最小和最大值生成颜色刻度,所以两者的颜色对应关系就错位了。

要解决这个问题很简单,只需要复用contourf生成的归一化规则就行,具体步骤如下:

  1. 你调用contourf得到的im对象里,已经包含了根据自定义levels生成的Normalize实例(也就是im.norm),它定义了数据值到颜色刻度的映射规则。
  2. 在绘制散点图的时候,把这个norm参数传给scatter函数,这样散点的颜色就会严格遵循等高线的颜色刻度来映射。

修改后的完整代码如下:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0,10).tolist()
y = np.arange(0,10).tolist()
z = np.ndarray((len(x),len(y)))
for i in range(0,10):
    for j in range(0,10):
        z[i][j] = x[i]*7+y[j]*3

# 绘制填充等高线,自定义levels
im = plt.contourf(z, levels=[0,10,20,30,800,900,1000], cmap='rainbow')
cbar = plt.colorbar(im)

# 绘制散点图,传入contourf的norm对象对齐颜色刻度
plt.scatter(np.meshgrid(x,y)[0], np.meshgrid(x,y)[1], c=z, cmap='rainbow', norm=im.norm, edgecolor='k', s=100)

plt.show()

补充说明

  • 这里的norm=im.norm是关键,它让散点图使用和等高线完全相同的颜色映射范围与断点,所以两者的颜色会完全匹配。
  • 因为你的levels里设置的最大值是1000,而实际z数据的最大值是90,所以所有散点和等高线中值大于30的部分都会被映射到颜色条的最高阶颜色,这也符合你设置levels的预期。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:47:27