如何在matplotlib中更好地光栅化绘图而不模糊标签?

11

我通常使用 ax.set_rasterized(True) 将图形转换为光栅格式,以便在保存为 eps 格式时能够处理透明度,但是光栅化也会使坐标轴标签和刻度标签模糊,所以是否有一种方法只将坐标轴内的补丁转换为光栅格式而不是整个图形?还是有更好的方法可以导出带有透明度的 eps 格式?谢谢。


1
我刚刚发现了set_zorder和set_rasterization_zorder,我认为它们会很有帮助,但我仍在查阅文档,如果有任何帮助,将不胜感激。 - nye17
你不能使用 pdf 吗?这样可以保留透明度而不需要光栅化。 - Avaris
@Avaris,不幸的是我不能使用PDF,只能坚持使用EPS,因此光栅化似乎是唯一的出路。 - nye17
2
啊,是的。看起来 set_rasterization_zorder 是正确的方法。查看 这个 - Avaris
@Avaris仍然无法使其正常工作,我想要栅格化的对象是一个ax.fill_between()对象,而“zorder”技巧神秘地将对象移动到了轴的外部,很奇怪。 - nye17
你能发一个例子吗?我尝试过的那个似乎完美地工作了。 - Avaris
2个回答

11

由于matplotlib的Artists可以被光栅化,所以任何派生自Artist的类(http://matplotlib.sourceforge.net/api/artist_api.html)都可以通过将关键字rasterized设置为True来进行光栅化。因此,您只能对图案进行光栅化。

我刚刚尝试了一些组合,似乎可以工作。然而,质量似乎不太好(另请参见http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg13276.html)。

import numpy as np
import matplotlib.pyplot as plt 


def add_patch(ax, **kwargs):
    if 'rasterized' in kwargs and kwargs['rasterized']:
        ax.set_rasterization_zorder(0)
    ax.fill_between(np.arange(1, 10), 1, 2, zorder=-1, **kwargs)
    ax.set_xlim(0, 10) 
    ax.set_ylim(0, 3)
    if 'alpha' in kwargs and kwargs['alpha'] < 1:
        txt = 'This patch is transparent!'
    else:
        txt = 'This patch is not transparent!'
    ax.text(5, 1.5, txt, ha='center', va='center', fontsize=25, zorder=-2,
            rasterized=True)

fig, axes = plt.subplots(nrows=4, sharex=True)
add_patch(axes[0], alpha=0.2, rasterized=False)
add_patch(axes[1], alpha=0.2, rasterized=True)
add_patch(axes[2], rasterized=False)
add_patch(axes[3], rasterized=True)

plt.tight_layout()
plt.savefig('rasterized_transparency.eps')

我将eps转换为png格式,以便在浏览器中显示:

rasterized_transparency.png

另请参阅:如何在Matplotlib中将图形保存为栅格图像的PDF


谢谢,我会尽快尝试您的示例,并在自己的代码上进行测试。到时候我会接受答案的。;-) - nye17

4
结果会更好,如果您指定dpi值,它似乎默认为相当低的值。例如,将最后一行改为:
plt.savefig('rasterized_transparency.eps',dpi=200)

当文件增长到4.5M,并且在Acrobat中放大到200%时,看起来很好。但是我同意可能有更紧凑的支持透明度的格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接