如何用Python读取Excel表格绘制直方图验证中心极限定理?
代码问题分析
你当前的代码存在两个核心问题:
- 直接向
plt.hist()传入DataFrame对象时,matplotlib会按列拆分数据,为每一列单独生成一个直方图序列,最终输出的是多组堆叠/并列的柱状图,无法呈现所有数据的整体分布,不符合验证中心极限定理的统计要求。 - 所有直方图直接绘制在同一块画布上,互相重叠无法区分,既看不到原始指数分布的形态,也无法对比样本均值分布的正态近似效果。
是否需要格式化为单列?
需要。你的两份原始Excel数据是多列存储的指数分布随机数,要验证中心极限定理,首先需要把所有原始值、所有样本均值分别合并为一维的单列序列,才能绘制对应整体分布的直方图。
最高效的处理方式
直接调用pandas DataFrame的values.flatten()方法,无需循环即可将整个表的所有数值快速展平为一维numpy数组,时间复杂度为O(n),是目前效率最高的实现方式。
修正后的参考代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 导入数据 df1 = pd.read_excel(r'C:\Users\Henry\Desktop\n10.xlsx') df2 = pd.read_excel(r'C:\Users\Henry\Desktop\n30.xlsx') df1avg = pd.read_excel(r'C:\Users\Henry\Desktop\n10avg.xlsx') df2avg = pd.read_excel(r'C:\Users\Henry\Desktop\n30avg.xlsx') # 展平为一维数组 data_n10 = df1.values.flatten() avg_n10 = df1avg.values.flatten() data_n30 = df2.values.flatten() avg_n30 = df2avg.values.flatten() # 分四子图绘制,方便对比 plt.rcParams['font.sans-serif'] = ['SimHei'] # 不需要中文显示可删除该行 fig, axes = plt.subplots(2,2, figsize=(12,8)) # 子图1:n=10原始指数分布 axes[0,0].hist(data_n10, bins=34) axes[0,0].set_title('n=10原始指数分布') # 子图2:n=10样本均值分布 axes[0,1].hist(avg_n10, bins=11) axes[0,1].set_title('n=10样本均值分布') # 子图3:n=30原始指数分布 axes[1,0].hist(data_n30, bins=63) axes[1,0].set_title('n=30原始指数分布') # 子图4:n=30样本均值分布 axes[1,1].hist(avg_n30, bins=11) axes[1,1].set_title('n=30样本均值分布') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

