Matplotlib 将图形以SVG格式输出并保持文本的可编辑性

Matplotlib 将图形以SVG格式输出并保持文本的可编辑性

Matplotlib是Python中广泛使用的绘图库之一,它提供了丰富的功能来生成高质量的图形。其中,将生成的图形以SVG(Scalable Vector Graphics)格式保存是一种较为常见的方式,因为它具有伸缩性和可编辑性等优点。然而,使用Matplotlib保存的SVG图形中的文本有时候会被转换成曲线或路径,导致文本不再可编辑,本文将介绍修改Matplotlib保存SVG图形的方法,使其文本仍旧保持为文本。

阅读更多:Matplotlib 教程

Matplotlib的SVG输出机制

Matplotlib的SVG输出机制可以通过如下三种方式来实现:

使用savefig函数保存SVG文件

import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot([1, 2, 3, 4])
fig.savefig('test.svg', format='svg')

使用FigureCanvasSVG将图形转换成SVG

from matplotlib.backends.backend_svg import FigureCanvasSVG

fig = plt.figure()
plt.plot([1, 2, 3, 4])
canvas = FigureCanvasSVG(fig)
canvas.print_svg('test.svg')

直接使用plt.savefig保存SVG

fig = plt.figure()
plt.plot([1, 2, 3, 4])
plt.savefig('test.svg', format='svg')

SVG中文本的表示形式

在SVG中,文本可以用<text>元素或者<path>元素来表示,其中使用<text>元素可以保证文本的可编辑性,而使用<path>元素则会将文本转换成路径,导致文本不再可编辑。

以下是一个使用<text>元素来表示文本的SVG示例程序:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <text x="20" y="30" font-family="Arial" font-size="14px" fill="black">Hello, SVG!</text>
</svg>

可以看到,<text>元素的xy属性指定了文本的位置,font-familyfont-size属性指定了文本的字体和大小,fill属性指定了文本的颜色,而文本内容则在<text></text>之间。

以下是一个使用<path>元素来表示文本的SVG示例程序:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <path d="M20,30 L34,30 L32,18 L28,18 C27,18 25.5,18 24.5,19 C23.5,20 23.5,21 23.5,22 L23.5,22 L23.5,23 Q23.5,26 23.5,27.5 Q23.5,29.5 24.5,30.5 Q25.5,31.5 28,31.5 L28,31.5 L32,31.5 L34,19 L20,19 Z" fill="black"/>
</svg>

可以看到,<path>元素的d属性指定了文本的路径,而fill属性指定了文本的颜色。需要注意的是,使用<path>元素来表示文本时,文本的可编辑性将会丢失。

使用Matplotlib保存SVG时文本被转换成路径的解决方法

手动修改SVG文件

一种简单粗暴的方法是在保存SVG文件后手动修改其中的文本路径,将路径转换成文本。例如,将以下示例程序保存为SVG文件后,打开文件并将<path>元素替换成<text>元素,即可使文本恢复为可编辑状态。

fig, ax = plt.subplots()
ax.text(0.5, 0.5, 'Hello, Matplotlib!', fontsize=20)
plt.savefig('test.svg', format='svg')

使用SVGAnnotation插件

另一种解决方法是使用Matplotlib的SVGAnnotation插件,该插件可以将Matplotlib图形中的文本以<text>元素的形式保存在SVG文件中,保证文本的可编辑性。使用该插件只需要在Matplotlib的rcParams中增加如下配置即可:

import matplotlib as mpl

mpl.rcParams['svg.fonttype'] = 'none'
mpl.rcParams['svg.hashsalt'] = 'hello'

其中,'svg.fonttype' = 'none'表示保存SVG时使用<text>元素来表示文本,而非<path>元素;而'svg.hashsalt' = 'hello'则是为了保证同一Matplotlib图形在不同计算机上生成的SVG文件HASH值相同,从而便于比较和合并文件。

以下是使用SVGAnnotation插件的示例程序:

import matplotlib as mpl
from matplotlib.offsetbox import OffsetFrom, AnnotationBbox

mpl.rcParams['svg.fonttype'] = 'none'
mpl.rcParams['svg.hashsalt'] = 'hello'

fig, ax = plt.subplots()
ab = AnnotationBbox(ax.text(0.5, 0.5, 'Hello, Matplotlib!', fontsize=20), (0.5, 0.5), xycoords='data', frameon=False)
ax.add_artist(ab)
plt.savefig('test.svg', format='svg')

可以看到,在使用SVGAnnotation插件的情况下,文本被保存为了<text>元素,从而保证了文本的可编辑性。

总结

本文介绍了Matplotlib保存SVG图形时文本被转换成曲线或路径的原因和解决方法,其中包括手动修改SVG文件和使用SVGAnnotation插件等。使用SVGAnnotation插件可以通过配置rcParams来实现,是一种简单快捷的解决方法。在使用Matplotlib保存SVG图形时,建议根据实际需要来选择合适的解决方法,保证图形的质量和可编辑性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程