Saving Altair Charts#

Altair chart objects have a Chart.save() method which allows charts to be saved in a variety of formats.

JSON format#

The fundamental chart representation output by Altair is a JSON string format; one of the core methods provided by Altair is Chart.to_json(), which returns a JSON string that represents the chart content. Additionally, you can save a chart to a JSON file using Chart.save(), by passing a filename with a .json extension.

For example, here we save a simple scatter-plot to 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')

The contents of the resulting file will look something like this:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
  "config": {
    "view": {
      "continuousHeight": 300,
      "continuousWidth": 400
    }
  },
  "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": "point"
}

This JSON can then be inserted into any web page using the vegaEmbed library.

HTML format#

If you wish for Altair to take care of the HTML embedding for you, you can save a chart directly to an HTML file using

chart.save('chart.html')

This will create a simple HTML template page that loads Vega, Vega-Lite, and vegaEmbed, such that when opened in a browser the chart will be rendered.

For example, saving the above scatter-plot to HTML creates a file with the following contents, which can be opened and rendered in any modern javascript-enabled web browser:

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@4"></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/v4.json",
      "config": {
        "view": {
          "continuousHeight": 300,
          "continuousWidth": 400
        }
      },
      "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": "point"
    };
    var opt = {"renderer": "canvas", "actions": false};
    vegaEmbed("#vis", spec, opt);
  </script>
</body>
</html>

You can view the result here: chart.html.

By default, canvas is used for rendering the visualization in vegaEmbed. To change to svg rendering, use the embed_options as such:

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

Note

This is not the same as alt.renderers.enable('svg'), what renders the chart as a static svg image within a Jupyter notebook.

PNG, SVG, and PDF format#

To save an Altair chart object as a PNG, SVG, or PDF image, you can use

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

However, saving these images requires some additional extensions to run the javascript code necessary to interpret the Vega-Lite specification and output it in the form of an image.

Altair can do this via the altair_saver package, which can be installed with:

$ conda install altair_saver

or:

$ pip install altair_saver

See the altair_saver documentation for information about additional installation requirements.

Figure Size/Resolution#

When using chart.save() above, the resolution of the resulting PNG is controlled by the resolution of your screen. The easiest way to produce a higher-resolution PNG image is to scale the image to make it larger, and thus to contain more pixels at a given resolution.

This can be done with the scale_factor argument, which defaults to 1.0:

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