2015-07-16 20 views
11

Tôi thích sản xuất các ô có chất lượng cao và do đó tránh đồ họa rasterized càng nhiều càng tốt.Nhập tập tin svg là hình matplotlib

Tôi cố gắng để nhập một file svg vào một nhân vật matplotlib:

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

này làm việc với png hoàn hảo. Ai đó có thể cho tôi biết làm thế nào để làm điều đó với svg hoặc ít nhất là điểm của tôi để tài liệu thích hợp.

Tôi biết rằng câu hỏi tương tự đã được hỏi (nhưng chưa trả lời): here. Có bất cứ điều gì thay đổi kể từ khi?

P.S. Tôi biết rằng tôi chỉ có thể xuất một png có độ phân giải cao và đạt được hiệu quả tương tự. Đây không phải là giải pháp mà tôi đang tìm kiếm.

Đây là hình ảnh tôi muốn nhập: Earth_from_above.

Bất kỳ mẹo nào được đánh giá cao. Cảm ơn!

Trả lời

10

Có lẽ những gì bạn đang tìm kiếm là 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

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều! – Sasha

0

SVG (Đồ họa vector có thể mở rộng) là định dạng vectơ, có nghĩa là hình ảnh không bao gồm pixel, nhưng thay vì đường dẫn tương đối có thể được thu nhỏ tùy ý.

NumPy/Matplotlib, làm phần mềm số, chỉ thực sự hoạt động với đồ họa pixel và không thể xử lý svg. Tôi sẽ đề xuất đầu tiên chuyển đổi tệp svg thành ví dụ: tệp png bằng cách mở và lưu tệp đó trong phần mềm như Inkscape (miễn phí). Sau đó, mở xuất khẩu png bằng Python.

Ngoài ra, hãy sử dụng các phiên bản được cung cấp dưới dạng wikimedia của tệp ở định dạng png trên the picture's information page (click on the download button to the right of the picture).

Nếu bạn thực sự tin rằng bạn cần hình thức vectơ, tốt, không có cách nào để làm điều đó. Bạn luôn có thể xếp chồng hình matplotlib lên hình một cách thủ công (sử dụng nghệ sĩ matplotlib để vẽ trên cốt truyện) hoặc thông qua một số phép thuật pycairo và lưu lại. Nhưng Matplotlib không thể làm việc trực tiếp với nội dung svg.

+1

Cảm ơn bạn đã trả lời. Tuy nhiên, từ câu hỏi của tôi, bạn có thể thấy rằng tôi có một sự hiểu biết về đặc điểm của hai định dạng. Tôi cũng tuyên bố rõ ràng rằng mọi thứ hoạt động tốt với png. Hơn nữa, matplotlib làm việc với đường dẫn. Mỗi khi bạn lưu hình ảnh dưới dạng eps hoặc svg, bạn sẽ lưu đồ họa vector. Hầu hết các ô, trước khi bạn lưu chúng, là đồ họa vector có thể được thu nhỏ tùy ý. – Sasha

+0

Matplotlib có thể làm việc với các đường dẫn bên trong giống như 'svg', nhưng hai thứ làm việc với các đường dẫn không hàm ý hai thứ này làm việc cùng nhau. Lưu ý tôi cũng đã đề xuất tạo riêng con số matplotlib và hợp nhất chúng trong một hướng dẫn sử dụng hoặc bước kịch bản thứ hai. Trừ khi bạn đi sâu vào các nghệ sĩ Matplotlib và chuẩn bị phân tích cú pháp tệp 'svg' theo cách thủ công, tôi nghi ngờ bạn sẽ có thể để Matplotlib sử dụng tệp làm nền. – rubenvb

+0

Tôi không nghĩ rằng nó phức tạp, sẽ cố gắng xem cách phân tích cú pháp hoạt động. Bạn có thể chỉnh sửa câu trả lời của bạn để tôi có thể bỏ phiếu không? – Sasha

Các vấn đề liên quan