Matplotlib散点图坐标轴优化:提升可读性与添加计量单位
解决方案
1. 核心问题拆解
你需要解决两个问题:给坐标轴添加规范计量单位,同时优化大样本下的刻度可读性。以下是针对性的实现方案:
2. 完整代码实现
import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator # 你的原始数据 mstar_list = ['10.52', '9.473', '9.195', '10.11', '9.589', '10.19', '9.374', '10.05', '10.23', '10.74', '10.61', '9.36', '9.595', '10.92', '9.479', '9.549', '10.68', '10.74', '10.31', '8.264', '8.665', '8.712', '9.203', '8.914', '9.81', '10.54', '10.13', '9.81', '9.87', '9.86', '9.27', '9.08', '8.78', '9.62', '9.23', '9.22', '10.53', '10.11', '10.32', '9.22', '10.02', '10.07', '9.16', '9.51', '9.74', '9.28', '9.31', '9.96', '9.91', '9.49', '9.27', '9.26', '8.96', '8.75', '7.49', '8.9', '9.2', '9.46', '9.12', '8.69', '7.39', '9.18', '9.75', '8.53', '8.47', '10.01', '9.82', '10.42', '9.65', '10.32', '10.37', '9.4', '10.89', '11.34'] sfr_list = ['0.6388', '-0.3744', '-0.4425', '-0.9009', '-0.9664', '0.05949', '-0.6335', '0.2962', '-0.2829', '0.3167', '-0.9527', '-0.5869', '-1.206', '0.3683', '-1.68', '-0.7564', '-0.4969', '0.113', '0.2508', '-1.284', '-1.755', '-2.918', '-0.5734', '-2.139', '0.1038', '-0.04576', '0.4784', '-0.9566', '0.2647', '0.7604', '0.02648', '0.1613', '-0.8109', '-0.01967', '-0.5942', '-0.1827', '0.2047', '0.6062', '-0.1293', '0.2303', '-1.000', '0.08164', '0.09781', '0.302', '0.00731', '0.09938', '-0.08674', '0.02707', '0.3765', '0.01095', '0.1501', '-0.06735', '-0.3979', '-1.0451', '-99', '-0.3586', '-0.5735', '-0.2420', '-99', '-0.5021', '-99', '-0.1549', '-0.2982', '-0.6214', '-1.2541', '-0.3312', '0.06567', '-0.6579', '0.5253', '0.6939', '0.2118', '0.2838', '0.4153', '-0.3508'] # 数据预处理:转换数值类型+过滤无效值(-99为缺失标记) valid_indices = [i for i, y in enumerate(sfr_list) if float(y) != -99] mstar = [float(mstar_list[i]) for i in valid_indices] sfr = [float(sfr_list[i]) for i in valid_indices] # 创建图表并调整尺寸,避免拥挤 plt.figure(figsize=(8, 6)) plt.scatter(mstar, sfr, color='pink', s=15) # 缩小标记尺寸,减少点重叠 # 添加带规范单位的坐标轴标签(用LaTeX格式实现专业符号) plt.xlabel(r'log(M/M$_\odot$)', fontsize=12) # M☉表示太阳质量 plt.ylabel(r'log(SFR/M$_\odot$ yr$^{-1}$)', fontsize=12) # SFR单位为太阳质量/年 # 优化刻度数量,自动避免重叠 plt.gca().xaxis.set_major_locator(MaxNLocator(nbins=8)) plt.gca().yaxis.set_major_locator(MaxNLocator(nbins=8)) # 可选:旋转x轴刻度,进一步解决长刻度值的重叠问题 plt.xticks(rotation=45, ha='right') # 自动调整布局,防止标签被截断 plt.tight_layout() plt.show()
3. 关键细节说明
- 计量单位规范:用Matplotlib支持的LaTeX语法(
r'...'保留原始格式),$_\odot$生成太阳符号,yr$^{-1}$表示年的倒数,符合天文数据的标准写法。 - 无效值过滤:y轴的
-99是典型的缺失数据标记,保留会拉低y轴刻度范围,压缩正常数据的可视化空间,过滤后可读性大幅提升。 - 刻度优化:
MaxNLocator会自动计算合适的刻度数量,避免过多刻度重叠;配合调整图表尺寸、旋转刻度,彻底解决拥挤问题。
内容的提问来源于stack exchange,提问作者moon_lover
相关产品推荐
相关产品推荐

