如何让Matplotlib散点图颜色刻度与等高线图(contourf)的levels参数对齐?
让散点图颜色刻度与填充等高线图对齐的解决方案
这个问题我之前也碰到过!核心原因是contourf用了自定义levels后,它的颜色映射是基于你设置的这些断点来做归一化的,但scatter默认会用数据本身的最小和最大值生成颜色刻度,所以两者的颜色对应关系就错位了。
要解决这个问题很简单,只需要复用contourf生成的归一化规则就行,具体步骤如下:
- 你调用
contourf得到的im对象里,已经包含了根据自定义levels生成的Normalize实例(也就是im.norm),它定义了数据值到颜色刻度的映射规则。 - 在绘制散点图的时候,把这个
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
相关产品推荐
相关产品推荐

