在Altair顶层共享数据的多视图图表

时间:2018-06-28 08:03:00

标签: python altair

如何在Altair的top level上创建共享数据的多视图图表?

例如,我们如何避免以下情况,即在规范中重复两次数据集:

import altair as alt
import pandas as pd
data = pd.DataFrame({'x': [1.1, 2.5, 3.2], 'y': [0.8, 1.1, 2.7]})
c1 = alt.Chart(data).mark_point().encode(x='y', y='x')
c2 = alt.Chart(data).mark_bar().encode(x='y', y='x')
chart = c1 | c2

2 个答案:

答案 0 :(得分:2)

正如提到的其他答案一样,当前的最佳模式是直接在顶层图表中指定数据。例如:

base = alt.Chart().encode(x='x', y='y')
chart = alt.hconcat(
    base.mark_point(),
    base.mark_bar(),
    data=data
)

alt.vconcatalt.layer可以使用类似的模式。

在Altair 2.2版(此发布中尚未发行)中,有一种内置的方法可以自动将所有数据移到顶层,您可以在相关的pull request中进行阅读。如果您在会话期间运行以下代码:

alt.data_transformers.consolidate_datasets = True

然后,即使在图表中多次引用,在图表中使用的每个唯一数据集也只会在顶层指定一次:

import altair as alt
import pandas as pd

print(alt.__version__)  # 2.2.0dev0

alt.data_transformers.consolidate_datasets = True

data = pd.DataFrame({'x': [1.1, 2.5, 3.2], 'y': [0.8, 1.1, 2.7]})
base = alt.Chart(data).encode(x='y', y='x')
chart = base.mark_bar() | base.mark_point()
print(chart.to_dict())

# {'$schema': 'https://vega.github.io/schema/vega-lite/v2.5.2.json',
#  'config': {'view': {'height': 300, 'width': 400}},
#  'datasets': {'data-3a2675f17784b0259a9c377073f400f2': [{'x': 1.1, 'y': 0.8},
#    {'x': 2.5, 'y': 1.1},
#    {'x': 3.2, 'y': 2.7}]},
#  'hconcat': [{'data': {'name': 'data-3a2675f17784b0259a9c377073f400f2'},
#    'encoding': {'x': {'field': 'y', 'type': 'quantitative'},
#     'y': {'field': 'x', 'type': 'quantitative'}},
#    'mark': 'bar'},
#   {'data': {'name': 'data-3a2675f17784b0259a9c377073f400f2'},
#    'encoding': {'x': {'field': 'y', 'type': 'quantitative'},
#     'y': {'field': 'x', 'type': 'quantitative'}},
#    'mark': 'point'}]}

目前正在讨论是否应将其作为默认行为。参见https://github.com/altair-viz/altair/issues/981。我倾向于“是”,但我担心在极端情况下会出现问题。

答案 1 :(得分:0)

我们可以使用顶级对象HConcatChartVConcatChartLayerChart

一个例子如下:

import altair as alt
import pandas as pd
data = pd.DataFrame({'x': [1.1, 2.5, 3.2], 'y': [0.8, 1.1, 2.7]})
c1 = alt.Chart().mark_point().encode(x='y', y='x')
c2 = alt.Chart().mark_bar().encode(x='y', y='x')
chart = alt.HConcatChart(data, hconcat=[c1,c2])