单个HTML /页面中的多个交互式图形

时间:2019-08-28 15:27:28

标签: python altair

altair中是否有一个功能可以在单个页面/ HTML中集成多个图形?

我正在从多个.csv文件生成图形,我能够分别保存图形,但是正在寻找一种保存在单个“ html”中的方法。

我在这里找到了一个类似的问题:altair-viz/altair#1422,尽管找不到有关其实现的示例以供参考。任何人都可以在此分享一个例子。

谢谢

1 个答案:

答案 0 :(得分:2)

如果要将多个图表合并为一个图表,可以使用串联:

(chart1 | chart2).save('charts.html')

如果出于某种原因您希望将图表分别渲染并将两个渲染图嵌入到单个HTML页面中,则可以这样做,但是Altair没有内置功能。<​​/ p>

最好的方法是直接使用vega-embed构建HTML模板,并将chart.to_json()的输出插入模板中的正确位置。

这是一个简单的示例,您可以根据需要使用标准HTML / CSS方法来自定义布局:

import altair as alt
import pandas as pd

two_charts_template = """
<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vega@{vega_version}"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@{vegalite_version}"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-embed@{vegaembed_version}"></script>
</head>
<body>

<div id="vis1"></div>
<div id="vis2"></div>

<script type="text/javascript">
  vegaEmbed('#vis1', {spec1}).catch(console.error);
  vegaEmbed('#vis2', {spec2}).catch(console.error);
</script>
</body>
</html>
"""


df = pd.DataFrame({'x': range(5), 'y': range(5)})

chart1 = alt.Chart(df).mark_point().encode(x='x', y='y')
chart2 = alt.Chart(df).mark_line().encode(x='x', y='y')

with open('two_charts.html', 'w') as f:
    f.write(two_charts_template.format(
        vega_version=alt.VEGA_VERSION,
        vegalite_version=alt.VEGALITE_VERSION,
        vegaembed_version=alt.VEGAEMBED_VERSION,
        spec1=chart1.to_json(indent=None),
        spec2=chart2.to_json(indent=None),
    ))