如何在Seaborn配对回归图上添加统计量并修改绘图颜色?
Seaborn配对回归图优化方案
1. 在回归子图上添加相关系数、R²、p值
要在每张回归子图显示统计量,需借助scipy.stats计算指标,再自定义标注函数,通过pairplot的映射方法将文本添加到子图中。
实现步骤与代码示例
import numpy as np import pandas as pd from google.colab import files from sklearn import preprocessing import seaborn as sns import matplotlib.pyplot as plt from scipy import stats # 数据加载与预处理 data = files.upload() df = pd.read_excel(data['yieldDataset.xlsx']) data1 = df.drop({'Date','class'}, axis=1) # 归一化处理 scalar = preprocessing.MinMaxScaler() data2 = scalar.fit_transform(data1) normal = pd.DataFrame(data2, columns=data1.columns) normal['class'] = df['class'] # 定义统计量标注函数 def annotate_stats(x, y, ax=None, **kwargs): if ax is None: ax = plt.gca() # 计算Pearson相关系数与p值 corr, p_val = stats.pearsonr(x, y) # 计算R²(回归拟合优度) _, _, r_value, _, _ = stats.linregress(x, y) r_squared = r_value ** 2 # 格式化标注文本 text = f"r = {corr:.2f}\nR² = {r_squared:.2f}\np = {p_val:.3f}" # 在子图右上角添加带背景的文本 ax.text(0.05, 0.95, text, transform=ax.transAxes, bbox=dict(facecolor='white', alpha=0.8), verticalalignment='top') # 绘制配对回归图并添加标注 g = sns.pairplot(normal, kind='reg') g.map_upper(annotate_stats) # 给上三角子图加标注 # 若需要下三角也显示标注,取消下面一行注释 # g.map_lower(annotate_stats) plt.show()
2. 修改绘图颜色为红色
可通过两种方式调整颜色,既可以统一设置散点和回归线颜色,也可以单独区分两者:
方法一:统一设置红色(散点+回归线)
g = sns.pairplot(normal, kind='reg', color='#ff0000')
方法二:单独调整散点与回归线颜色
g = sns.pairplot(normal, kind='reg', scatter_kws={'color': '#ff6666'}, # 浅红色散点 line_kws={'color': '#ff0000'}) # 深红色回归线
整合后的完整代码
import numpy as np import pandas as pd from google.colab import files from sklearn import preprocessing import seaborn as sns import matplotlib.pyplot as plt from scipy import stats # 数据加载与预处理 data = files.upload() df = pd.read_excel(data['yieldDataset.xlsx']) data1 = df.drop({'Date','class'}, axis=1) scalar = preprocessing.MinMaxScaler() data2 = scalar.fit_transform(data1) normal = pd.DataFrame(data2, columns=data1.columns) normal['class'] = df['class'] # 定义统计量标注函数 def annotate_stats(x, y, ax=None, **kwargs): if ax is None: ax = plt.gca() corr, p_val = stats.pearsonr(x, y) _, _, r_value, _, _ = stats.linregress(x, y) r_squared = r_value ** 2 text = f"r = {corr:.2f}\nR² = {r_squared:.2f}\np = {p_val:.3f}" ax.text(0.05, 0.95, text, transform=ax.transAxes, bbox=dict(facecolor='white', alpha=0.8), verticalalignment='top') # 绘制红色配对回归图并添加统计标注 g = sns.pairplot(normal, kind='reg', color='#ff0000') g.map_upper(annotate_stats) plt.show()
内容的提问来源于stack exchange,提问作者AmirHossein Ahrari
相关产品推荐
相关产品推荐

