【问题标题】:Python matlplotlib add hyperlink to textPython matplotlib 为文本添加超链接
【发布时间】:2013-03-03 07:01:36
【问题描述】:

我使用 matplotlib 在 Python 中创建了一个绘图。在注释每一行之后,我想让标签成为超链接(或者,让行本身成为超链接)。文本项有一个名为“url”的属性,但我已经尝试过了,但我不知道它是做什么的,如果有的话。

是否可以将文本或线条对象制作成超链接?

【问题讨论】:

  • 快速提示:Chromium 73 无法很好地处理 SVG 中的 100 万个点 ;-)

标签: python hyperlink matplotlib


【解决方案1】:

This example 展示了在输出 SVG 时如何设置超链接。请注意,这只对 SVG 有意义。如果情节只是一个图像,它只是一个图像,并且图像中不能有超链接。

如果您希望能够单击交互式绘图窗口中的对象并使其具有超链接的作用,您可以创建一个事件处理程序来处理“pick”事件,并让它打开浏览器或其他任何东西。请参阅this example 了解如何选择事件。 Matplotlib 绘图不是网页,甚至不是真正的文档,它们只是显示图形的窗口,因此它们不支持超链接;使用 pick 事件,您可以通过在单击对象时打开 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,但它有一些缺点。最值得注意的是,您似乎必须在数据坐标中手动设置文本大小,因此可能需要花费一些时间才能找到相对于您绘制的数据的大小而言不是太大或太小的文本大小。

【讨论】:

  • 对,我正在输出一个 SVG,我正在按照那个例子。它适用于图像和散点图,但如果我对文本对象尝试相同的操作,则不会出现超链接。
  • @HH:你说得对,似乎大多数艺术家类型都没有实现 URL。请参阅我编辑的答案以获得相当迂回的解决方法。
  • 这对您有很大帮助。稍后我会尝试一下;我在这里找到了一个也很好用的解决方案:stackoverflow.com/questions/12387585/…
【解决方案2】:

添加超链接是有意义的,例如使用 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。

【讨论】:

  • 这对我不起作用。我正在使用 matplotlib 3.4.1 和 Jupyter Lab。
【解决方案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")

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2015-02-22
    • 2020-05-08
    相关资源
    最近更新 更多