Графики Matplotlib теряют прозрачность при сохранении как .ps/.eps
У меня возникла проблема с попыткой сохранить некоторые графики с прозрачными эллипсоидами на них, если я попытаюсь сохранить их с расширениями .ps/.eps.
Здесь сюжет сохранен как .png:
![png]()
Если я захочу сохранить его как .ps/.eps, вот что он выглядит:
![ps]()
Как я обошел это, было использовать ImageMagick для преобразования исходного png в ps. Единственная проблема заключается в том, что изображение в формате png составляет около 90 тыс., И после преобразования он становится меньше 4 МБ. Это плохо, так как у меня много таких изображений, и для составления моего латексного документа потребуется слишком много времени. У кого-нибудь есть решение?
Ответы
Ответ 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)