2015-07-16 4 views
11

Мне нравится создавать высококачественные сюжеты и, следовательно, избегать растрированной графики как можно больше.Импорт файла 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() 

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

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

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

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

Любые советы приветствуются. Благодаря!

ответ

10

Может быть то, что вы ищете 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') 

Here is the output

+0

Это именно то, что я искал. Большое спасибо! – Sasha

0

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

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

В качестве альтернативы, используйте предоставленные wikimedia версии файла в формате png на the picture's information page (click on the download button to the right of the picture).

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

+1

Спасибо за ответ. Однако, исходя из моего вопроса, вы могли видеть, что я понимаю характеристики двух форматов. Я также прямо заявил, что все работает отлично с помощью png. Кроме того, matplotlib работает с путями. Каждый раз, когда вы сохраняете изображение как eps или svg, вы сохраняете векторную графику. Большинство сюжетов, прежде чем вы их сохраните, - это векторная графика, которую можно масштабировать произвольно. – Sasha

+0

Matplotlib может работать с дорожками внутри, как 'svg', но две вещи, работающие с путями, не подразумевают, что эти две вещи работают вместе. Примечание. Я также предложил создать рисунок matplotlib отдельно и слить их во втором руководстве или сценарии. Если вы не погружаетесь в художников Matplotlib и не готовы вручную разбирать файл 'svg', я очень сомневаюсь, что вы сможете использовать Matplotlib в качестве фона. – rubenvb

+0

Я не думал, что это так сложно, попробует посмотреть, как работает парсинг. Не могли бы вы отредактировать свой ответ, чтобы я мог его проголосовать? – Sasha

Смежные вопросы