
本文详解如何在 Pandas 数据可视化基础上,利用 Seaborn 的 lmplot 或 regplot 为多个发射线光度与 AGN 光度的关系图添加线性回归线,并提供可复用的完整代码示例。
本文详解如何在 pandas 数据可视化基础上,利用 seaborn 的 `lmplot` 或 `regplot` 为多个发射线光度与 agn 光度的关系图添加线性回归线,并提供可复用的完整代码示例。
Pandas 自带的 .plot() 方法擅长基础绘图,但不原生支持自动拟合回归线;而 Seaborn 作为基于 Matplotlib 的高级统计可视化库,提供了开箱即用的线性拟合功能。针对您当前将四种发射线(Ha、OII、Hβ、OIII)同时对 log_AGN_LUM(type-2) 作散点图的需求,推荐两种专业且清晰的实现方式:
✅ 方案一:使用 seaborn.regplot(推荐用于单变量回归分析)
若需为每组变量单独绘制带回归线的散点图(更易解读斜率与相关性),可循环调用 regplot,并统一坐标轴便于对比:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('/home/beki/Desktop/Final_report9.csv')
# 设置全局样式
sns.set_style("whitegrid")
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()
variables = [
('log_LUM_Ha', 'Log Hα Luminosity'),
('log_Lum_OII', 'Log [OII] Luminosity'),
('log_LUM_H_beta', 'Log Hβ Luminosity'),
('log_LUM_OIII', 'Log [OIII] Luminosity')
]
for i, (y_col, label) in enumerate(variables):
sns.regplot(
data=df,
x='log_AGN_LUM(type-2)',
y=y_col,
ax=axes[i],
scatter_kws={'alpha': 0.6, 's': 30},
line_kws={'color': 'red', 'linestyle': '--'},
ci=95 # 显示 95% 置信区间带
)
axes[i].set_xlabel('AGN Luminosity [log(L$_{\rm AGN}$)]')
axes[i].set_ylabel(label)
axes[i].set_title(f'{label} vs AGN Luminosity')
plt.tight_layout()
plt.show()✅ 方案二:使用 seaborn.lmplot(适合分面/分类回归)
若希望所有数据共用同一坐标系并按变量类型着色+拟合(类似您原图效果),需先将数据“长格式化”(melt),再用 lmplot:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('/home/beki/Desktop/Final_report9.csv')
# 将多列目标变量转为长格式
melted = df.melt(
id_vars=['log_AGN_LUM(type-2)'],
value_vars=['log_LUM_Ha', 'log_Lum_OII', 'log_LUM_H_beta', 'log_LUM_OIII'],
var_name='Emission_Line',
value_name='Luminosity'
)
# 重命名类别以提升可读性
melted['Emission_Line'] = melted['Emission_Line'].map({
'log_LUM_Ha': 'Hα',
'log_Lum_OII': '[OII]',
'log_LUM_H_beta': 'Hβ',
'log_LUM_OIII': '[OIII]'
})
# 绘制分组回归图(每组自动拟合独立回归线)
g = sns.lmplot(
data=melted,
x='log_AGN_LUM(type-2)',
y='Luminosity',
hue='Emission_Line',
height=6,
aspect=1.4,
scatter_kws={'alpha': 0.7, 's': 40},
line_kws={'linewidth': 2},
ci=95
)
g.set_axis_labels('AGN Luminosity [log(L$_{\rm AGN}$)]', 'Emission Line Luminosity [log(L)]')
g.fig.suptitle('AGN–Line Luminosity Correlations with Linear Fits', y=1.02, weight='bold')
plt.show()⚠️ 注意事项:
- 数据质量优先:确保 log_AGN_LUM(type-2) 与各 log_* 列无缺失值或异常离群点,否则回归线易失真。建议先执行 df.dropna(subset=['log_AGN_LUM(type-2)', 'log_LUM_Ha', ...])。
- 相关性 ≠ 因果性:线性回归仅描述数值趋势,不能推断物理因果关系;建议后续补充 Pearson 相关系数(df.corr().loc[['log_AGN_LUM(type-2)'], [...])量化强度。
- 避免过度拟合:lmplot/regplot 默认使用 OLS(普通最小二乘),若关系明显非线性,可尝试 order=2 添加二次项,或改用 sns.scatterplot + 手动 np.polyfit。
通过上述任一方案,您不仅能直观呈现线性关联趋势,还能获得统计置信区间与标准化视觉表达——这正是专业天文数据分析中验证经验标定关系的关键步骤。


















