Imshow Matplotlib с EPS

Есть ли способ использовать PIL с matplotlib для размещения логотипов в формате EPS или SVG (или любого масштабируемого векторного формата) для размещения логотипа на графике и вывода итогового файла в формате EPS. Теперь я получаю ужасно обработанную графику, потому что есть файл .png, который пытается преобразовать в формат EPS, где цель состоит в том, чтобы сохранить изображение как .eps или .svg.

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

Вот что не работает:

    ax1.set_axis_bgcolor('#fafafa')
    
    img = image.imread('./static/images/logo.png')
    image_axis = fig.add_axes(ax1.get_position())
    image_axis.patch.set_visible(False)
    image_axis.yaxis.set_visible(False)
    image_axis.xaxis.set_visible(False)
    image_axis.set_xlim(0,19.995)
    image_axis.set_ylim(0,11.25)

    image_axis.imshow(img, extent=(11.79705,18.99525,.238125,1.313625), zorder=-1, alpha=0.15) #need to keep a 5.023 x by y ratio (.4 x .079)

    fig.savefig('static/images/graphs/'+filename+'.eps', format='eps', bbox_inches='tight')

Любые обновления?


person Jared    schedule 18.05.2015    source источник
comment
Вы только что попробовали это? Документация подразумевает, что если изображение, переданное imshow, не в формате png, matplotlib вернется к PIL, который должен быть в состоянии справиться с eps (документы). У меня нет файлов eps для проверки, но потенциально могу попробовать завтра.   -  person J Richard Snape    schedule 19.09.2015


Ответы (3)


Это старый вопрос, но на него стоит ответить нынешним и будущим посетителям, которые хотят сделать то же самое.

Существует способ загрузки файлов SVG и преобразования их в объекты Path, реализованный в пакете svgpath2mpl. Со страницы проекта:

Путь в SVG определяется элементом «путь», который содержит атрибут d="(path data)", который содержит команды перемещения, линии, кривой (как кубической, так и квадратичной Безье), дуги и инструкции закрытия пути. Matplotlib изначально поддерживает все эти инструкции, но не предоставляет синтаксический анализатор или полностью совместимый API.

Видно по адресу пользовательский маркер/символ Matplotlib.

person wagnifico    schedule 20.11.2020

Я обычно добиваюсь лучшего рендеринга в этом случае с чем-то вроде:

from PIL import Image

logo = Image.open('icons\logo.png')
# TODO define bbox as a matplotlib.transforms.Bbox
image_axis.imshow(logo, clip_box=bbox, aspect='equal',
   origin='lower', interpolation='nearest')

(Matplotlib 1.4.2, если вы используете старую версию, игра с параметрами interpolation и origin может помочь)

person GBy    schedule 21.09.2015
comment
Работает ли это с векторной графикой, а не с png? - person Jared; 21.09.2015
comment
PIL может обрабатывать файлы .eps pillow.readthedocs.org/en/ last/handbook/ они будут растеризованы, но вы можете контролировать количество точек (см. ссылку) - person GBy; 21.09.2015
comment
Цель состоит в том, чтобы сохранить фигуру в формате EPS или другой масштабируемой векторной графики с включенным логотипом. - person Jared; 22.09.2015
comment
Ok. С помощью этого кода вы можете сохранить рисунок в формате pdf (вероятно, в формате eps, не проверял) с включенным логотипом, но он будет встроен в виде растрового изображения. - person GBy; 22.09.2015

Я удалил свой фрагмент кода, так как он был бесполезен.

Невозможно использовать собственный SVG в качестве изображения в Matplotlib. Matplotlib изначально поддерживает только png, а затем возвращается к Pillow, который также не поддерживает svg, см. http://pillow.readthedocs.io/en/latest/handbook/image-file-formats.html или документацию по изображениям matplotlib.

Pillow поддерживает формат eps, так что все будет работать! (Я не уверен, что matplotlib сделает из этого внутри)

Я использую это так:

# Pillow must be there
import matplotlib.image as mpimg

def Save_svg(fig):
    # expects a matplotlib figure
    # And puts a logo into a frameless new axes
    imagefile = 'logo.eps'
    svgfile   = 'output.svg'
    logoax    = [0.265, 0.125, 0.3, 0.3]
    img=mpimg.imread(imagefile)
    #
    newax = fig.add_axes(logoax, anchor='SW', zorder=100)
    newax.imshow(img)
    newax.axis('off')
    #
    fig.savefig(svgfile,dpi=300)
person JRM    schedule 02.02.2016
comment
Ваш пример включает логотип jpg - я думаю, OP хочет встроить eps / svg. Я думаю, дело в том, что они хотят сохранить векторную графику повсюду. - person J Richard Snape; 03.02.2016
comment
@JRichardSnape Это правильно - цель состоит в том, чтобы получить результат в SVG/EPS. Я до сих пор не решил это, но обновлю, если я это сделаю. - person Jared; 03.02.2016
comment
Недавно я решил это, поэтому я полностью обновил свой ответ выше. - person JRM; 29.03.2018