【问题标题】:IPython.display: SVG cannot render a svg image generated by svg_filter_line (official example)IPython.display:SVG 无法渲染 svg_filter_line 生成的 svg 图像(官方示例)
【发布时间】:2019-10-24 03:38:32
【问题描述】:

我正在使用 Python3 在 MacOS 上的 Jupyter 中运行 svg_filter_line(官方示例)。

SVG 适用于大量 svg 图像(例如来自 wiki 的 Worldmap 图像)

svg_filter_line 的原始编码也很好用。

运行 svg_filter_line 会生成一个名为“svg_filter_line.svg”的 svg 图像。

SVG 无法渲染此 svg 图像“svg_filter_line.svg”,没有错误,没有警告。

【问题讨论】:

  • 只有一个 svg_filter_line.svg 文件。 “普通的东西”是什么意思?
  • 有趣。我最初认为浏览器将无法呈现 svg,但如果您在 Firefox 中打开创建的文件,它会按预期呈现。所以 jupyter notebook 和 SVG 之间存在一些相互作用,阻止它被包含在 notebook 页面的 DOM-tree 中。
  • @ImportanceOfBeingErnest Chrome 可以很好地渲染创建的文件 'svg_filter_line.svg' 和其他 svg。看来jupyter cell是唯一不能很好渲染创建文件的地方。
  • 是的,这正是我上面所说的。

标签: python matplotlib svg jupyter-notebook


【解决方案1】:

要做到这一点有点困难。以下是解决方案: 在处理文件时:我发现display()display_svg() 函数显示的文件类型彼此略有不同(差异主要在命名空间中)。作为一种解决方法,必须使用 svgutils 重新保存 SVG 文件,然后读取并显示如下:

import svgutils.transform as sg
from IPython.display import SVG,display

#create new SVG figure
fig = sg.SVGFigure("16cm", "10cm")

# load matpotlib-generated figures
fig1 = sg.fromfile('svg_filter_line.svg')
plot1 = fig1.getroot()
fig.append([plot1])
fig.save("svg_filter_line2.svg")
display(SVG(filename='svg_filter_line2.svg'))

svgutils可以安装如下:

conda install -c conda-forge svgutils

【讨论】:

  • 酷,这是一个不错的解决方案。您对问题的根源有任何想法吗?是否可以将原始示例更改为开箱即用,或者 svgutils 对使其工作的文件做了什么?
  • 我发现,来自IPython.displaySVG(), display() or display_svg() 能够读取svg 文件,但无法显示。然而,他们成功地展示了互联网上可用的 svg。进一步分析表明,原始实现中生成的 SVG 存在命名空间差异。但是,这里的svgutils 不一定是真正的解决方案(取决于您如何定义真正的解决方案)。但是,解决方法中的具体做法是创建一个新的 SVG,然后附加之前创建的 SVG 的内容。
  • (扩展注释)这样,我们能够将现有的 XML 合并到 IPython 可以用来解释和呈现的命名空间中。 (这是一种奇怪的封装或总结)
  • 我将奖励这个赏金,即使它没有解释问题的根源。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 2021-12-22
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多