如何在Seaborn配对图(pairplot)中将正态分布改为均匀分布
如何将Seaborn Pairplot的正态分布改为均匀分布
要把pairplot对角线上默认的正态分布拟合曲线换成均匀分布,你可以通过自定义对角元素的绘图逻辑来实现,下面是两种实用的方法:
方法1:自定义对角绘图函数(拟合均匀分布)
Seaborn的pairplot允许先指定对角为直方图,再手动叠加均匀分布的拟合曲线。这里需要用到scipy.stats.uniform来生成均匀分布的概率密度函数。
修改后的完整代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import numpy as np from io import StringIO from scipy.stats import uniform # 构建示例数据 text = '''id,revenue ,profit,Label 101,779183,281257,1 102,144829,838451,1 103,766465,757565,-1''' df = pd.read_csv(StringIO(text)) df = df[df.columns[1::]] # 绘制pairplot,先指定对角为直方图 sns_plot = sns.pairplot(df, hue='Label', diag_kind='hist') # 遍历每个对角轴,添加均匀分布拟合曲线 for ax in sns_plot.diag_axes: # 获取当前轴的原始数据 data = ax.collections[0].get_offsets()[:, 0] # 拟合均匀分布,得到参数:loc是最小值,scale是数据范围(max-min) loc, scale = uniform.fit(data) # 生成x轴取值范围 x = np.linspace(data.min(), data.max(), 100) # 计算均匀分布的概率密度 pdf = uniform.pdf(x, loc=loc, scale=scale) # 缩放pdf以匹配直方图的频数高度 pdf_scaled = pdf * len(data) * (x[1] - x[0]) # 绘制均匀分布曲线 ax.plot(x, pdf_scaled, color='red', linestyle='--', label='Uniform Fit') ax.legend() plt.show()
方法2:直接替换默认对角绘图逻辑
如果你想跳过直方图,直接用自定义的均匀分布曲线替代默认的KDE,可以把自定义函数传给pairplot的diag_func参数。
示例代码片段
def plot_uniform_diag(x, **kwargs): # 拟合均匀分布参数 loc, scale = uniform.fit(x) x_vals = np.linspace(x.min(), x.max(), 100) pdf = uniform.pdf(x_vals, loc=loc, scale=scale) # 绘制均匀分布曲线 sns.lineplot(x=x_vals, y=pdf, **kwargs) # 可选:叠加密度直方图 sns.histplot(x=x, kde=False, stat='density', alpha=0.5, **kwargs) # 使用自定义函数绘制pairplot sns_plot = sns.pairplot(df, hue='Label', diag_func=plot_uniform_diag) plt.show()
关键说明
- 均匀分布的参数由
scipy.stats.uniform.fit()自动计算,无需手动指定范围。 - 方法1中对pdf的缩放很重要:直方图纵轴是频数,而均匀分布的pdf是概率密度,缩放后才能让曲线和直方图的高度匹配。
- 如果只需要展示均匀分布曲线,可删除代码中直方图相关的部分。
内容的提问来源于stack exchange,提问作者user6882757
相关产品推荐
相关产品推荐

