使用python matplotlib将轴区域仅导出到位图

时间:2013-05-30 14:34:14

标签: python pdf bitmap matplotlib

对于科学会议,论文的文件大小通常是有限的。 我喜欢将我的情节包含为pdf,因此文字和线条保持清晰。 当我使用大量数据创建伪彩色图或散点图时,导出的pdf很容易变得比允许的完整纸张大。

有没有办法可以只将轴区域导出到位图,所以我可以在以后将它包含在矢量轴中? (或者有更好的方法来获得一个嵌入了位图作为位图的PDF格式吗?)

我希望有人可以帮助我。由于这是我的第一篇文章,对如何改进我的问题的评论表示赞赏。

2 个答案:

答案 0 :(得分:4)

您可以将单个Artist导出为矢量输出中的光栅:

img = plt.imshow(...)
img.set_rasterized(True)

(doc)

答案 1 :(得分:0)

我意识到了这个大型散点图的解决方法。 它并不是那么优雅,但它解决了我的问题。 关于更优雅的解决方案的建议非常受欢迎;)

    # -*- coding: utf-8 -*-
"""
Created on Sat Jun  1 17:21:53 2013

@author: roel
"""

import pylab as pl
from matplotlib._png import read_png


def bitmappify(ax, dpi=None):
    fig = ax.figure
    # safe plot without axes
    ax.set_axis_off()
    fig.savefig('bitmap.png', dpi=dpi, transparent=True)
    ax.set_axis_on()

    # remeber geometry
    xl = ax.get_xlim()
    yl = ax.get_ylim()
    xb = ax.bbox._bbox.corners()[:,0]
    xb = (min(xb), max(xb))
    yb = ax.bbox._bbox.corners()[:,1]
    yb = (min(yb), max(yb))

    # compute coordinates to place bitmap image later
    xb = (- xb[0] / (xb[1] - xb[0]),
        (1 - xb[0]) / (xb[1] - xb[0]))
    xb = (xb[0] * (xl[1] - xl[0]) + xl[0],
        xb[1] * (xl[1] - xl[0]) + xl[0])
    yb = (- yb[0] / (yb[1] - yb[0]),
        (1 - yb[0]) / (yb[1] - yb[0]))
    yb = (yb[0] * (yl[1] - yl[0]) + yl[0],
        yb[1] * (yl[1] - yl[0]) + yl[0])

    # replace the dots by the bitmap
    del ax.collections[:]
    del ax.lines[:]
    ax.imshow(read_png('bitmap.png'), origin='upper',
             aspect= 'auto', extent=(xb[0], xb[1], yb[0], yb[1]))

    # reset view
    ax.set_xlim(xl)
    ax.set_ylim(yl)

# create a plot
f, a = pl.subplots(1,1)
n = 1e4
a.scatter(pl.random(n)*2+6, pl.random(n)*3-12,
          c=pl.random(n), s=100*pl.random(n))

# safe as large pdf file for comparison
f.savefig('vector.pdf') # gives a large file: 3.8 MB

bitmappify(a, 144)

# save as smaller pdf
f.savefig('hybrid.pdf', dpi=144) # reasonably sized file: 0.5 MB