Как лучше растрировать график, не размывая метки в matplotlib?

Обычно я использую ax.set_rasterized(True) для растеризации фигуры, чтобы она могла обрабатывать прозрачность при сохранении в формате eps, но растеризация также размывает метки осей и метки делений, поэтому есть ли способ растеризовать только участки внутри оси, а не всю фигуру? или есть лучший вариант для экспорта формата eps с прозрачностью? Спасибо.


person nye17    schedule 06.04.2012    source источник
comment
Я только что обнаружил set_zorder и set_rasterization_zorder, я думаю, что они будут полезны, но все еще копаю документацию, все равно любая помощь приветствуется.   -  person nye17    schedule 07.04.2012
comment
Вы не можете использовать pdf? Это сохранит прозрачность без растеризации.   -  person Avaris    schedule 07.04.2012
comment
@Avaris, к сожалению, я не могу использовать pdf, но должен придерживаться eps, поэтому растеризация кажется единственным выходом.   -  person nye17    schedule 07.04.2012
comment
О да. Похоже, set_rasterization_zorder - это путь. Проверьте это.   -  person Avaris    schedule 07.04.2012
comment
@Avaris все еще не может заставить его работать, объект, который я хочу растеризовать, представляет собой объект ax.fill_between(), и трюк zorder таинственным образом смещает объект за пределы оси, странно.   -  person nye17    schedule 08.04.2012
comment
Можете ли вы опубликовать пример? Тот, который я пробовал, кажется, работает отлично.   -  person Avaris    schedule 09.04.2012


Ответы (2)


Поскольку matplotlib Artists может быть растрирован, любой класс, производный от Artist (http://matplotlib.sourceforge.net/api/artist_api.html) может растрировать с ключевым словом rasterized, установленным в True. Таким образом, вы можете только растеризовать свои патчи.

Я только что попробовал несколько комбинаций, и это, кажется, работает. Однако качество кажется не очень хорошим (см. также http://www.mail-archive.com/[email protected]/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

См. также: Как сохранить рисунки в pdf как растровые изображения в matplotlib.

person bmu    schedule 08.04.2012
comment
Спасибо, я попробую ваш пример и протестирую его на своих собственных кодах как можно скорее. Ответ будет принят к тому времени ;-). - person nye17; 14.05.2012

Результаты будут лучше, если вы укажете dpi, которое по умолчанию имеет довольно низкое значение. Например, измените последнюю строку на

plt.savefig('rasterized_transparency.eps',dpi=200)

и файл вырастает до 4,5М и отлично выглядит в Acrobat при увеличении до 200%. Однако я согласен с тем, что, вероятно, существуют более компактные форматы, поддерживающие прозрачность.

person bdb112    schedule 03.02.2016