2013-03-14 183 views
2

我已經使用matplotlib在Python中創建了一個圖。在標註每行之後,我想使標籤成爲一個超鏈接(或者,也可以將行本身設爲超鏈接)。該文本項目有一個名爲'網址'的屬性,但我已經嘗試過了,我無法弄清楚它有什麼作用。Python matlplotlib將超鏈接添加到文本

是否可以將文字或線條對象變爲超鏈接?

回答

3

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,但它有一些缺點。最值得注意的是,似乎你必須在數據座標中手動設置文本大小,所以可能需要一些小小的操作才能找到相對於繪製的數據幅度來說文本大小不是太大或太小的文本大小。

+0

對,我輸出一個SVG和我下面這個例子。它適用於圖像和散點圖,但如果我爲文本對象嘗試相同的操作,超鏈接不會出現。 – 2013-03-14 18:47:38

+1

@HH:你說的對,大多數藝術家類型似乎沒有實現URL。看到我編輯的答案是一個相當迂迴的解決方法。 – BrenBarn 2013-03-14 19:35:10

+0

這對你的幫助很大。我會稍微嘗試一下;我在這裏找到了一個相當好的解決方案:http://stackoverflow.com/questions/12387585/python-matplotlib-svg-and-hyperlinks-in-text-labels – 2013-03-14 20:15:08

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")