Рисунок сохранения Matplotlib с URL-адресом, поскольку svg приводит к ошибке - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать диаграмму, где каждая полоса также ссылается на URL-адрес.

Однако, когда я пытаюсь сохранить цифру как svg, я получаю сообщение об ошибке AttributeError: 'list' object has no attribute 'replace', исходящей из * 1004 matplotlib * backends_svg.py .

Без url он отлично работает. С gid вместо url поведение такое же

MWE:

fig, ax = plt.subplots()
ax.bar(["A","B"], height=[10, 4], url=["https://en.wikipedia.org/wiki/Main_Page", "https://www.google.com/"])
fig.savefig(filename, format="svg")

Есть предложения, как это исправить?

1 Ответ

1 голос
/ 13 июля 2020

В документах для ax.bar указано, что url должно быть строкой, но вы используете список ...

Почему при использовании списка вместо этого не возникает исключение строки, когда вы вызываете ax.bar?

ax.bar(["A","B"], [10, 4], url=["https://en.wikipedia.org", "https://www.google.com/"])

Поскольку Matplotlib не проверяет тип выражения, которое вы назначаете url. Исключение возникает только тогда, когда серверная часть SVG пытается использовать значение url, в частности, серверная часть предполагает, что имеет дело со строкой и использует строковый метод, но ваше значение является списком и имеет не требуемый метод, поэтому AttributeError: 'list' object has no attribute 'replace'.

Что вы можете сделать, чтобы избежать проблемы, возникающей, когда Matplotlib пытается использовать значение url?

  • Если вы хотите связать ссылку с гистограммой в целом, вы должны использовать одну строку.

  • Если вы хотите связать ссылку с каждым из столбцы на графике вы можете сделать следующим образом

    ...
    bars = plt.bar((1, 2), (3, 4))
    for bar, url in zip(bars, ["https://en.wikipedia.org", "https://www.google.com/"]):
        bar.set_url(url)
    ...
    
    

Конечно, ничто не мешает вам связать ссылку на столбиковый график И с каждым из столбцов, но

bars = plt.bar((1, 2, 3), (3, 4, 5), url='https://www.google.com/0')
for n, bar in enumerate(bars, 1): bar.set_url('https://www.google.com/%d'%n)
plt.savefig('delenda.est', format='svg')

как видите, в файле SVG сохраняются только ссылки, относящиеся к полосам:

$ grep google delenda.est 
    <a xlink:href="https://www.google.com/1">
    <a xlink:href="https://www.google.com/2">
    <a xlink:href="https://www.google.com/3">
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...