保存 Altair 图表#

Altair 图表对象有一个 Chart.save() 方法,可以将图表保存为多种格式。

JSON格式#

Altair 输出的基本图表表示形式是 JSON 字符串格式;Altair 提供的核心方法之一是 Chart.to_json(),它返回一个表示图表内容的 JSON 字符串。此外,您可以使用 Chart.save() 将图表保存到 JSON 文件中,通过传递一个带有 .json 扩展名的文件名。

例如,这里我们将一个简单的散点图保存为JSON:

import altair as alt
from vega_datasets import data

chart = alt.Chart(data.cars.url).mark_point().encode(
    x='Horsepower:Q',
    y='Miles_per_Gallon:Q',
    color='Origin:N'
)

chart.save('chart.json')

生成文件的内容大致如下:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "config": {
    "view": {
      "continuousHeight": 300,
      "continuousWidth": 300
    }
  },
  "data": {
    "url": "https://vega.github.io/vega-datasets/data/cars.json"
  },
  "encoding": {
    "color": {
      "field": "Origin",
      "type": "nominal"
    },
    "x": {
      "field": "Horsepower",
      "type": "quantitative"
    },
    "y": {
      "field": "Miles_per_Gallon",
      "type": "quantitative"
    }
  },
  "mark": {"type": "point"}
}

这个 JSON 可以通过 vegaEmbed 库插入到任何网页中。

HTML格式#

如果您希望Altair为您处理HTML嵌入,您可以使用以下方式直接将图表保存为HTML文件

chart.save('chart.html')

这将创建一个简单的HTML模板页面,加载Vega、Vega-Lite和 vegaEmbed,这样在浏览器中打开时图表将被渲染。

例如,将上述散点图保存为HTML会创建一个包含以下内容的文件,该文件可以在任何现代的支持javascript的网页浏览器中打开和渲染:

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
</head>
<body>
  <div id="vis"></div>
  <script type="text/javascript">
    var spec = {
      "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
      "config": {
        "view": {
          "continuousHeight": 300,
          "continuousWidth": 300
        }
      },
      "data": {
        "url": "https://vega.github.io/vega-datasets/data/cars.json"
      },
      "encoding": {
        "color": {
          "field": "Origin",
          "type": "nominal"
        },
        "x": {
          "field": "Horsepower",
          "type": "quantitative"
        },
        "y": {
          "field": "Miles_per_Gallon",
          "type": "quantitative"
        }
      },
      "mark": {"type": "point"}
    };
    var opt = {"renderer": "canvas", "actions": false};
    vegaEmbed("#vis", spec, opt);
  </script>
</body>
</html>

您可以在这里查看结果: chart.html

默认情况下, canvas 用于在 vegaEmbed 中渲染可视化。要更改为 svg 渲染,使用 embed_options 如下:

chart.save('chart.html', embed_options={'renderer':'svg'})

注意

这与 alt.renderers.enable('svg') 不同,它将图表渲染为 Jupyter notebook 中的静态 svg 图像。

离线HTML支持#

默认情况下,通过 chart.save('chart.html') 生成的 HTML 文件会从在线 CDN 位置加载必要的 JavaScript 依赖。这会导致生成一个小的 HTML 文件,但这意味着需要 active internet connection 才能显示图表。

作为替代,可以提供inline=True关键词参数给chart.save以生成一个包含所有必要JavaScript依赖的内联HTML文件。这会导致文件大小增大,但以这种方式生成的HTML文件不需要活动的互联网连接即可显示。

chart.save('chart.html', inline=True)

注意

调用 chart.save 并设置 inline=True 需要 额外依赖

PNG、SVG 和 PDF 格式#

要将Altair图表对象保存为PNG、SVG或PDF图像,可以使用

chart.save('chart.png')
chart.save('chart.svg')
chart.save('chart.pdf')

注意

附加依赖 是通过运行解析Vega-Lite规范并以图像形式输出所需的javascript代码来保存图表为图像所必需的。

altair_saver#

注意

altair_saver 在 Altair 4 及更早版本中使用。它不再维护,已被 vl-convert 取代,后者提供了更优越的用户体验和性能。

PNG图形大小/分辨率#

当使用 chart.save() 创建 PNG 图像时,生成图像的分辨率默认为每英寸 72 像素 (ppi)。要在保持相同物理大小的情况下更改图像的分辨率,可以向 chart.save 提供 ppi 参数。例如,保存分辨率为每英寸 200 像素的图像:

chart.save('chart.png', ppi=200)

要在保持分辨率的情况下改变生成图像的物理大小,可以使用 scale_factor 参数。例如,要以默认分辨率72 ppi将图像保存为默认大小的两倍:

chart.save('chart.png', scale_factor=2)

附加依赖#

将图表保存为图像或离线HTML文件需要vl-convert包:

conda install -c conda-forge vl-convert-python

或:

pip install vl-convert-python

vl-convert 不需要任何外部依赖。 有关信息和已知的 限制,请参阅 vl-convert 文档。

可共享的URL#

Chart.to_url() 方法可以用来构建一个可分享的 URL,打开在线 Vega editor 中的图表规范。

import altair as alt
from vega_datasets import data

chart = alt.Chart(data.cars.url).mark_point().encode(
    x='Horsepower:Q',
    y='Miles_per_Gallon:Q',
    color='Origin:N'
)

chart.to_url()
    'https://vega.github.io/editor/#/url/vega-lite/N4Igxg9gdgZglgcxALlANzgUwO4tJKAFzigFcJSBnAdTgBNCALFAZgAY2AacaYsiygAlMiRoVYcAvpO50AhoTl4QpAE4AbFCDGEADpWQB6Q2DpQAdACtKdTOrhpV5qJkKGougLaG0mBHIBaeUVKV0oAATQARnMAJgBOczZDYLkTOVVKK0poEBkQTwyAa2VCAE9dTC1dCBJxfMwoSDoSJFQedQhVZXg7Oi0AeVVEEhBucsqtKAhPEjlNfIAPHqx1fuQQQS7QmuxMbvGKqo2AR1I5IjhFYl887jKVvq0AWTh1TEoAfUrVT4BxeadKBjEATY4gM4XYjXBxVaTcAAklDAjEwhS0On0Rh8fjk5gQV0YpAARuY4BBDMjUYUcf4AvZCJgfABWOJscwxay5SRAA'