我目前正在尝试使用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)
这是未经任何修改的结果:
当然,子图之间的间隔不能令人满意,所以我做了我通常做的事情并使用了tight_layout()
。但是,如下图所示,tight_layout()
挤压图的宽度不可接受:
我认为应该使用tight_layout()
手动调整子图,而不是使用subplots_adjust()
。下面是带有subplots_adjust(hspace=1.0, wspace=1.0)
的图形。
结果几乎是正确的,只需稍微调整一下子图之间的空间即可。但是,子图显得太小,无法充分传达信息。
在保持纵横比和足够大的子图尺寸的同时,是否有更好的方法在子图之间保持适当的间距?我唯一能想到的解决方案是将subplots_adjust()
与较大的figsize
一起使用,但这会导致图形的边缘与子图之间的空间很大。
任何解决方案都值得赞赏。
答案 0 :(得分:1)
由于所有轴都具有相同的x
和y
范围,因此我选择仅在外部Axes
上显示刻度标签。对于大小相等的子图的网格,可以使用sharex
的{{1}}和sharey
关键字轻松实现。当然,如果您设置9x9子图的网格,将为您提供比您想要的更多的图,但是您可以使冗余图不可见(例如,使用plt.subplots()
或将其全部删除。在下面的示例中,我和后者一起去。
Axes.set_visible
结果图形如下:
当然可以使用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()
之类的方法进一步调整。希望这会有所帮助。