我正在使用Matplotlib并努力在我正在绘制的包含子图网格的图形周围获得正确数量的空白。
要求:能够选择所有子图的纵横比(它们都是相同的),准确定义子图与(已保存)图边的顶部,底部和左侧之间有多少空白。我右边不需要任何额外的空间。
到目前为止,我的代码包含以下内容:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(ncols=6, nrows=2, sharex=True,
sharey=True, figsize=(16,8))
axes[0,0].plot(x,y)
etc...
plt.subplots_adjust(hspace=1.0, wspace=0.02, bottom=0.17, left=0.075, top=0.18)
plt.savefig('Fig1_matplot.pdf', bbox_inches='tight')
实际上,如果我没有指定figsize=()
,则子图的宽高比是错误的。如果我这样做,那么只要我更改subplots_adjust()
中的参数,宽高比就会改变。显然是left cannot be >= right
和bottom cannot be >= top
。如果我将top定义为除0以外的任何值,它会将所有子图完全压缩到图底部的一条线。
如果我指定bbox_inches='tight'
那么它会在底部和左侧切断我定义的空格,但是如果我没有指定它,那么我在右边留下了多余的空格,因为我无法摆脱它(右边是< =左)。
我有点卡住,任何帮助都会非常感激。
干杯。
答案 0 :(得分:15)
使用subplots_adjust
时,left
,right
,bottom
和top
的值将作为图形宽度和高度的分数提供。此外,所有值都是从图的左边和底边测量的。这就是right
和top
不能低于left
和bottom
的原因。典型的设置是:
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)
另一方面,如果要以英寸为单位提供空白作为绝对值,则必须除以图形的宽度和高度。例如,在您的情况下,可以通过以下方式实现所有边缘周围1英寸的边距:
plt.subplots_adjust(left=1/16.0, right=1-1/16.0, bottom=1/8.0, top=1-1/8.0)
为了更多功能,我通常将图形的宽度和高度参数化为:
figw, figh = 16.0, 8.0
fig, axes = plt.subplots(ncols=6, nrows=2, sharex=True, sharey=True,
figsize=(figw, figh))
plt.subplots_adjust(left=1/figw, right=1-1/figw, bottom=1/figh, top=1-1/figh)
hspace
和wspace
被计为一个面板的轴宽度和高度的分数,因此它们的绝对值取决于图形尺寸,外边距和子图数量,这将需要更多的数学进行微调。