如何调整Matplotlib散点图色条范围且保持colormap零值对应白色
解决方法
你只需要在不修改scatter的vmin、vmax参数(保证颜色映射始终以0为中心,零值对应白色)的前提下,手动调整colorbar关联的坐标轴显示范围即可,不需要修改归一化逻辑。
修改后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 1, 61) y = np.linspace(0, 1, 61) C = np.linspace(-10, 50, 61) M = np.abs(C).max() # 保留该参数用于颜色映射,保证0对应白色 fig, ax = plt.subplots(1, 1, figsize=(5,3), dpi=150) # 这里vmin、vmax保持不变,颜色映射逻辑和原来一致 sc=ax.scatter(x, y, c=C, marker='o', edgecolor='k', vmin=-M, vmax=M, cmap=plt.cm.RdBu_r) cbar=fig.colorbar(sc, ax=ax, label='$R - R_0$ (mm)') # 核心修改:手动设置色条的y轴显示范围,截掉小于-10的部分 cbar.ax.set_ylim(bottom=C.min()) # 如果需要更规整的刻度,可以手动指定 cbar.set_ticks([-10, 0, 10, 20, 30, 40, 50]) ax.set_xlabel('x') ax.set_ylabel('y') plt.show()
补充说明
- 该方法完全不会改变原始数据的颜色映射规则,所有点的颜色和你原有代码的输出完全一致,只是色条不再显示小于-10的空白区间
- 你之前修改
cbar.outline.set_ydata报错是因为新版matplotlib中色条的外框是Polygon对象,不需要单独调整外框,直接修改色条坐标轴的显示范围就会自动裁切外框和色条填充区域,和contourf的表现完全一致
内容的提问来源于stack exchange,提问作者Steven Thomas
相关产品推荐
相关产品推荐

