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

2024-10-01 09:16:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想查看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纸张上。在

^{pr2}$

输出PDF就像我想要的一样,但问题是Spyder内部显示的绘图。保存时更改图形大小也会影响Spyder中查看的绘图。而使用A3的尺寸会使绘图变得太大。在

所以问题是:如何在不改变Spyder内部显示的图形大小的情况下更改保存的PDF图形的大小?在


Tags: true图形绘图pdfmatplotlib尺寸ipythonplt
2条回答

感谢@ImportanceOfBeingErnest指出解决方案。在

我使用了一个解决方案,它允许我在开始时根据自己的喜好设置plt.rc,然后在将图形导出为PDF后恢复为设置的值。在

我使用第一个值:

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

有了这些,我可以用默认值绘制出我需要的东西。然后我用以下内容创建PDF:

^{pr2}$

这样我就可以只在导出的图形上得到fig.tight_layout(),并将图形大小恢复为先前设置的默认值。在

正如@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

相关问题 更多 >