Matplotlib绘制HR赫罗图时X、Y轴双不同刻度色标的实现问题
HR赫罗图双色标实现方案
你原有代码的核心问题是两次scatter调用会重叠覆盖点的显示,且直接调用plt.colorbar默认关联最后一次绘制的图形元素,导致两个色标都对应Y轴数值,无法分别绑定X、Y轴的刻度映射。
修改后可运行代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable # 读取数据,无需循环转换列表,直接获取Series值即可 data = pd.read_csv('Sagittarius_star_cloud.csv') X = data['bp_rp'].values Y = data['gp'].values fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111) # HR图星等轴反转符合天文使用习惯 plt.ylim(max(Y), min(Y)) # 绘制散点,这里点的颜色选择绑定X轴的BP-RP色指数,可根据需求调整绑定对象 sc = plt.scatter(x=X, y=Y, c=X, cmap='Spectral_r', s=5, alpha=0.7) # 生成绑定X轴数值的水平色标(刻度完全对应X轴取值) cbar_x = plt.colorbar(sc, orientation="horizontal", pad=0.15) cbar_x.set_label("BP-RP 色指数") # 构造绑定Y轴数值的垂直色标(刻度完全对应Y轴取值) norm_y = plt.Normalize(Y.min(), Y.max()) sm_y = ScalarMappable(norm=norm_y, cmap='Spectral_r') sm_y.set_array([]) cbar_y = plt.colorbar(sm_y, orientation="vertical", pad=0.1) cbar_y.set_label("G波段视星等") # 轴标签设置(可选,贴合HR图场景) ax.set_xlabel("BP-RP 色指数") ax.set_ylabel("G波段视星等") ax.set_title("人马座星团赫罗图") plt.show()
核心修改说明
- 优化了数据读取逻辑,无需循环遍历生成X、Y列表,直接调用
.values属性即可拿到numpy数组,运行效率更高 - 避免重复绘制散点导致的覆盖问题,仅绘制一次散点,通过
ScalarMappable单独构造Y轴对应的颜色映射对象,不会影响散点本身的显示 - 两个色标分别绑定X、Y轴的数值范围,刻度完全对应两个轴的取值,符合赫罗图的颜色标注需求
- 增加了
pad参数调整色标和主图的间距,避免和轴标签重叠,可根据实际显示效果调整数值
内容的提问来源于stack exchange,提问作者Vikram Chandra
相关产品推荐
相关产品推荐

