我使用matplotlib在Python中创建了一个图。在对每一行进行注释之后,我想使标签成为超链接(或者,使该行本身成为超链接)。文本项有一个名为'url'的属性,但我已经尝试过,我无法弄清楚它是什么,如果有的话。
是否可以将文本或线对象转换为超链接?
答案 0 :(得分:4)
This example显示了在输出SVG时如何设置超链接。请注意,这仅适用于SVG。如果绘图只是一个图像,它只是一个图像,图像中不能有超链接。
如果您希望能够在交互式绘图窗口中单击该对象并使其像超链接一样,则可以创建一个事件处理程序来处理“pick”事件,并打开浏览器或其他任何事件。有关如何选择活动的信息,请参阅this example。 Matplotlib图不是网页甚至是真正的文档,它们只是在其中显示图形的窗口,因此它们不支持超链接;使用选择事件,您可以通过在单击对象时打开Web浏览器来模拟超链接。
编辑:你是对的,它不起作用。似乎只读取URL属性并将其用于某些类型的对象。谷歌搜索,我看到一些旧的matplotlib邮件列表讨论它,似乎想法是逐步添加URL支持不同的艺术家类型,但我想他们从来没有解决它。我建议你在matplotlib bug tracker上提出一个关于此问题的错误。
与此同时,有一种方法可以做到,但它有点迂回。为PathCollection对象绘制URL,因此您可以从文本中创建一个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,但它有一些缺点。最值得注意的是,您似乎必须在数据坐标中手动设置文本大小,因此可能需要花些时间才能找到相对于绘制数据幅度而言过于庞大或微小的文本大小。
答案 1 :(得分:0)
这可以通过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")
答案 2 :(得分:0)
例如在使用SVG文件。
url
属性在较新的matplotlib版本中有效:
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。