Matplotlib子图过于狭窄且布局紧凑

时间:2018-07-06 00:16:01

标签: python matplotlib subplot

我目前正在尝试使用GridSpec在Matplotlib(Python 3.6,Matplotlib 2.0.0)中绘制许多子图。这是最小的工作示例:

import matplotlib.pyplot as plt
from matplotlib.gridspec import *

# Color vector for scatter plot points
preds = np.random.randint(2, size=100000)

# Setup the scatter plots
fig = plt.figure(figsize=(8,8))
grid = GridSpec(9, 9)

# Create the scatter plots
for ii in np.arange(0, 9):
    for jj in np.arange(0, 9):
        if (ii > jj):
            ax = fig.add_subplot(grid[ii, jj])
            x = np.random.rand(100000)*2000
            y = np.random.rand(100000)*2000
            ax.scatter(x, y, c=preds)

这是未经任何修改的结果:

enter image description here

当然,子图之间的间隔不能令人满意,所以我做了我通常做的事情并使用了tight_layout()。但是,如下图所示,tight_layout()挤压图的宽度不可接受:

Figure With Tight Layout

我认为应该使用tight_layout()手动调整子图,而不是使用subplots_adjust()。下面是带有subplots_adjust(hspace=1.0, wspace=1.0)的图形。

Figure With Manually Adjusted Subplots

结果几乎是正确的,只需稍微调整一下子图之间的空间即可。但是,子图显得太小,无法充分传达信息。

在保持纵横比和足够大的子图尺寸的同时,是否有更好的方法在子图之间保持适当的间距?我唯一能想到的解决方案是将subplots_adjust()与较大的figsize一起使用,但这会导致图形的边缘与子图之间的空间很大。

任何解决方案都值得赞赏。

1 个答案:

答案 0 :(得分:1)

由于所有轴都具有相同的xy范围,因此我选择仅在外部Axes上显示刻度标签。对于大小相等的子图的网格,可以使用sharex的{​​{1}}和sharey关键字轻松实现。当然,如果您设置9x9子图的网格,将为您提供比您想要的更多的图,但是您可以使冗余图不可见(例如,使用plt.subplots()或将其全部删除。在下面的示例中,我和后者一起去。

Axes.set_visible

结果图形如下:

result of the above code

当然可以使用from matplotlib import pyplot as plt import numpy as np fig, axes = plt.subplots( nrows=9, ncols=9, sharex=True, sharey=True, figsize = (8,8) ) # Color vector for scatter plot points preds = np.random.randint(2, size=1000) # Create the scatter plots for ii in np.arange(0, 9): for jj in np.arange(0, 9): if (ii > jj): ax = axes[ii,jj] x = np.random.rand(1000)*100 y = np.random.rand(1000)*2000 ax.scatter(x, y, c=preds) else: axes[ii,jj].remove() ##remove Axes from fig axes[ii,jj] = None ##make sure that there are no 'dangling' references. plt.show() 之类的方法进一步调整。希望这会有所帮助。