Matplotlib在共享Y轴双子图中绘制对角线的技术实现问询
完整实现代码 + 关键细节解释
没问题,我把你需要的可视化效果整理成了可直接运行的代码,还标注了每个关键步骤的作用:
import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 生成示例散点数据(你可以替换成自己的真实数据) np.random.seed(42) # 固定随机种子,结果可复现 x1 = np.random.randn(100)*2 + 10 y1 = x1 + np.random.randn(100)*1.5 # 带噪声的线性数据 x2 = np.random.randn(100)*3 + 10 y2 = x2*0.8 + np.random.randn(100)*2 # 创建1行2列、共享Y轴的子图 fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(12, 6)) # 在ax1绘制红色宽对角线 # 先获取数据的极值,确保对角线覆盖整个绘图区域 x_min, x_max = min(x1), max(x1) y_min, y_max = min(y1), max(y1) ax1.plot([x_min, x_max], [y_min, y_max], color='red', linewidth=3, label='Reference Diagonal') # 用Seaborn绘制无拟合线的散点图 sns.regplot(x=x1, y=y1, ax=ax1, fit_reg=False, scatter_kws={'alpha': 0.6, 'color': 'steelblue'}) sns.regplot(x=x2, y=y2, ax=ax2, fit_reg=False, scatter_kws={'alpha': 0.6, 'color': 'darkorange'}) # 设置坐标轴标签 ax1.set_xlabel('X Variable 1', fontsize=10) ax1.set_ylabel('Y Variable', fontsize=10) ax2.set_xlabel('X Variable 2', fontsize=10) # 因为共享Y轴,ax2不需要重复设置Y标签 # 设置标题 fig.suptitle('Scatter Plots with Reference Diagonal', fontsize=14, y=1.02) # 全局大标题,上移避免重叠 ax1.set_title('Subplot 1: Diagonal + Scatter', fontsize=12) ax2.set_title('Subplot 2: Scatter Only', fontsize=12) # 添加图例(仅ax1需要,因为只有它有对角线) ax1.legend() # 自动调整布局,避免标题、标签重叠 plt.tight_layout() # 展示图形 plt.show()
关键细节说明:
- 共享Y轴:通过
sharey=True参数实现,让两个子图的Y轴刻度完全对齐,更便于横向对比数据 - 对角线绘制:先获取数据的极值来确定对角线的起止点,确保线条能覆盖整个散点的分布范围,比硬编码固定值更适配不同数据
- Seaborn散点配置:
fit_reg=False用来关闭默认的拟合线,scatter_kws可以调整散点的透明度(避免重叠遮挡)和颜色,提升可读性 - 标题与布局:用
fig.suptitle设置全局大标题,y=1.02让标题稍微上移避免和子图标题重叠;plt.tight_layout()自动调整子图间距,解决标签、标题重叠问题
内容的提问来源于stack exchange,提问作者pitosalas
相关产品推荐
相关产品推荐

