Python matlplotlib如何为文本添加超链接

11

我使用matplotlib在Python中创建了一个图表。 在注释每条线之后,我想将标签制作成超链接(或者将线本身制作成超链接)。文本项具有名为“url”的属性,但我已经尝试过了,我无法确定它是否起作用。

是否可能将文本或线对象转换为超链接?


快速提示:Chromium 73在SVG中不能很好地处理100万个点。;-) - Ciro Santilli OurBigBook.com
3个回答

6

这个示例展示了如何在输出SVG时设置超链接。请注意,这仅适用于SVG。如果图表只是一张图片,那么它就是一张图片,图片无法包含超链接。

如果您想要能够单击交互式绘图窗口中的对象并使其像超链接一样起作用,则可以创建事件处理程序来处理“选取”事件,并打开浏览器或其他操作。请参见此示例以了解如何处理选取事件。Matplotlib绘图不是网页,甚至不是真正的文档,它们只是显示在窗口中的图形,因此它们不支持超链接;使用选取事件,您可以通过在单击对象时打开Web浏览器来模拟超链接。

编辑:你是正确的,它不起作用。似乎URL属性仅对某些类型的对象进行读取和使用。通过搜索,我看到了一些关于matplotlib的旧邮件列表讨论,在那里似乎的想法是逐渐向不同的艺术家类型添加URL支持,但我想他们从未开始。我建议您在matplotlib bug tracker上报告此错误。

同时,有一种方法可以做到这一点,但它有些绕。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,但它有一些缺点。最显著的是,您必须手动在数据坐标中设置文本大小,因此可能需要一些调整才能找到与绘制的数据量相对应的合适文本大小。

没错,我正在输出一个SVG,并且我遵循了那个例子。它适用于图像和散点图,但是如果我尝试对文本对象执行相同的操作,则超链接不会出现。 - Lukas Bystricky
1
@HH:你说得对,似乎大多数艺术家类型从未实现URL。请查看我编辑后的答案,其中提供了一个相当迂回的解决方法。 - BrenBarn
2
非常感谢您的帮助。我稍后会尝试一下;我在这里找到了一个相当不错的解决方案:https://dev59.com/IGjWa4cB1Zd3GeqPp1xJ - Lukas Bystricky

4

在使用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。

1
这对我不起作用。我正在使用matplotlib 3.4.1和Jupyter Lab。 - Dennis

1
这是使用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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接