1 回答
TA贡献1796条经验 获得超4个赞
我找到了一个解决方案,可以创建一个 A4 形状的图形,当另存为 A4 PDF 页面时,它会占据整个页面(不是 100% 正确,有一个很小的利润,但它可以达到目的)。
它只需要添加gs.tight_layout(fig, pad=0). 我不完全明白为什么,但我怀疑当我试图消除figure对象的填充(使用plt.savefig(..., bbox_inches='tight', pad_inches=0)or fig.tight_layout(...))时,图形可能会到达 A4 页面的边框,但GridSpec不会,所以我看到的填充是在 theGridSpec和 the的边界之间figure,而不是在纸的边界之间。当之间的填充GridSpec,并figure设置为0,且figure具有A4尺寸,事情似乎工作,因为我想要的。
(我仍然不明白为什么在某些情况下 PDF 文件的页面会缩小,但我将把它留在这里)。
这是我想要的代码,如果您创建 PDF 文件,打开并检查属性,大小为 A4,矩形靠近边框。对于其他选项,要么有宽边距,要么有更小的页面尺寸。
import matplotlib.pyplot as plt
from matplotlib import gridspec
def plot_form_page():
# A4 canvas
fig_width_cm = 21 # A4 page
fig_height_cm = 29.7
inches_per_cm = 1 / 2.54 # Convert cm to inches
fig_width = fig_width_cm * inches_per_cm # width in inches
fig_height = fig_height_cm * inches_per_cm # height in inches
fig_size = [fig_width, fig_height]
plt.rc('text', usetex=False) # so that LaTeX is not needed when creating a PDF with PdfPages later on
fig = plt.figure()
fig.set_size_inches(fig_size)
fig.set_facecolor('#9999ff')
gs = gridspec.GridSpec(29, 21, wspace=0.1, hspace=0.1)
# external axis
ax0 = fig.add_subplot(gs[:, :])
# for side in ["top", "bottom", "left", "right"]:
# ax0.spines[side].set_visible(False)
# header
ax1 = fig.add_subplot(gs[1:4, 1:4])
ax1.set_facecolor('#bbffbb')
ax2 = fig.add_subplot(gs[1:4, 4:-6])
ax2.set_facecolor('#ffbbff')
ax3 = fig.add_subplot(gs[1:4, -6:-1])
ax3.set_facecolor('#00bbff')
# form
ax4, ax5, ax6, ax7 = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 1:10]) for i in range(4)]
[ax8, ax9, ax10, ax11] = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 11:20]) for i in range(4)]
axes = [ax4, ax8, ax5, ax9, ax6, ax10, ax7, ax11]
for ax in axes:
ax.set_facecolor('#bbbbbb')
for ax in fig.axes:
ax.set_xticks([])
ax.set_yticks([])
#print(fig.properties()['figwidth'], fig.properties()['figheight'])
gs.tight_layout(fig, pad=0)
plot_form_page()
plt.savefig('page.pdf',
dpi=300,
orientation='portrait')
添加回答
举报