Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matlplotlib将超链接添加到文本_Python_Hyperlink_Matplotlib - Fatal编程技术网

Python matlplotlib将超链接添加到文本

Python matlplotlib将超链接添加到文本,python,hyperlink,matplotlib,Python,Hyperlink,Matplotlib,我已经使用matplotlib在Python中创建了一个绘图。在注释每一行之后,我希望将标签设置为超链接(或者,将该行本身设置为超链接)。文本项有一个名为“url”的属性,但我已经尝试过了,我不知道它有什么作用 是否可以将文本或行对象设置为超链接?演示了在输出SVG时如何设置超链接。请注意,这仅对SVG有意义。如果绘图只是一个图像,它只是一个图像,图像中不能有超链接 如果希望能够在交互式打印窗口中单击对象并使其像超链接一样工作,可以创建一个事件处理程序来处理“拾取”事件,并使其打开浏览器或其他任

我已经使用matplotlib在Python中创建了一个绘图。在注释每一行之后,我希望将标签设置为超链接(或者,将该行本身设置为超链接)。文本项有一个名为“url”的属性,但我已经尝试过了,我不知道它有什么作用

是否可以将文本或行对象设置为超链接?

演示了在输出SVG时如何设置超链接。请注意,这仅对SVG有意义。如果绘图只是一个图像,它只是一个图像,图像中不能有超链接

如果希望能够在交互式打印窗口中单击对象并使其像超链接一样工作,可以创建一个事件处理程序来处理“拾取”事件,并使其打开浏览器或其他任何东西。有关如何拾取事件的信息,请参见。Matplotlib绘图不是网页,甚至不是真正的文档,它们只是显示图形的窗口,因此不支持超链接;使用拾取事件,可以通过在单击对象时打开web浏览器来模拟超链接

编辑:你是对的,它不起作用。URL属性似乎只对某些类型的对象进行读取和使用。在谷歌上,我看到一些关于它的旧matplotlib邮件列表讨论,其中的想法似乎是逐渐增加对不同艺术家类型的URL支持,但我猜他们从来没有考虑过。我建议你在网上提出一个错误

与此同时,有一种方法可以做到这一点,但它有点迂回。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')

请注意,您必须使用
设置url
,而不是
设置url
。这种方法生成一个带有可点击文本的SVG,但它有一些缺点。最值得注意的是,您似乎必须在数据坐标中手动设置文本大小,因此可能需要进行一些修改才能找到一个相对于打印数据大小而言不会太大或太小的文本大小。

这在pgf后端是可能的:

#/usr/bin/env蟒蛇3
导入matplotlib
matplotlib.use(“pgf”)
带有自定义前导码的pgf前导码={
“text.usetex”:正确,
“序言部分”:[
r“\usepackage{hyperref}”
]
}
matplotlib.rcParams.update(带有自定义前导的pgf_)
从matplotlib导入pyplot作为plt
x=范围(5)
y=范围(5)
图=plt.图()
ax=图添加_子批次(111)
ax.plot(x,y,“r-”,label=r“超链接:\url{http://google.com}")
ax.图例()
fig.savefig(“mwe.pdf”)

添加超链接在使用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。

对,我正在输出一个SVG,我正在遵循该示例。它适用于图像和散点图,但如果我对文本对象尝试同样的方法,超链接将不会出现。@HH:没错,似乎大多数艺术家类型从未实现过URL。请参阅我编辑的答案,了解一个相当迂回的解决方法。这非常需要您的帮助。我会尝试一下;我在这里找到了一个效果也相当不错的解决方案:不过,快速提示:Chromium 73无法很好地处理SVG中的100万个点;-)这对我不起作用。我正在使用matplotlib 3.4.1和Jupyter实验室。