【问题标题】:python, matplotlib, svg and hyperlinks in text labels文本标签中的 python、matplotlib、svg 和超链接
【发布时间】:2019-01-10 11:11:42
【问题描述】:

matplotlib,可以create SVG figures with hyperlinks

例如,我可以使用scatter 方法来绘制标记,这样每个单独的标记都是一个超链接。

但是,我的一些标记具有我使用 text 方法创建的文本标签。我能以某种方式将文本标签也变成超链接吗?


到目前为止,我已经能够实现以下目标。首先,创建一个带有边界框的文本标签,以便bbox 字典有一个url 参数:

ax.text(x, y, label, bbox=dict(boxstyle=..., url=url))

然后稍微修补matplotlib/backends/backend_svg.py(版本1.1.1),替换

self.writer.end('</a>')

self.writer.end('a')

现在它几乎可以工作了。我可以单击 包围 文本的区域,但不能单击文本本身(否则,如果我在白色背景上有黑色文本,我可以单击白色部分的任意位置,但不能单击黑色部分)。


将整个文本标签转换为超链接(文本及其边界框)的最简单方法是什么?

理想情况下,我更喜欢不需要修补 matplotlib 库的解决方案。

【问题讨论】:

  • 看起来你发现了一个错误。您介意在 github.com/matplotlib/matplotlib 问题跟踪器上报告它吗?如果您渴望,这也将做出相当可行的第一次贡献。 ;-) HTH
  • @pelson:嗯,&lt;/a&gt; 部分当然是一个错误,如果有人修复它当然会很棒。但是,主要问题是缺少一些功能,我不知道这些功能是否会在 Matplotlib 中实现。我真的等不及了,因此我一直在寻找一些可以在我自己的代码中使用的技巧。我已经在做诸如后期处理 Matplotlib 生成的 SVG 代码之类的事情,所以我不介意这些技巧是否丑陋。 :)

标签: python hyperlink svg matplotlib


【解决方案1】:

matplotlib git 中的This change 允许将 Text 对象的 URL 字段渲染为渲染 SVG 中的链接。

包含@travc 的代码可能如下所示:

url = "https://matplotlib.org/"
txt = plt.text(x, y, url, url=url, bbox = dict(color='w', alpha=0.01, url=url)

【讨论】:

  • 这是非常酷的 IMO。从 1.3.1 开始,仅对艺术家使用 set_url() 似乎适用于除实际文本之外的所有内容。 mtd 的小补丁修复了该问题(它已被合并,因此可以只更新 matplotlib)。
  • 人们可能还想将文本的背景设为链接。对于 1.3.1,可以通过以下方式轻松完成:txt = text(x,y,'something', url='something')txt.set_bbox(dict(color='w', alpha=0.01, url=txt.get_url()) 颜色和 alpha 有点骇人听闻……如果颜色为 none 或 alpha,至少版本 1.3.1 似乎不会创建框是 0。
【解决方案2】:

以下解决方案似乎可以正常工作。

  • 将文本元素的gid属性设置为唯一字符串:

    ax.text(x, y, label, gid='foo')
    
  • 照常创建 SVG 文件;还没有超链接。

  • 使用,例如,lxml 来解析 SVG 文件。查找具有属性id="foo" 的唯一&lt;g&gt; 元素。修改 XML 树:将 &lt;g&gt;...&lt;/g&gt; 替换为 &lt;a ...&gt;&lt;g&gt;...&lt;/g&gt;&lt;/a&gt;。保存结果。

同样的方法似乎普遍适用;许多元素接受gid 参数。

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多