Как уже упоминалось в других ответах, в настоящее время лучшим вариантом для этого является указание данных непосредственно в диаграмме верхнего уровня. Например:
base = alt.Chart().encode(x='x', y='y')
chart = alt.hconcat(
base.mark_point(),
base.mark_bar(),
data=data
)
Аналогичный шаблон можно использовать с alt.vconcat
и alt.layer
.
В версии 2.2 Altair (которая еще не выпущена на момент публикации) есть встроенный способ автоматического перемещения всех данных на верхний уровень, о котором вы можете прочитать в соответствующем запросе pull . Если вы запустили следующий код во время сеанса:
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. Я сильно склоняюсь к да, но немного беспокоюсь о том, чтобы сломать вещи в угловых случаях.