Matplotlib 导入SVG文件至图像
在Matplotlib中,使用SVG文件可以提供更高处理质量和更好的缩放性。在本文中,我们将探讨如何将SVG文件导入Matplotlib图像。
阅读更多:Matplotlib 教程
加载SVG文件
加载SVG文件的方法是将SVG文件导入到matplotlib.lines.Line2D中。加载这些线条后,我们可以将它作为任何其他线条引入Matplotlib图形中。
我们需要使用packages:
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib import colors as mcolors
import numpy as np
接着,我们可以读取SVG文件并将其分割成线条。这可以通过以下代码实现:
from xml.dom import minidom
def msegs_from_file(svg_fname):
doc = minidom.parse(svg_fname)
paths = [path.getAttribute('d') for path
in doc.getElementsByTagName('path')]
doc.unlink()
segs = [path_parser(p) for p in paths]
msegs = [m.segs for m in segs if isinstance(m, mpath.Path)]
return msegs
我们可以通过以下代码从Matplotlib中获取颜色:
colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)
我们可以定义一个名为“svg2segments”的函数,该函数可以使用我们刚刚创建的两个函数将SVG文件转换为独立的线段。在这个函数中,我们将使用“mpl_segs”变量将SVG中的线条存储为Matplotlib“Line2D”对象。我们还将指定线条的颜色/厚度,并将线条添加到图中。代码如下所示:
def svg2segments(svg_fname, color='black', lw=1., alpha=1.):
msegs = msegs_from_file(svg_fname)
mpl_segs = []
for msegs_ in msegs:
mpl_segs.extend(msegs_)
clr = mcolors.to_rgba(color, alpha)
segment_collection = LineCollection(mpl_segs, colors=(clr,), linewidths=lw)
return segment_collection
最后一步是将所有线条添加到Matplotlib图形中。我们可以使用以下代码完成此操作:
fig = plt.figure()
ax = fig.add_subplot(111)
segment_collection = svg2segments('/path/to/svg/file.svg', color='red')
ax.add_collection(segment_collection)
plt.show()
示例演示
在这个示例,我们将画出一个手绘的车轮并在车轮上添加某种纹理。首先,在Adobe Illustrator中绘制一个车轮并将其导出为SVG文件。然后在Python中使用我们上述的代码导入它,然后添加纹理。
现在,我们将对其进行Matplotlib导入和纹理添加:
fig = plt.figure()
ax = fig.add_subplot(111)
segment_collection = svg2segments('wheel.svg', color='k', lw=2)
ax.add_collection(segment_collection)
# 我们将创建一些随机的点来表明纹理。该纹理将通过插值来完成。
npts = 10**3
x = 5 * np.random.randn(npts)
y = 5 * np.random.randn(npts)
p = np.column_stack((x, y))
dx = np.linspace(-10, 10, 200)
dy = np.linspace(-10, 10, 200)
dX, dY = np.meshgrid(dx, dy)
z = np.exp(-(dX**2 + dY**2) / 5**2)
from scipy.interpolate import LinearNDInterpolator
lni = LinearNDInterpolator(p, z.ravel())
Z = lni(*np.transpose(segment_collection.get_segments()[0][:, 0:2]))
# 然后我们使用imshow展示所有的纹理
ax.imshow(Z, extent=(-10, 10, -10, 10), cmap='gray_r', alpha=0.7, interpolation='bilinear')
plt.axis([-25, 25, -25, 25])
plt.show()
总结
在本文中,我们介绍了如何将SVG文件导入Matplotlib图像。我们详细介绍了如何将SVG文件分割为独立的线条,并将它们添加到Matplotlib图形中。我们还提供了一个实际的示例,其中我们将添加纹理以描绘手绘的车轮。
当我们需要处理高质量的图形时,使用SVG文件可以提供很多优势。我们希望这篇文章能帮助读者了解如何将SVG文件导入到Matplotlib中,以便于更好的图形展示。