#sets up the axis and gets histogram data
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.hist([y1, y2], color=colors)
n, bins, patches = ax1.hist([y1,y2])
ax1.cla() #clear the axis
#plots the histogram data
width = (bins[1] - bins[0]) * 0.4
bins_shifted = bins + width
ax1.bar(bins[:-1], n[0], width, align='edge', color=colors[0])
ax2.bar(bins_shifted[:-1], n[1], width, align='edge', color=colors[1])
#finishes the plot
ax1.set_ylabel("Count", color=colors[0])
ax2.set_ylabel("Count", color=colors[1])
ax1.tick_params('y', colors=colors[0])
ax2.tick_params('y', colors=colors[1])
plt.tight_layout()
plt.show()
97
万一你有熊猫( import pandas as pd )或可以使用它:
test = pd.DataFrame([[random.gauss(3,1) for _ in range(400)],
[random.gauss(4,2) for _ in range(400)]])
plt.hist(test.values.T)
plt.show()
302
您应该使用 hist 返回的值中的 bins :
import numpy as np
import matplotlib.pyplot as plt
foo = np.random.normal(loc=1, size=100) # a normal distribution
bar = np.random.normal(loc=-1, size=10000) # a normal distribution
_, bins, _ = plt.hist(foo, bins=50, range=[-6, 6], normed=True)
_ = plt.hist(bar, bins=bins, alpha=0.5, normed=True)
2
下面是一种简单的方法,当数据具有不同的大小时,在同一个图上绘制两个直方图并排其条形图:
def plotHistogram(p, o):
"""
p and o are iterables with the values you want to
plot the histogram of
"""
plt.hist([p, o], color=['g','r'], alpha=0.8, bins=50)
plt.show()
import random
import numpy
from matplotlib import pyplot
x = [random.gauss(3,1) for _ in range(400)]
y = [random.gauss(4,2) for _ in range(400)]
bins = numpy.linspace(-10, 10, 100)
pyplot.hist(x, bins, alpha=0.5, label='x')
pyplot.hist(y, bins, alpha=0.5, label='y')
pyplot.legend(loc='upper right')
pyplot.show()
8 回答
接受的答案给出了具有重叠条形的直方图的代码,但是如果您希望每个条形并排(就像我一样),请尝试以下变体:
参考:http://matplotlib.org/examples/statistics/histogram_demo_multihist.html
编辑[2018/03/16]:更新以允许绘制不同大小的数组,如@stochastic_zeitgeist所示
如果您的样本量不同,则可能难以将分布与单个y轴进行比较 . 例如:
在这种情况下,您可以在不同的轴上绘制两个数据集 . 为此,您可以使用matplotlib获取直方图数据,清除轴,然后在两个不同的轴上重新绘制它(移动bin边缘以使它们不重叠):
万一你有熊猫(
import pandas as pd
)或可以使用它:您应该使用
hist
返回的值中的bins
:下面是一种简单的方法,当数据具有不同的大小时,在同一个图上绘制两个直方图并排其条形图:
作为完成Gustavo Bezerra's answer:
如果你想 each histogram to be normalized (
normed
表示mpl <= 2.1而density
表示mpl> = 3.1)你不能只使用normed/density=True
,你需要为每个值设置权重:作为比较,具有默认权重和
density=True
的完全相同的x
和y
向量:听起来你可能只想要一个条形图:
http://matplotlib.sourceforge.net/examples/pylab_examples/bar_stacked.html
http://matplotlib.sourceforge.net/examples/pylab_examples/barchart_demo.html
或者,您可以使用子图 .
这里有一个有效的例子: