You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为PySpark样本分布绘制钟形曲线并叠加到matplotlib直方图上

问题解答

1. 是否需要对数据做变换处理

分两种场景判断:

  • 若你只是要叠加正态分布参考钟形线,用来对比当前数据分布和正态分布的差异,无需做任何变换,直接基于原始数据的均值、标准差生成正态曲线即可,无论原始数据是否符合正态分布都可以绘制这条参考线。
  • 若你需要让处理后的数据本身满足正态分布再做后续分析,则需要根据数据的偏态特征选择对应变换方式,比如右偏数据可使用对数变换、Box-Cox变换等。

2. 直方图叠加钟形曲线的实现方案

在原有代码基础上新增正态分布拟合逻辑即可,需注意对齐直方图的Y轴刻度,完整可运行代码如下:

from pyspark.sql import DataFrame
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

dfPy = sqlContext.table("df")
# 避免用pd作为变量名,防止和pandas库命名冲突
pd_df = dfPy.toPandas()

# 绘制原始直方图,接收返回的坐标轴对象
ax = pd_df[['col4']].plot(
    kind='hist',
    bins=[0,10,20,30,40,50,60,70,80,90,100],
    rwidth=0.8
)

# 拟合原始数据的均值和标准差
mu, sigma = norm.fit(pd_df['col4'])

# 生成钟形曲线的X轴连续取值
x = np.linspace(pd_df['col4'].min(), pd_df['col4'].max(), 100)
# 计算正态分布概率密度,乘以总样本量和组距(此处bins间隔为10)对齐直方图计数刻度
y = norm.pdf(x, mu, sigma) * len(pd_df['col4']) * 10

# 叠加绘制钟形曲线
ax.plot(x, y, 'r-', linewidth=2, label=f'正态拟合曲线:均值={mu:.2f}, 标准差={sigma:.2f}')
ax.legend()

plt.show()

如果希望绘制密度模式的直方图,只需将plot方法的density参数设为True,同时计算y时去掉* len(pd_df['col4']) * 10的部分即可,此时Y轴为密度值。

内容的提问来源于stack exchange,提问作者joesan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:02