我喜欢生成高质量的打印,因此尽可能避免光栅化图形。
我正在尝试将一个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来做吗?或者至少给我指一指合适的文档。
我知道有人提出过类似的问题(但没有得到回答):here .之后有什么变化吗?
我知道我可以只导出一个高分辨率的PNG就能达到类似的效果,这不是我要找的解决方案。
下面是我想要导入的图像:
.
4条答案
按热度按时间s5a0g9ez1#
也许您要查找的是svgutils
输出:
omtl5h9j2#
到2021年来到这里的人。
我建议查看一下
cairosvg
包(
conda install -c conda-forge cairosvg
或pip3 install cairosvg
)https://cairosvg.org/
gjmwrych3#
Yann Zerlaut给出的答案有利有弊:
这会导致伪像。例如,SVG图像中的线宽与Matplotlib中的线宽不同。在研究这一点的同时,我找到了Matplotlib中没有SVG支持的一些答案。
为了寻找更好的解决方案,我发现了一些值得在这里列出的解决方案,它们也有优点和缺点。
将SVG路径转换为matplotlib路径的简单解析器
https://matplotlib.org/stable/gallery/showcase/firefox.html#sphx-glr-gallery-showcase-firefox-py
臭鼬
https://github.com/whitead/skunk
结论
根据to the discussion here,在matplotlib中没有对导入SVG的本地支持,因为编写一个完全兼容的解析器很困难,而且matplotlib开发人员可能也不想引入外部解析库。
然而,编写一个用于路径的原语解析器实际上非常容易,正如您在matplotlib演示中所看到的,对于OP这样的简单用例,这可能就足够了。
对于复杂的情况,skunk很好地自动化了SVG图像的合成。
aemubtdh4#
SVG(可缩放矢量图形)是一种矢量格式,这意味着图像不是由像素组成的,而是由可以任意缩放的相对路径组成的。
NumPy/Matplotlib,作为数值软件,只能处理像素图形,不能处理
svg
。我建议首先将svg
文件转换为png
文件,方法是在Inkscape(免费)等软件中打开并保存它。然后,在Python中打开导出的png
。或者,使用wikimedia提供的
png
的the picture's information page (click on the download button to the right of the picture)文件版本。如果你真的认为你需要矢量形式,那么,没有办法做到这一点。你总是可以手动地将matplotlib图形叠加到图形上(使用matplotlib Artist在绘图画布上绘图),或者通过一些
pycairo
魔法,并保存它。但是Matplotlib不能直接处理svg
内容。