我已经使用matplotlib在Python中创建了一个图。在标注每行之后,我想使标签成为一个超链接(或者,也可以将行本身设为超链接)。该文本项目有一个名为'网址'的属性,但我已经尝试过了,我无法弄清楚它有什么作用。Python matlplotlib将超链接添加到文本
是否可以将文字或线条对象变为超链接?
我已经使用matplotlib在Python中创建了一个图。在标注每行之后,我想使标签成为一个超链接(或者,也可以将行本身设为超链接)。该文本项目有一个名为'网址'的属性,但我已经尝试过了,我无法弄清楚它有什么作用。Python matlplotlib将超链接添加到文本
是否可以将文字或线条对象变为超链接?
This example显示如何在输出SVG时设置超链接。请注意,这只对SVG有意义。如果情节只是一个图像,那只是一个图像,图像中不能有超链接。
如果您希望能够在交互式绘图窗口中单击对象并使其具有超链接的功能,您可以创建一个事件处理程序来处理“挑选”事件,并打开浏览器或其他任何东西。请参阅this example了解如何挑选事件。 Matplotlib图不是网页,甚至不是真正的文档,它们只是显示图形的窗口,所以它们不支持超链接;使用选取事件,您可以通过在单击对象时打开Web浏览器来模拟超链接。
编辑:你是对的,它不工作。看起来,URL属性只能读取并用于某些类型的对象。谷歌搜索,我看到一些老的matplotlib邮件列表讨论它,似乎想法是逐渐添加URL支持不同的艺术家类型,但我想他们从来没有解决它。我建议你在matplotlib bug tracker上提出这个问题。
与此同时,有办法做到这一点,但它有点迂回。该URL是为PathCollection对象绘制的,因此您可以从文本中创建一个Path,然后使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,但它有一些缺点。最值得注意的是,似乎你必须在数据坐标中手动设置文本大小,所以可能需要一些小小的操作才能找到相对于绘制的数据幅度来说文本大小不是太大或太小的文本大小。
这是可能的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和我下面这个例子。它适用于图像和散点图,但如果我为文本对象尝试相同的操作,超链接不会出现。 – 2013-03-14 18:47:38
@HH:你说的对,大多数艺术家类型似乎没有实现URL。看到我编辑的答案是一个相当迂回的解决方法。 – BrenBarn 2013-03-14 19:35:10
这对你的帮助很大。我会稍微尝试一下;我在这里找到了一个相当好的解决方案:http://stackoverflow.com/questions/12387585/python-matplotlib-svg-and-hyperlinks-in-text-labels – 2013-03-14 20:15:08