我使用Python 2.7在Matplotlib中生成了2个图。这些图保存为* .png文件。保存后,两个图像的分辨率相同 - 宽度= 1099像素,高度= 619像素。
但是,当我垂直对齐保存的* .png图像(附加,下方)时,图像的y轴和最左边点之间的间距不同 - 请参阅 a 以及下图中的 b 。
我的意思是,从图像左边到y轴的距离不一样(a不等于b)。
点击图片放大并查看。
问题: 有没有办法强制y轴从相对于图像左侧的特定位置开始?
注意:
我不关心刻度标签和轴标签之间的空间 - 我可以使用像ax.yaxis.labelpad(25)
这样的东西来调整它。但是,我不知道如何修复图像左侧和y轴之间的空间。
注2: 我使用:
创建我的情节fig = plt.figure(1)
ax = fig.add_subplot(111)
fig.tight_layout()
答案 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度旋转,verticalalignment
和horizontalalignment
的含义实际上是反转的。
下面显示了上述代码的输出,y轴限制分别设置为[0,1]和[0,18]。