仅为已保存的图更改Spyder和Matplotlib图形大小

时间:2017-04-05 17:20:28

标签: python matplotlib spyder

我想在一个尺寸中查看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中显示的数字大小?

2 个答案:

答案 0 :(得分:3)

正如@ImportanceOfBeingErnest所建议的那样,保存后更改数字大小应该有效,并且可能解决了你的问题。

但是,根据您的具体问题,您可能会面临扩展问题,因为pdf中保存的数字大小远大于IPython控制台中显示的大小。如果您在pdf上扩展所有内容以使其看起来很棒,那么在IPython中看起来一切都可能太大,如下例所示:

enter image description here

如果您不需要在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))

在IPython控制台中显示为: enter image description here

答案 1 :(得分:0)

感谢@ImportanceOfBeingErnest指出解决方案。

我选择了一个解决方案,允许我根据自己的喜好设置plt.rc,然后在将数字导出为PDF后恢复为设定值。

首先我设置我使用的值:

plt.rc('axes', grid=True)
plt.rc('figure', figsize=(12, 8))
plt.rc('legend', fancybox=True, framealpha=1)

有了这些,我可以用默认值绘制我需要的东西。然后我用:

创建PDF
with 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(),并将数字大小恢复为之前设置的默认值。