Python matplotlib 为文本添加超链接
我在Python里用matplotlib画了一个图。给每条线加上注释后,我想把这些标签变成超链接(或者直接让线条本身变成超链接)。我发现文本项目有一个叫'url'的属性,但我试过之后还是搞不清楚它到底有什么用。
请问能不能把文本或者线条变成超链接呢?
3 个回答
这可以通过pgf后端实现:
#!/usr/bin/env python3
import matplotlib
matplotlib.use("pgf")
pgf_with_custom_preamble = {
"text.usetex": True,
"pgf.preamble": [
r"\usepackage{hyperref}"
]
}
matplotlib.rcParams.update(pgf_with_custom_preamble)
from matplotlib import pyplot as plt
x = range(5)
y = range(5)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, "r-", label=r"Hyperlink: \url{http://google.com}")
ax.legend()
fig.savefig("mwe.pdf")
添加超链接在使用SVG文件时是很有意义的。
在较新的matplotlib版本中,url
属性可以正常工作:
text = plt.annotate("Link", xy=(2,5), xytext=(2.2,5.5),
url='http://matplotlib.org',
bbox=dict(color='w', alpha=1e-6, url='http://matplotlib.org'))
例如,在Jupyter笔记本中,因为它本身就是在浏览器里运行的,可以像这样显示带有超链接的SVG:
import matplotlib.pyplot as plt
from IPython.display import set_matplotlib_formats
set_matplotlib_formats("svg")
fig, ax = plt.subplots()
ax.scatter([1, 2, 3], [4, 5, 6])
text = ax.annotate("Link", xy=(2,5), xytext=(2.2,5.5),
url='http://matplotlib.org',
bbox=dict(color='w', alpha=1e-6, url='http://matplotlib.org'))
通过这种方式生成的图形中,你可以点击链接,直接跳转到matplotlib.org网站。
这个例子展示了如何在输出SVG时设置超链接。要注意的是,这个方法只适用于SVG格式。如果你的图只是一个图片,那它就只是图片,图片里是不能有超链接的。
如果你想在互动绘图窗口中点击某个对象,让它像超链接一样工作,你可以创建一个事件处理器来处理“选择”事件,然后让它打开浏览器或其他东西。想了解如何处理选择事件,可以参考这个例子。Matplotlib的图并不是网页,甚至也不算真正的文档,它们只是显示图形的窗口,所以不支持超链接;不过,通过使用选择事件,你可以模拟超链接的效果,当点击某个对象时打开网页浏览器。
补充:你说得对,这个方法不管用。看起来URL属性只是被读取并用于某些类型的对象。通过搜索,我发现一些旧的matplotlib邮件列表讨论,似乎当时的想法是逐步为不同的艺术家类型添加URL支持,但我想他们可能没能做到。我建议你在matplotlib的bug跟踪器上提出一个bug。
与此同时,确实有一种方法可以做到,但有点绕。URL是为PathCollection对象绘制的,所以你可以把你的文本做成一个路径,然后用这个路径创建一个PathCollection,再把这个PathCollection添加到你的图中。下面是一个例子:
pyplot.scatter([1, 2, 3], [4, 5, 6])
t = mpl.text.TextPath((2, 4), 'This is text', size=0.1)
pc = mpl.collections.PathCollection([t])
pc.set_urls(['http://www.google.com'])
ax = pyplot.gca()
ax.add_collection(pc)
pyplot.draw()
f = pyplot.gcf()
f.canvas.print_figure('fig.svg')
注意,你必须使用set_urls
而不是set_url
。这个方法会生成一个带有可点击文本的SVG,但也有一些缺点。最明显的是,你似乎需要手动在数据坐标中设置文本大小,所以可能需要调整一下,找到一个相对于你绘制的数据大小来说,不会太大或太小的文本大小。