matplotib: два наложенных друг на друга прозрачных изображения выглядят по-разному при сохранении в формате svg или png

Я пытаюсь наложить два прозрачных изображения с помощью matplotlib и сохранить результат, но результат выглядит по-разному в зависимости от типа файла. В частности, это гораздо более размыто при сохранении в svg.

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

Пример кода:

f, ax = plt.subplots(figsize=(2,2))
ax.imshow(np.eye(3), alpha=.5)
ax.imshow(np.eye(3)[::-1], alpha=.5)
f.savefig('example.png')
f.savefig('example.svg')

Файл png выглядит точно так же, как на экране, но файл svg выглядит размытым. Я хотел бы знать, как сохранить в формате svg без эффекта размытия (т.е. он должен выглядеть так, как на экране).

В качестве дополнительного вопроса, почему график png выглядит по-разному в зависимости от порядка, в котором я рисую прозрачные изображения? Второе изображение всегда выглядит сильнее. Интересно, что в svg оба одинаково размыты.

Пример сохранен как png:

сохранено как png

Пример сохранен как svg:

сохранено как svg

версия matplotlib: 3.1.3 версия python: 3.7.7

Спасибо за любые советы!


person cxrodgers    schedule 15.05.2020    source источник
comment
Они связаны с вашим запросом? 1. github.com/matplotlib/matplotlib/issues/10035 2. github.com/matplotlib/matplotlib/pull/17049   -  person AshlinJP    schedule 19.05.2020
comment
@AshlinJP возможно! я не могу сказать   -  person cxrodgers    schedule 20.05.2020


Ответы (1)


Я опубликую то, что, по моему мнению, происходит, но если кто-то может ответить более достоверной информацией, я приму это.

Я думаю, что каждый раз, когда вы вызываете imshow с альфа-значением, текущее изображение на оси смешивается с новым изображением, используя (new * alpha + current * (1-alpha)). Проблема в том, что если вы отображаете 10 изображений, каждое с альфа-каналом 0,5, то первое изображение сводится на нет итеративным смешиванием, тогда как последнее изображение составляет 50% от конечного результата. Тем не менее, по-видимому, это метод, используемый для рендеринга на экран и сохранения в png.

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

person cxrodgers    schedule 16.05.2020