Pandas:在同一图中绘制两个直方图

8
我希望在同一个图表上显示2个直方图(使用不同的颜色和可能不同的透明度)。我尝试了:
import random
x = pd.DataFrame([random.gauss(3,1) for _ in range(400)])
y = pd.DataFrame([random.gauss(4,2) for _ in range(400)])


x.hist( alpha=0.5, label='x')
y.hist(alpha=0.5, label='y')
x.plot(kind='kde', style='k--')
y.plot(kind='kde', style='k--')

plt.legend(loc='upper right')
plt.show()

这会生成4个不同的图表结果。我该如何将它们放在同一张图表上?

2个回答

9
如果我理解正确,两个数据集应该在同一个子图中呈现。因此应该是:

如果我理解正确,两个数据集应该在同一个子图中呈现。所以应该是

fig = plt.figure()
ax = fig.add_subplot(111)
_ = ax.hist(x.values)
_ = ax.hist(y.values, color='red', alpha=.3)

你可以向 pandas 的 plot 方法传递一个轴对象,所以如果你想在另一个图中同时显示两个 kde,请执行以下操作:
fig = plt.figure()
ax = fig.add_subplot(111)
x.plot(kind='kde', ax=ax)
y.plot(kind='kde', ax=ax, color='red')

为了将所有内容放入单个图中,需要使用两个不同的y轴,因为kde是密度而histogram是频率。为此,您可以使用axes.twinx()命令。
fig = plt.figure()
ax = fig.add_subplot(111)
_ = ax.hist(x.values)
_ = ax.hist(y.values, color='red', alpha=.3)

ax1 = ax.twinx()
x.plot(kind='kde', ax=ax1)
y.plot(kind='kde', ax=ax1, color='red')

谢谢,这差不多可以了!现在我有了一个包含两个直方图的图像和另一个包含两个kde的图像。如何将它们合并到同一张图中?运行您的所有代码,但没有第二个 fig = ...,仍然会给我2个不同的图。 - meto
问题在于 KDE(密度)与直方图(频率)具有不同的刻度,因此您必须通过使用 ax.twinx() 引入第二个 y 刻度,就像这里一样:链接。我马上会更新我的答案。 - rustil
第一种解决方案的问题在于计数由箱子宽度确定。如果它们不同,则垂直轴是无法比较的。 - user48956
@rustil 这个解决方案还可行吗?我认为不行。 - Olu Adeyemo

1
您可以使用plt.figure()和add_subplot()函数:前两个参数是您在图中想要的行数和列数,最后一个参数是子图在图中的位置。
fig = plt.figure()
subplot = fig.add_subplot(1, 2, 1)
subplot.hist(x.ix[:,0], alpha=0.5)
subplot = fig.add_subplot(1, 2, 2)
subplot.hist(y.ix[:,0], alpha=0.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接