Подтвердить что ты не робот

Графики Matplotlib теряют прозрачность при сохранении как .ps/.eps

У меня возникла проблема с попыткой сохранить некоторые графики с прозрачными эллипсоидами на них, если я попытаюсь сохранить их с расширениями .ps/.eps.

Здесь сюжет сохранен как .png: png

Если я захочу сохранить его как .ps/.eps, вот что он выглядит: ps

Как я обошел это, было использовать ImageMagick для преобразования исходного png в ps. Единственная проблема заключается в том, что изображение в формате png составляет около 90 тыс., И после преобразования он становится меньше 4 МБ. Это плохо, так как у меня много таких изображений, и для составления моего латексного документа потребуется слишком много времени. У кого-нибудь есть решение?

4b9b3361

Ответ 1

Проблема заключается в том, что eps не поддерживает прозрачность.

Есть несколько вариантов:

  • растрировать изображение и вставлять его в файл eps (например, предлагает @Molly) или экспортировать в pdf и преобразовывать с помощью какого-либо внешнего инструмента (например, gs) (который обычно также зависит от растеризации)

  • 'mimic' transparent, придавая цвет, который выглядит как прозрачный на данном фоне.

Я обсуждал этот наверняка один раз в списке рассылки matplotlib, и я получил предложение растеризовать, что не представляется возможным, поскольку вы получаете либо пиксельные, либо огромные цифры. И они не масштабируются очень хорошо, когда помещаются, например, в публикацию.

Я лично использую второй подход, и хотя это не идеально, я нашел его достаточно хорошим. Я написал небольшой python script, который реализует алгоритм из этого сообщения SO для получения твердого RGB-представления цвета с прозрачностью

ИЗМЕНИТЬ

В конкретном случае вашего сюжета попробуйте использовать ключевое слово zorder, чтобы заказать детали, нанесенные на график. Попробуйте использовать zorder=10 для синего эллипса, zorder=11 для зеленого и zorder=12 для шестиугольников.

Таким образом, синий должен быть ниже всего, затем зеленый эллипс и, наконец, гексбин. И сюжет должен быть читаемым и сплошными цветами. И если вам нравятся оттенки синего и зеленого, которые у вас есть в png, вы можете попробовать сыграть с mimic_alpha.py.

РЕДАКТИРОВАТЬ 2

Если вы на 100% уверены, что у вас есть, чтобы использовать eps, есть несколько обходных решений, которые мне приходят (и это определенно уродливее вашего сюжета):

  • Просто нарисуйте границы эллипса сверху шестиугольников.
  • Получить центр и амплитуду каждого шестиугольника (возможно, сбросить все нулевые бункеры) и сделать график расселения, используя ту же цветовую карту, что и в hexbin и отрегулируйте размер и форму маркера по своему усмотрению. Возможно, вы захотите перерисовать границы эллипсов поверх этого.

Ответ 2

Другой вариант - сохранить их в pdf

savefig('myfigure.pdf')

Это работает с pdflatex, если это было причиной того, что вам нужно было использовать eps, а не svg.

Ответ 3

У меня была та же проблема. Чтобы избежать растрирования, вы можете сохранить изображение в формате pdf, а затем запустить (по крайней мере, в системах Unixish) в терминале:

pdftops -eps my.pdf my.eps

Что дает файл .eps как вывод.

Ответ 4

Вы можете растрировать фигуру перед сохранением ее, чтобы сохранить прозрачность в файле eps:

ax.set_rasterized(True)
plt.savefig('rasterized_fig.eps')

Ответ 5

Как упоминалось выше, лучший и самый простой выбор (если вы не хотите потерять разрешение) - это растрировать цифру

f = plt.figure()
f.set_rasterized(True)

ax = f.add_subplot(111)

ax.set_rasterized(True)
f.savefig('figure_name.eps',rasterized=True,dpi=300)

Таким образом, вы также можете управлять параметром размера по dpi. На самом деле вы также можете играть с zorder ниже, чем вы хотите применить растрирование:

ax.set_rasterization_zorder(0)

Примечание. Важно использовать f.set_rasterized (True), когда вы используете функции plt.subplot и plt.subplot2grid. В противном случае метки и галочка не будут отображаться в файле .eps

Ответ 6

Мое решение состоит в том, чтобы экспортировать график как .eps, например, загрузить его в Inkscape, затем разгруппировать график, выбрать объект, который я хочу установить прозрачность, и просто отредактировать непрозрачность заливки в поле "Заливка и Stroke".

Вы можете сохранить файл как .svg, если хотите позже его настроить, или экспортировать изображение для публикации.

Ответ 7

Я решил это: 1) добавление set_rasterization_zorder (1) при определении области фигуры:

fxsize=16
fysize=8
f = figure(num=None, figsize=(fxsize, fysize), dpi=180, facecolor='w',
edgecolor='k')
plt.subplots_adjust(
left    = (18/25.4)/fxsize, 
bottom  = (13/25.4)/fysize, 
right   = 1 - (8/25.4)/fxsize, 
top     = 1 - (8/25.4)/fysize)
subplots_adjust(hspace=0,wspace=0.1)
#f.suptitle('An overall title', size=20)
gs0 = gridspec.GridSpec(1, 2)

gs11 = gridspec.GridSpecFromSubplotSpec(1, 1, subplot_spec=gs0[0])

ax110 = plt.Subplot(f, gs11[0,0])
f.add_subplot(ax110)

ax110.set_rasterization_zorder(1)

2) zorder = 0 в каждом альфа = любое число на графике:

ax110.scatter(xs1,ys1  , marker='o', color='gray'  , s=1.5,zorder=0,alpha=0.3)#, label=label_bg)

и 3), наконец, растрированный = True при сохранении:

P.savefig(str(PLOTFILENAME)+'.eps', rasterized=True)