我想在一个尺寸中查看Spyders IPython控制台内的matplotlib图,并将数字保存为不同大小的多页PDF。
目前我将数字大小设置如下:
plt.rc('axes', grid=True)
plt.rc('figure', figsize=(12, 8))
plt.rc('legend', fancybox=True, framealpha=1)
然后我绘制一些数字并将它们保存到列表中以便稍后保存PDF。单独使用时效果很好。这些图的大小非常适合在Spyder IPython控制台中查看。
在我的脚本结束时,我有一个循环来浏览我想要保存的每个数字。在这里,我想准确设置布局和图形尺寸,以便在A3纸上更好地打印。
with PdfPages('multi.pdf') as pdf:
for fig in figs:
fig.tight_layout()
fig.set_size_inches(420/25.4, 297/25.4)
pdf.savefig(figure=fig)
输出PDF就像我想要的那样,但问题在于Spyder内部显示的情节。保存时更改图形尺寸也会影响Spyder内部查看的图形。使用A3的大小会使得情节太大。
所以问题是:如何更改保存的PDF数字的大小而不改变Spyder中显示的数字大小?
答案 0 :(得分:3)
正如@ImportanceOfBeingErnest所建议的那样,保存后更改数字大小应该有效,并且可能解决了你的问题。
但是,根据您的具体问题,您可能会面临扩展问题,因为pdf中保存的数字大小远大于IPython控制台中显示的大小。如果您在pdf上扩展所有内容以使其看起来很棒,那么在IPython中看起来一切都可能太大,如下例所示:
如果您不需要在IPython中使用交互式绘图,解决方案可能是生成您的数据以使其适合pdf并在IPython控制台中显示它们的缩放位图版本,如代码所示下面:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import numpy as np
from IPython.display import Image, display
try: # Python 2
from cStringIO import StringIO as BytesIO
except ImportError: # Python 3
from io import BytesIO
# Generate a matplotlib figures that looks good on A3 format :
fig, ax = plt.subplots()
ax.plot(np.random.rand(150), np.random.rand(150), 'o', color='0.35', ms=25,
alpha=0.85)
ax.set_ylabel('ylabel', fontsize=46, labelpad=25)
ax.set_xlabel('xlabel', fontsize=46, labelpad=25)
ax.tick_params(axis='both', which='major', labelsize=30, pad=15,
direction='out', top=False, right=False, width=3, length=10)
for loc in ax.spines:
ax.spines[loc].set_linewidth(3)
# Save figure to pdf in A3 format:
w, h = 420/25.4, 297/25.4
with PdfPages('multi.pdf') as pdf:
fig.set_size_inches(w, h)
fig.tight_layout()
pdf.savefig(figure=fig)
plt.close(fig)
# Display in Ipython a sclaled bitmap using a buffer to save the png :
buf = BytesIO()
fig.savefig(buf, format='png', dpi=90)
display(Image(data=buf.getvalue(), format='png', width=450, height=450*h/w,
unconfined=True))
答案 1 :(得分:0)
感谢@ImportanceOfBeingErnest指出解决方案。
我选择了一个解决方案,允许我根据自己的喜好设置plt.rc
,然后在将数字导出为PDF后恢复为设定值。
首先我设置我使用的值:
plt.rc('axes', grid=True)
plt.rc('figure', figsize=(12, 8))
plt.rc('legend', fancybox=True, framealpha=1)
有了这些,我可以用默认值绘制我需要的东西。然后我用:
创建PDFwith PdfPages('multi.pdf') as pdf:
for fig in figs:
fig.set_size_inches(420/25.4, 297/25.4)
pdf.savefig(figure=fig, bbox_inches='tight')
fig.set_size_inches(plt.rcParams.get('figure.figsize'))
有了这个,我只能在导出的数字上获得fig.tight_layout()
,并将数字大小恢复为之前设置的默认值。