pygal渲染png/svg黑色图片

问题描述 投票:0回答:4

我正在使用 python(在 LinuxMint 中带有虚拟环境),我安装了

pygal

一切正常(渲染为 html),但无法渲染为 svg 或 png 。 结果:只有黑色背景。

我安装了

cssselect
tinycss
,就像这里提到的那样。

第一次可以用,但重试时,我遇到了同样的问题。

(我不知道这是否相关,但是我上周使用 darktable 导出照片时发生了这种情况)

我使用的是pygal网站上的例子:

import pygal                                                       # First import pygal
bar_chart = pygal.Bar()                                            # Then create a bar graph object
bar_chart.add('Fibonacci', [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])  # Add some values
bar_chart.render_to_file('bar_chart.svg')                          # Save the svg to a file

编辑:

bar_chart.render_to_png('bar_chart.png')

现在正在工作。

但不是:

bar_chart.render_to_file('bar_chart.svg')
python svg rendering data-visualization pygal
4个回答
32
投票

您还需要安装lxml。因此,假设您位于 virtualenv 中,请在 bash/zsh 提示符下运行以下命令:

pip install lxml

如果你只有其他 3 个库,即 cssselect、pycairo、tinycss。然后您将能够正确渲染 SVG,但 PNG 渲染功能将生成纯黑色图像文件(无需安装 lxml)

下面的要点显示了所有步骤:

[首先:安装所需的库]

  • pip install lxml
  • pip install cairosvg
  • pip install tinycss
  • pip install cssselect

[第二:创建文件]

#Create a PNG file with Pygal
import pygal

bar_chart = pygal.Bar()
bar_chart.add('Fibonacci', [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
bar_chart.render_to_file('bar_chart.svg')
bar_chart.render_to_png(filename='bar_chart.png')

如果您在图像查看器 (Ubuntu) 或 Gimp 中获得黑色 svg 图像,请尝试在 Chrome 中打开该图像。


1
投票

以防万一其他人遇到类似的情况,我的问题是 SVG 在浏览器中看起来很好,但在 Inkscape 中则不然。我使用自定义 CSS,并在某些元素上设置

fill: transparent
。应该是
fill: none


1
投票

1)按照文档安装依赖项(http://pygal.org/en/stable/installing.html

pip install lxml
pip install cairosvg
pip install tinycss
pip install cssselect

2)创建图表并渲染到文件

line_chart.render_to_file(file_svg_name)

3)再次创建 svg(使用相同的文件),但使用 cairo lib

import cairosvg
cairosvg.svg2svg(url=file_svg_name, write_to=file_svg_name)

它对我有用。


0
投票

我在尝试使用 Inkscape 转换 pygal 制作的 svgs 时遇到了这个问题。 Firefox 和 Chrome 可以很好地显示它们,但 Inkscape 会绘制黑色块。

我发现指定为

rgba(0, 0, 0, 0.9)
的颜色不适用于 inkscape,但
#f8fD00
可以使用。

我在pygal中选择了SolidColorStyle,它恰好只使用了#形式。

© www.soinside.com 2019 - 2024. All rights reserved.