【问题标题】:Displaying 3 histograms on 1 axis in a legible way - matplotlib以清晰的方式在 1 个轴上显示 3 个直方图 - matplotlib
【发布时间】:2012-02-29 10:37:56
【问题描述】:

我已经生成了 3 组数据,它们以 numpy 数组的形式组织。我有兴趣将这三组数据的概率分布绘制为标准化直方图。所有三个分布应该看起来几乎相同,因此为了便于比较,将所有三个分布在同一轴上似乎是明智的。

默认情况下,matplotlib 直方图被绘制为条形,这使得我想要的图像看起来非常混乱。因此,我的问题是是否可以强制 pyplot.hist 仅绘制一个框/圆/三角形,其中条形的顶部将采用默认形式,这样我就可以在同一张图上清晰地显示所有三个分布,或者我是否可以必须计算直方图数据,然后将其单独绘制为散点图。

提前致谢。

【问题讨论】:

  • 由于数据可能会多次交叉,因此为您最终使用的任何方法设置一个alpha 参数(透明度)可能是有意义的。

标签: python matplotlib


【解决方案1】:

有两种方法可以同时绘制三个直方图,但这两种方法都不是您所要求的。要按照您的要求进行操作,您必须计算直方图,例如通过使用numpy.histogram,然后使用plot 方法进行绘图。仅当您想通过设置每个点的大小将其他信息与您的点相关联时,才使用scatter

使用hist 的第一种替代方法是将所有三个数据集同时传递给hist 方法。 hist 方法然后调整每个条的宽度和位置,以便清楚地显示所有三个集合。

第二种选择是使用histtype='step' 选项,它可以为每组绘制清晰的图。

这是一个演示这个的脚本:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(101)
a = np.random.normal(size=1000)
b = np.random.normal(size=1000)
c = np.random.normal(size=1000)

common_params = dict(bins=20, 
                     range=(-5, 5), 
                     normed=True)

plt.subplots_adjust(hspace=.4)
plt.subplot(311)
plt.title('Default')
plt.hist(a, **common_params)
plt.hist(b, **common_params)
plt.hist(c, **common_params)
plt.subplot(312)
plt.title('Skinny shift - 3 at a time')
plt.hist((a, b, c), **common_params)
plt.subplot(313)
common_params['histtype'] = 'step'
plt.title('With steps')
plt.hist(a, **common_params)
plt.hist(b, **common_params)
plt.hist(c, **common_params)

plt.savefig('3hist.png')
plt.show()

这是结果图:

请记住,您也可以使用面向对象的接口来完成所有这些操作,例如制作单独的子图等。

【讨论】:

  • 非常感谢。我最终按照您的建议发现了 numpy.histogram 并且它完美地完成了工作!非常感谢您的帮助。
猜你喜欢
  • 2017-01-09
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2016-08-29
  • 2019-02-20
相关资源
最近更新 更多