2013-03-14 3 views
2

Я создал сюжет в Python, используя matplotlib. После аннотации каждой строки я хотел бы сделать ярлык гиперссылкой (или, альтернативно, сделать линию самой гиперссылкой). Текстовый элемент имеет свойство «url», но я пробовал его, и я не могу понять, что, если угодно, он делает.Python matlplotlib добавить гиперссылку на текст

Можно ли превращать текстовые или линейные объекты в гиперссылки?

ответ

3

This example показывает, как устанавливать гиперссылки, если вы выводите SVG. Обратите внимание, что это имеет смысл только для SVG. Если сюжет - это просто изображение, это просто изображение, а изображения не могут иметь гиперссылок в них.

Если вы хотите, чтобы у вас есть возможность щелкнуть объект в окне интерактивного графика и сделать это как гиперссылку, вы можете создать обработчик событий для обработки события «pick» и открыть браузер или что-то еще , См. this example, как делать события выбора. Графики Matplotlib - это не веб-страницы или даже действительно документы, а просто окна с графикой, отображаемой в них, поэтому они не поддерживают гиперссылки как таковые; используя событие pick, вы можете эмулировать гиперссылку, открывая веб-браузер при щелчке по объекту.

Редактировать: Вы правы, это не работает. Кажется, что свойство URL-адреса считывается и используется только для определенных типов объектов. Googling, я вижу несколько старых списков рассылок 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 и я следовал этому примеру. Он работает для изображений и разброса графиков, но если я попробую одно и то же для текстовых объектов, гиперссылка не появится. –

+1

@ HH: Вы правы, кажется, что URL-адреса никогда не были реализованы для большинства типов исполнителей. См. Мой отредактированный ответ для довольно обходного решения. – BrenBarn

+0

Это для вашей помощи. Я попробую немного; Я нашел решение здесь, которое работает довольно хорошо: http://stackoverflow.com/questions/12387585/python-matplotlib-svg-and-hyperlinks-in-text-labels –

0

Это возможно с П бэкэндом:

#!/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") 
Смежные вопросы