Matplotlib 图1紧_布局(),但图仍重叠

Matplotlib 图1紧_布局(),但图仍重叠,matplotlib,jupyter,Matplotlib,Jupyter,想象一下,我有一些葡萄酒数据集,我找到了前5个葡萄酒生产国: # Find top 5 wine producing countries. top_countries = wines_df.groupby('country').size().reset_index(name='n').sort_values('n', ascending=False)[:5]['country'].tolist() 现在我有了这些值,我尝试在10个图中绘制结果,5行2列 fig = plt.figure(fig

想象一下,我有一些葡萄酒数据集,我找到了前5个葡萄酒生产国:

# Find top 5 wine producing countries.
top_countries = wines_df.groupby('country').size().reset_index(name='n').sort_values('n', ascending=False)[:5]['country'].tolist()
现在我有了这些值,我尝试在10个图中绘制结果,5行2列

fig = plt.figure(figsize=(16, 15))
fig.tight_layout()
i = 0
for c in top_countries:
    c_df = wines_df[wines_df.country == c]
    i +=1
    ax1 = fig.add_subplot(5,2,i)
    i +=1
    ax2 = fig.add_subplot(5,2,i)
    sns.kdeplot(c_df['points'], ax=ax1)
    ax1.set_title("POINTS OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
    sns.boxplot(c_df['price'], ax=ax2)
    ax2.set_title("PRICE OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
plt.show()
即使有这个结果,我仍然有我的子地块重叠


我做错什么了吗?使用
python3.6
matplotlib==2.2.2
正如Thomas Kühn所说,在进行绘图后,必须移动
紧密布局()
,如:

fig = plt.figure(figsize=(16, 15))
i = 0
for c in top_countries:
    c_df = wines_df[wines_df.country == c]
    i +=1
    ax1 = fig.add_subplot(5,2,i)
    i +=1
    ax2 = fig.add_subplot(5,2,i)
    sns.kdeplot(c_df['points'], ax=ax1)
    ax1.set_title("POINTS OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
    sns.boxplot(c_df['price'], ax=ax2)
    ax2.set_title("PRICE OF ALL WINES IN %s, n=%d" % (c.upper(), c_df.shape[0]), fontsize=16)
fig.tight_layout()
plt.show()
如果仍然重叠(在某些情况下可能会发生这种情况),则可以使用以下选项指定填充:

fig.tight_layout(pad=0., w_pad=0.3, h_pad=1.0)
其中,
pad
是一般填充,
w\u-pad
是水平填充,
h\u-pad
是垂直填充。只要尝试一些值,直到您的绘图看起来很好
(pad=0,w_-pad=0.3,h_-pad=0.3)
是一个很好的开始,如果您想让绘图尽可能紧凑

另一种可能是在图中指定
constrated\u layout=True

fig = plt.figure(figsize=(16, 15), constrained_layout=True)
现在您可以删除线
fig.tight_layout()


编辑:
我还发现了一件事:
您似乎在指定您的
figsize
,以便将其安装在标准DIN A4纸张上,尺寸为厘米(典型文本宽度:16cm)。但是matplotlib中的
figsize
以英寸为单位。因此,用
figsize=(16/2.54,15/2.54)
替换figsize可能更好


我知道matplotlib内部使用英寸作为单位是绝对令人困惑的,因为它主要是科学界和数据工程师使用matplotlib(这些通常使用SI单位)。正如芬格内斯特所指出的,关于如何实现除英寸以外的其他单位,还有一些讨论正在进行。

尝试在完成所有绘图后,即在
plt.show()
之前,将
紧密布局()移动到,它只会导致许多需要深思熟虑的问题,以至于直到现在还没有人能够形成一个清晰的概念。最新的讨论非常重要。好的,很抱歉我的误解。我还想说清楚,我真的很喜欢matplotlib,我更喜欢它,而不是所有其他模块。所以,一旦你习惯了,这只是一个小小的缺点。此外,我了解到,在许多情况下,这是处理打印机、显示器等DPI最直接的方法。谢谢。另外,我在jupyter笔记本上做这个,所以不需要打印。但这是一个需要注意的好注意事项