Matplotlib:savefig 为具有对数标度 Y 轴的条形图生成不正确的 SVG 图像

Matplotlib: savefig produces incorrect SVG image for bar chart with log-scaled Y-axis

我在尝试将条形图另存为 svg 时遇到问题。具体来说,当我使用 savefig 将条形图保存为 PDF 时,我得到了正确的结果。然而,当我将它保存为 SVG 时,条形图并没有像它们应该的那样终止于 x 轴,而是下降到图形的底部。仅当我对条形图使用对数刻度时才会出现此问题。否则,一切都是笨拙的。

这是将绘图保存为 SVG 和 PDF 的代码:

import matplotlib.pyplot as plt
import numpy as np

N = 10
ind = np.arange(N)
series1 = xrange(N)
series2 = [ N - s1_i for s1_i in series1 ]
fig, ax = plt.subplots()
width = 0.2
rects = [ ax.bar(ind, series1, width, color='r', log=True), 
  ax.bar(ind + width, series2, width, color='b', log=True) ]

plt.savefig("test.pdf")
plt.savefig("test.svg")

下面是两张示例图片:

您可以看到 PDF 版本没有明显的问题。

SVG 版本有未正确剪裁的条,这是错误的。

更新:回应 tcaswell

我正在使用 Ubuntu 14.04(内核版本为 3.16.0)和 Python 2.7.6,Matplotlib 版本 1.3.1,numpy 版本 1.8.2。

我尝试使用 displayrsvg-view-3 查看 SVG,两者显示相同的结果;如果我使用 ImageMagick 的 convert 命令行工具将其转换为 PDF 并使用 evince 或其他查看器(如 acroread)打开它,图像仍然存在缺陷(并不特别令人惊讶)。

这是 librsvg 中已知的 buglibQtSvg 中的限制仅处理非常有限的 SVG 子集(1.2 tiny),根本不包括裁剪)。

svg 将在任何现代浏览器中正确呈现。

https://github.com/matplotlib/matplotlib/issues/4341 上有更长的讨论,但总而言之就是渲染器有问题。