【问题标题】:Plotting histograms in Python using Matplotlib or Pandas使用 Matplotlib 或 Pandas 在 Python 中绘制直方图
【发布时间】:2020-10-25 06:57:37
【问题描述】:

我已经从这个论坛上的不同帖子中走了出来,但我找不到我所看到的行为的答案。

我有一个 csv 文件,其标题有许多条目,每个条目 300 点。 对于每个字段(csv 文件的列),我想绘制一个直方图。 x 轴包含该列上的元素,y 轴应包含每个 bin 内的样本数。 因为我有 300 个点,所以加在一起的所有 bin 中的样本总数应该是 300,所以 y 轴应该从 0 变为 50(只是一个例子)。但是,这些值是巨大的(400e8),这是没有意义的。

表格样本 点我的数据

1 | 250.23e-9 2 | 250.123e-9 ... | ... 300 | 251.34e-9

请检查我的代码,如下。我正在使用 pandas 打开其余的 csv 和 Matplotlib。

df=pd.read_csv("/home/pcardoso/raw_data/myData.csv") # 图参数 figPath='/home/pcardoso/scripts/python/matplotlib/figures/' figPrefix='hist_' # 文件名的前缀。 figSuffix='_something' # 文件名的后缀。 figString='' # 完整字符串作为要保存的图形名称传递 精度=3 num_bins = 50 列=列表(df) 对于列中的字段名称: 矢量数据=df[字段名] # 统计数据 mu = np.mean(vectorData) # 分布均值 sigma = np.std(vectorData) # 分布的标准差 # 创建绘图实例 无花果,斧头 = plt.subplots() # 直方图 n, 箱, 补丁 = ax.hist(vectorData, num_bins, 密度='True',alpha=0.75,rwidth=0.9, label=fieldName) 斧头传奇() # 最佳拟合曲线 y=mlab.normpdf(bins, mu, sigma) ax.plot(bins, y, '--') # 设置坐标轴名称、网格和标题 ax.set_xlabel(fieldName) ax.set_ylabel('点数') ax.set_title(fieldName + ': $\mu=$' + eng_notation(mu,precision) + ', $\sigma=$' + eng_notation(sigma,precision)) ax.grid(真,alpha=0.2) fig.tight_layout() # 调整间距以防止 ylabel 被剪裁 # 保存图 figString=figPrefix + fieldName +figSuffix fig.savefig(figPath + figString) plt.show() plt.close(图)

总之,我想知道如何正确设置 y 轴值。

编辑:2020 年 7 月 6 日

编辑 2020 年 6 月 8 日 我希望密度估计器遵循这样的情节:

提前致谢。 最好的祝福, 佩德罗

【问题讨论】:

标签: python pandas matplotlib histogram


【解决方案1】:

不要使用density='True',与该选项一样,显示的值是bin 中的成员除以bin 的宽度。如果该宽度很小(例如您的 x-values 相当小,则值会变大。

编辑: 好的,要取消规范化的曲线,您需要将其与点数和一个 bin 的宽度相乘。我做了一个更简化的例子:

from numpy.random import normal
from scipy.stats import norm
import pylab

N = 300
sigma = 10.0
B = 30

def main():
    x = normal(0, sigma, N)

    h, bins, _ = pylab.hist(x, bins=B, rwidth=0.8)
    bin_width = bins[1] - bins[0]

    h_n = norm.pdf(bins[:-1], 0, sigma) * N * bin_width
    pylab.plot(bins[:-1], h_n)

if __name__ == "__main__":
    main()

【讨论】:

  • 感谢您的回答,去除密度解决了问题。奇怪的是,将密度设置为 'False' 没有任何作用。但是现在,我如何在直方图上绘制密度曲线。按照我在代码中的方式,它将使用相同的巨大规模。如何强制直方图和密度图使用相同的比例?
  • 哈哈,这本身就是一个错误:density='True' 巧合,因为字符串 'True' 不为空,并且转换为 Trueboolean,但 'False'density='Bazinga'。试试density=False。好吧,密度是根据定义的,因此直方图下方的表面是一。使密度达到相似比例的唯一方法是将x-轴标准化,即将所有x-值除以间隔max(x) - min(x)
  • 嗨,我想我期待的是一个包络线,而不是密度图。
  • 现在我编辑了关于如何取消标准化标准化曲线的答案。
  • 即使您有任何其他分布,缩放方法也保持不变。但是,如果您将自己的大象与数据相匹配,则根本不需要进行标准化。您可以将任何曲线拟合到直方图数据bins[:-1] -> h 并将其绘制为任何其他函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2016-06-09
  • 2015-10-25
相关资源
最近更新 更多