在 Altair 的顶层共享数据的多视图图表
Multi view chart that shares data at the top level in 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
我们可以使用顶级对象HConcatChart, VConcatChart, and LayerChart。
举例如下:
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])
正如提到的其他答案,目前最好的模式是直接在顶级图表中指定数据。例如:
base = alt.Chart().encode(x='x', y='y')
chart = alt.hconcat(
base.mark_point(),
base.mark_bar(),
data=data
)
类似的模式可用于 alt.vconcat
和 alt.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。我非常倾向于是,但我有点担心在极端情况下破坏东西。
我们如何创建在 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
我们可以使用顶级对象HConcatChart, VConcatChart, and LayerChart。
举例如下:
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])
正如提到的其他答案,目前最好的模式是直接在顶级图表中指定数据。例如:
base = alt.Chart().encode(x='x', y='y')
chart = alt.hconcat(
base.mark_point(),
base.mark_bar(),
data=data
)
类似的模式可用于 alt.vconcat
和 alt.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。我非常倾向于是,但我有点担心在极端情况下破坏东西。