当带有子图的图形从python3.2中的matpolotlib保存为pdf时创建的空pdf

时间:2015-07-25 22:56:49

标签: python python-3.x matplotlib

我需要在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()来获取弹出窗口中的数字,则子图之间会有一些标题和图例重叠。如何调整弹出图形以便我可以获得所有子图而不会出现任何重叠,并将所有子图保持为正方形。 保持它们的正方形对我来说非常重要。

1 个答案:

答案 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,图形的其余部分(轴,标签,文本,图例等)仍然保持矢量格式。总的来说,对于某些类型的图形(如彩色图或散点图)而言,质量损失并不那么明显,但对于具有清晰线条的图形而言,质量损失并不明显。