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

标签 python python-3.x matplotlib

我需要保存一个从 python3.2 中的 matpolotlib 生成的图形(上面有 8 个子图)。我需要将图形保存在一个 pdf 页面上。 每个子图可能有 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() 在弹出窗口中获取图形,子图之间会有一些标题和图例重叠。如何调整弹出图形,以便我可以获得所有子图而没有任何重叠,并将所有子图保持为正方形。 将它们保持为方形用户界面对我来说非常重要。

最佳答案

您的代码确实将单个空图形 fig 保存到文件 figure_1.pdf,而不使用 PdfPages。 pdf 文件为空也是正常的,因为您没有在 fig 中绘制任何内容。下面是一个 MWE,展示了如何仅将一张图保存到单个 pdf 文件中。我已经用 PdfPages 删除了所有不必要的内容。

更新(2015-07-27):当将无花果保存为 pdf 时出现问题,因为需要渲染的数据太多,或者在复杂而详细的颜色图的情况下,可能会出现以下问题:栅格化绘图中一些有问题的元素是个好主意。下面的 MWE 已更新以反射(reflect)这一点。

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 的 rasterized 设置为 true 时,上面的代码大约需要 6.5 秒来保存 pdf,而当它设置为 False 时,需要 61.5 秒。

默认情况下,保存为pdf时,图形保存在vectorial format中。这意味着每个点都保存为一组参数(颜色、大小、位置等)。当有大量数据时(OP 的情况下为 8 * 400k),需要存储大量信息。将绘图的某些元素转换为 raster format 时,绘制的点数并不重要,因为图像被保存为固定数量的像素(就像 png 一样)。通过仅光栅化散点图,图形的其余部分(轴、标签、文本、图例等)仍然保持矢量格式。因此,总体而言,对于某些类型的图表(例如颜色图或散点图),质量损失并不那么明显,但对于具有锐线的图表来说,质量损失将是那么明显。

关于python - 当带有子图的图形从 python3.2 中的 matplotlib 保存为 pdf 时创建的空 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631918/

相关文章:

Python robotparser 模块不会加载 'robots.txt'

python - Pyspark sc.textFile() 没有完全加载文件

python - 如何向 Seaborn 分布图添加均值线和中线

python - 如何通过鼠标单击在FigureCanvasQTAgg上画一个圆

python - matplotlib 中文本的部分着色

python - 将 Excel 转换为 TIFF 文件

python - 如何使用 Amplify React 在 Python 中的 Post Confirmation Lambda Trigger 中获取 Cognito Identity Id?

python-3.x - Seaborn 设置 figsize=(x,y) 关于 tight_layout "tight_layout cannot make axes height small enough to accommodate all axes decorations"的错误和警告

python - 将树节点转换为边端点的坐标

python-3.x - SqlAlchemy/Python 正确捕获 psycopg2.errors.UndefinedTable