Импорт файла svg в таблицу matplotlib

Мне нравится создавать высококачественные сюжеты и, следовательно, избегать растрированной графики как можно больше.

Я пытаюсь импортировать файл svg на фигуру matplotlib:

import matplotlib.pyplot as plt
earth   = plt.imread('./gfx/earth.svg')
fig, ax = plt.subplots()
im      = ax.imshow(earth)
plt.show()

Это прекрасно работает с png. Может кто-нибудь сказать мне, как это сделать с svg или, по крайней мере, указать на правильную документацию.

Я знаю, что аналогичный вопрос был задан (но не ответил): здесь. С чего изменилось?

P.S. Я знаю, что могу просто экспортировать png с высоким разрешением и добиться аналогичного эффекта. Это не то решение, которое я ищу.

Вот изображение, которое я хотел бы импортировать: Earth_from_above.

Любые советы приветствуются. Спасибо!

Ответ 1

Возможно, что вы ищете svgutils

import svgutils.compose as sc
from IPython.display import SVG # /!\ note the 'SVG' function also in svgutils.compose
import numpy as np

# drawing a random figure on top of your SVG
fig, ax = plt.subplots(1, figsize=(4,4))
ax.plot(np.sin(np.linspace(0,2.*np.pi)), np.cos(np.linspace(0,2.*np.pi)), 'k--', lw=2.)
ax.plot(np.random.randn(20)*.3, np.random.randn(20)*.3, 'ro', label='random sampling')
ax.legend()
ax2 = plt.axes([.2, .2, .2, .2])
ax2.bar([0,1], [70,30])
plt.xticks([0.5,1.5], ['water  ', ' ground'])
plt.yticks([0,50])
plt.title('ratio (%)')
fig.savefig('cover.svg', transparent=True)
# here starts the assembling using svgutils 
sc.Figure("8cm", "8cm", 
    sc.Panel(sc.SVG("./Worldmap_northern.svg").scale(0.405).move(36,29)),
    sc.Panel(sc.SVG("cover.svg"))
    ).save("compose.svg")
SVG('compose.svg')

Вот результат

Ответ 2

SVG (Масштабируемая векторная графика) представляет собой векторный формат, что означает, что изображение не состоит из пикселей, а вместо относительных путей, которые можно масштабировать произвольно.

NumPy/Matplotlib, как программное обеспечение для численного моделирования, действительно работает с пиксельной графикой и не может обрабатывать svg. Я бы предложил сначала преобразовать файл svg, например. a png, открыв и сохранив его в программном обеспечении, таком как Inkscape (что бесплатно). Затем откройте экспортированный png в Python.

В качестве альтернативы используйте предоставленные wikimedia версии файла в формате png на странице с информацией о картинке (нажмите кнопку загрузки справа от изображения ).

Если вы действительно считаете, что вам нужна векторная форма, ну, нет никакого способа сделать это. Вы можете всегда накладывать фигуру matplotlib на фигуру вручную (используя matplotlib Artist для рисования на холсте сюжета) или через магию pycairo и сохранить это. Но Matplotlib не может работать напрямую с контентом svg.