我需要在python3.2中保存一个从matpolotlib生成的图形(上面有8个子图)。我需要保存一个 pdf页面上的数字。 每个子图nmay都有240k到400k的数据点。
我的代码:
from matplotlib.backends.backend_pdf import PdfPages
plt.show(block=False)
pp = PdfPages('multipage.pdf')
fig = plt.figure()
fig.savefig('figure_1.pdf', dpi = fig.dpi)
pp.close()
但是,只创建了一个空的pdf文件而且没有数字。 任何帮助将不胜感激。
更新 这是一个演示代码:
def plot_pdf_example():
fig = plt.figure()
# I create subplots here
#x = np.random.rand(50)
#y = np.random.rand(50)
plt.plot(x, y, '.')
fig.savefig('figure_b.pdf')
if __name__ == '__main__':
r = plot_pdf_example()
# the return value of r is not 0 for my case
print("donne")
如果我使用plt.show()来获取弹出窗口中的数字,则子图之间会有一些标题和图例重叠。如何调整弹出图形以便我可以获得所有子图而不会出现任何重叠,并将所有子图保持为正方形。 保持它们的正方形对我来说非常重要。
答案 0 :(得分:1)
您的代码会将单个空图fig
保存到文件figure_1.pdf
,而不会使用PdfPages
。 pdf文件为空也是正常的,因为您没有在fig
中绘制任何内容。下面是一个MWE,它显示了如何只将一个数字保存到单个pdf文件中。我删除了PdfPages
所有不必要的东西。
更新(2015-07-27):当将图形保存为pdf时出现问题,因为要渲染的数据太多,或者在复杂和详细的色彩映射的情况下,它可能是一个好主意是栅格化一些有问题的情节元素。下面的MWE已经更新,以反映这一点。
import matplotlib.pyplot as plt
import numpy as np
import time
plt.close("all")
fig = plt.figure()
N = 400000
x = np.random.rand(400000)
y = np.random.rand(400000)
colors = np.random.rand(400000)
area = 3
ax0 = fig.add_axes([0.1, 0.1, 0.85, 0.85])
scater = ax0.scatter(x, y, s=area, c=colors)
scater.set_rasterized(True)
plt.show(block=False)
ts = time.clock()
fig.savefig('figure_1.pdf')
te = time.clock()
print('t = %f sec' % (te-ts))
在我的机器上,当scater
将栅格化设置为true时,上面的代码大约需要6.5秒来保存pdf,而当它设置为False时需要61.5秒。
默认情况下,以pdf格式保存时,图形会保存在vectorial format中。这意味着每个点都保存为一组参数(颜色,大小,位置等)。当存在大量数据时(OP的情况下为8 * 400k),这是存储的大量信息。将绘图的某些元素转换为raster format时,绘制的点数无关紧要,因为图像将保存为固定数量的像素(如png中)。通过仅栅格化scater
,图形的其余部分(轴,标签,文本,图例等)仍然保持矢量格式。总的来说,对于某些类型的图形(如彩色图或散点图)而言,质量损失并不那么明显,但对于具有清晰线条的图形而言,质量损失并不明显。