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>
元素的x
和y
属性指定了文本的位置,font-family
和font-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图形时,建议根据实际需要来选择合适的解决方法,保证图形的质量和可编辑性。