Matplotlib 导入SVG文件至图像

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中,以便于更好的图形展示。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程