Matplotlib:图的左边缘和y轴之间的固定间距

时间:2015-08-10 20:06:59

标签: python python-2.7 matplotlib plot

我使用Python 2.7在Matplotlib中生成了2个图。这些图保存为* .png文件。保存后,两个图像的分辨率相同 - 宽度= 1099像素,高度= 619像素。

但是,当我垂直对齐保存的* .png图像(附加,下方)时,图像的y轴和最左边点之间的间距不同 - 请参阅 a 以及下图中的 b enter image description here

我的意思是,从图像左边到y轴的距离不一样(a不等于b)。

点击图片放大并查看。

问题: 有没有办法强制y轴从相对于图像左侧的特定位置开始

注意: 我不关心刻度标签和轴标签之间的空间 - 我可以使用像ax.yaxis.labelpad(25)这样的东西来调整它。但是,我不知道如何修复图像左侧和y轴之间的空间。

注2: 我使用:

创建我的情节
fig = plt.figure(1)
ax = fig.add_subplot(111)
fig.tight_layout()

2 个答案:

答案 0 :(得分:3)

我认为您可以在创建轴(add_axes到图形对象)时设置此属性(图形和轴的边缘之间的空间)。下面是一些简单的示例代码,它生成两个轴,并且所有边都有宽大的间距:

import matplotlib.pyplot as plt

f1 = plt.figure()
ax1 = f1.add_axes([0.2, 0.2, 0.6, 0.6]) # List is [left, bottom, width, height]
ax1.axis([0, 1, 0, 1])
plt.savefig('ax1.png')

f2 = plt.figure()
ax2 = f2.add_axes([0.2, 0.2, 0.6, 0.6])
ax2.axis([0, 1000, 0, 1000])
plt.savefig('ax2.png')

您可以在此处找到有关它的更多信息:
http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.add_axes

编辑: 您可以使用subplots_adjust获得类似的结果。使用您的示例代码:

fig = plt.figure(1)
ax = fig.add_subplot(111)
fig.tight_layout()
plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8)

答案 1 :(得分:1)

如果我想在matplotlib中精确控制数字边距的大小,这就是我通常设置代码的方法。另外,我展示了如何设置ylabel的位置,这样你就可以轻松地将两个数字的ylabels对齐。

import matplotlib.pyplot as plt

plt.close('all')

#---- create figure ----

fwidth = 8.  # total width of the figure in inches
fheight = 4. # total height of the figure in inches

fig = plt.figure(figsize=(fwidth, fheight))

#---- define margins -> size in inches / figure dimension ----

left_margin  = 0.95 / fwidth
right_margin = 0.2 / fwidth
bottom_margin = 0.5 / fheight
top_margin = 0.25 / fheight

#---- create axes ----

# dimensions are calculated relative to the figure size

x = left_margin    # horiz. position of bottom-left corner
y = bottom_margin  # vert. position of bottom-left corner
w = 1 - (left_margin + right_margin) # width of axes
h = 1 - (bottom_margin + top_margin) # height of axes

ax = fig.add_axes([x, y, w, h])

#---- Define the Ylabel position ----

# Location are defined in dimension relative to the figure size  

xloc =  0.25 / fwidth 
yloc =  y + h / 2.  

ax.set_ylabel('yLabel', fontsize=16, verticalalignment='top',
              horizontalalignment='center')             
ax.yaxis.set_label_coords(xloc, yloc, transform = fig.transFigure)

plt.show(block=False)
fig.savefig('figure_margins.png')

这导致8英寸x 4英寸的数字,图的左侧,右侧,底部和顶部的边距正好为0.95,0.2,0.5和0.25英寸。这种方法的一个好处是边距的大小以绝对单位(英寸)定义,这意味着即使您更改图形的大小,它们也将保持一致。

对于ylabel,水平地,标签的顶部位于距图的左边缘0.25英寸处,而标签的中心垂直地对应于轴的中心。请注意,由于ylabel上的90度旋转,verticalalignmenthorizontalalignment的含义实际上是反转的。

下面显示了上述代码的输出,y轴限制分别设置为[0,1]和[0,18]。

enter image description here enter image description here