11

所以,我正在绘制一个波形(和其他东西),它会产生比相应的光栅文件(PNG)更大的矢量文件(PDF)。我想这是因为绘制的数据集非常大,并且矢量文件中有数百万条指令。除了更大之外,PDF 阅读器也很难显示 PDF。在某些情况下,加载需要几秒钟;在其他人身上,它根本不加载。

在 pyplot 中,是否可以使用矢量轴、标签和所有其他文本绘制位图?

我目前(非常糟糕)的解决方案是生成 PDF,生成 PNG,用 inkscape 打开 PDF 并用 PNG 替换绘图。显然,如果您意识到必须重新生成情节,这太手动且非常耗时。

4

2 回答 2

13

它应该像传入命令一样rasterized=True简单plot

例如

import matplotlib.pyplot as plt

plt.plot(range(10), rasterized=True)
plt.savefig('test.pdf')

对我来说,这会产生一个带有光栅线的 pdf(分辨率由您指定的 dpi 控制savefig——默认情况下,它是 100)和矢量文本。

于 2013-07-18T18:02:43.290 回答
1

我对这个问题使用了一个肮脏的“修复”。我只是制作了两次情节。一旦我删除了所有帧、标题等并保存为 png,在另一种情况下,我删除了实际数据并将我想要的所有组件作为矢量数据保存在 pdf 中。然后我使用 ImageMagick 将 png 转换为包含位图数据的 pdf,并使用 pdftk 覆盖 pdf 中的矢量数据。这是 matplotlib 页面中的一个 pcolor 示例,该示例以我刚才描述的方式进行了改编。

import matplotlib.pyplot as plt
import numpy as np
import os

for case in ['frame','data']:

    # make these smaller to increase the resolution                                                                                                  
    dx, dy = 0.02, 0.02

    # generate 2 2d grids for the x & y bounds                                                                                                       
    y, x = np.mgrid[slice(-3, 3 + dy, dy),
                    slice(-3, 3 + dx, dx)]
    z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
    # x and y are bounds, so z should be the value *inside* those bounds.                                                                            
    # Therefore, remove the last value from the z array.                                                                                             
    z = z[:-1, :-1]
    z_min, z_max = -np.abs(z).max(), np.abs(z).max()


    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    im=plt.pcolor(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max)
    plt.title('pcolor')
    # set the limits of the plot to the limits of the data                                                                                           
    plt.axis([x.min(), x.max(), y.min(), y.max()])

    if case is 'frame':
        im.remove()
        plt.savefig("frame.pdf",transparent=True)
    if case is 'data':
        ax.axison=False
        plt.title('')
        plt.savefig("data.png",transparent=True)



os.system('convert data.png data.pdf')
os.system('pdftk frame.pdf background data.pdf output final_plot.pdf')
os.system('rm data.png data.pdf frame.pdf')

基本上它只是你已经在做的自动化版本......

于 2013-09-03T14:35:02.300 回答