用熊猫绘制多个重叠的直方图

Ser*_*z53 3 python matplotlib pandas

我有两个不同的数据框,每个数据框有 19 个变量,我正在用每个变量的直方图绘制一个多重图,如下所示:

fig, ax = plt.subplots(figsize=(19,10), dpi=50)
dataframe1.hist(ax=ax, layout=(3,7), alpha=0.5)

fig, ax = plt.subplots(figsize=(19,10), dpi=50)
dataframe2.hist(ax=ax, layout=(3,7), alpha=0.5)
Run Code Online (Sandbox Code Playgroud)

这会产生两个内部有 19 个直方图的图像。我想尝试的是在同一个子图中仅绘制一个具有共享直方图的图像。

我试过这个:

fig, ax = plt.subplots(figsize=(19,10), dpi=50)
dataframe1.hist(ax=ax, layout=(3,7), alpha=0.5, label='x')
dataframe2.hist(ax=ax, layout=(3,7), alpha=0.5, label='y', color='red')
Run Code Online (Sandbox Code Playgroud)

但它只画了最后一张。这是一个类似的例子:使用 matplotlib同时绘制两个直方图,但我如何将它应用于我的 19 个子图?

任何想法都会受到欢迎,提前致谢!

在此处输入图片说明

PS:我目前正在使用带有%matplotlib notebook选项的Jupyter Notebooks

Tho*_*ühn 8

您的问题是您Axesplt.subplots调用中只创建了一个对象,而实际上您需要 21 (3x7)。由于提供的子图数量与请求的子图数量不匹配,pandas 会创建新的子图。因为这种情况发生了两次,所以您只能看到第二组直方图。

您可以subplots完全不调用 to并让 Pandas 完成所有工作。调用hist返回所有需要的子图,然后可以在第二次调用中使用hist

编辑

我意识到,如果所需图的数量实际上不等于网格单元的数量(在本例中为 3x9=21),则您必须准确传递您实际想要绘制的子图的数量(在本例中为 19) . 然而,调用df.hist为每个网格单元(即 21)返回一个子图,显然隐藏了未使用的。因此,您只需将所有返回的子图的一个子集传递给第二次调用hist. 最简单的方法是将子图的二维数组转换为一维数组,然后对该数组进行切片,例如使用 `axes.ravel()[:19]。我相应地编辑了代码:

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd

length=19

loc = np.random.randint(0,50,size=length)
scale = np.random.rand(length)*10
dist = np.random.normal(loc=loc, scale=scale, size=(100,length))
df1 = pd.DataFrame(data=list(dist))


axes = df1.hist(layout=(3,7), alpha=0.5, label='x')

loc = np.random.randint(0,50,size=length)
scale = np.random.rand(length)*10
dist = np.random.normal(loc=loc, scale=scale, size=(100,length))
df2 = pd.DataFrame(data=list(dist))

df2.hist(ax=axes.ravel()[:length], layout=(3,7), alpha=0.5, label='x',color='r')

plt.show()
Run Code Online (Sandbox Code Playgroud)

这会产生如下输出:

上面代码的结果