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
您的问题是您Axes
在plt.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)
这会产生如下输出:
归档时间: |
|
查看次数: |
3669 次 |
最近记录: |