我有两个不同的数据格式,每个变量都有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)
这会产生两幅图像,里面有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')
但这是最后一幅画。这是一个类似的例子:Plot two histograms at the same time with matplotlib,但我如何应用它,我的19个子图呢?
任何想法都会受到欢迎,谢谢!
P.S:我现在使用的是木星笔记本和%matplotlib笔记本选项
发布于 2019-03-28 04:16:00
您的问题是在实际需要21 (3x7)时,在Axes
调用中只创建一个plt.subplots
对象。由于所提供的子地块数量与所要求的子地块数量不匹配,熊猫会创建新的子地块。因为这种情况发生了两次,所以只能看到第二组直方图。
你可以完全不给subplots
打电话,让熊猫来做所有的工作。对hist
的调用返回所需的所有子图,然后可以在对hist
的第二次调用中使用它。
编辑
我意识到,如果所需地块的数量实际上并不等于网格单元格的数量(在本例中为3x9=21),则必须准确地传递实际要在其上绘制的子图的数量(在本例中为19)。但是,对df.hist
的调用返回每个网格单元(即21)的子图,并显然隐藏未使用的单元格。因此,您只需要将所有返回子图的一个子集传递给对hist
的第二个调用。这是最简单的方法,方法是将2d子图数组转换为一维数组,然后切片这个数组,例如使用`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()
这样产生的输出如下:
发布于 2019-03-28 06:36:42
调用subplots
时,可以指定所需的行数和列数。在您的例子中,您需要3行7列。然而,.plot
会对有21个轴,但只有19个从你的数据文件绘制。因此,我们将轴压平成一个列表并转换为一个列表,这将允许我们通过.pop()
同时从图形和轴集中删除最后两个轴。
fig, axes = plt.subplots(figsize=(19,10), dpi=50, nrows=3, ncols=7)
flat_axes = list(axes.reshape(-1))
fig.delaxes(flat_axes.pop(-1))
fig.delaxes(flat_axes.pop(-1))
dataframe1.hist(ax=flat_axes, alpha=0.5, label='x')
dataframe2.hist(ax=flat_axes, alpha=0.5, label='x',color='r')
https://stackoverflow.com/questions/55396416
复制相似问题