Altair 中带有标签值的分层或多面条形图
Layered or Facet bar plot with label values in Altair
我正在尝试创建一个简单的条形图(针对特定字段有多个列):
bars = alt.Chart(df_probing).mark_bar(stroke='transparent').encode(
alt.X('model_name:N', scale=alt.Scale(rangeStep=12), axis=alt.Axis(title='')),
alt.Y('acc:Q', axis=alt.Axis(title='Accuracy', grid=False)),
color=alt.Color('model_name:N'),
column='task_name:N'
).configure_view(
stroke='transparent'
).configure_axis(
domainWidth=0.8
)
现在,这个图效果很好,但是当我尝试在条形图顶部添加值标签时 like this:
text = bars.mark_text(
align='center',
).encode(
text='acc:Q'
)
bars + text
它抛出以下错误:
ValueError: Objects with "config" attribute cannot be used within LayerChart. Consider defining the config attribute in the LayerChart object instead.
如何将条形标签添加到 facet/layered 图上条形图中的每个条形?
configure_*
方法只对顶级图表有效;该错误试图告诉您这一点,但它并不像它应该的那样清楚。
解决方法是将配置移动到顶层对象;也就是说,做这样的事情:
bars = alt.Chart(df_probing).mark_bar(stroke='transparent').encode(
alt.X('model_name:N', title='', scale=alt.Scale(rangeStep=12)),
alt.Y('acc:Q', title='Accuracy', axis=alt.Axis(grid=False)),
color='model_name:N',
column='task_name:N'
)
text = bars.mark_text(
align='center',
).encode(
text='acc:Q'
)
alt.layer(bars, text).configure_view(
stroke='transparent'
).configure_axis(
domainWidth=0.8
)
我正在尝试创建一个简单的条形图(针对特定字段有多个列):
bars = alt.Chart(df_probing).mark_bar(stroke='transparent').encode(
alt.X('model_name:N', scale=alt.Scale(rangeStep=12), axis=alt.Axis(title='')),
alt.Y('acc:Q', axis=alt.Axis(title='Accuracy', grid=False)),
color=alt.Color('model_name:N'),
column='task_name:N'
).configure_view(
stroke='transparent'
).configure_axis(
domainWidth=0.8
)
现在,这个图效果很好,但是当我尝试在条形图顶部添加值标签时 like this:
text = bars.mark_text(
align='center',
).encode(
text='acc:Q'
)
bars + text
它抛出以下错误:
ValueError: Objects with "config" attribute cannot be used within LayerChart. Consider defining the config attribute in the LayerChart object instead.
如何将条形标签添加到 facet/layered 图上条形图中的每个条形?
configure_*
方法只对顶级图表有效;该错误试图告诉您这一点,但它并不像它应该的那样清楚。
解决方法是将配置移动到顶层对象;也就是说,做这样的事情:
bars = alt.Chart(df_probing).mark_bar(stroke='transparent').encode(
alt.X('model_name:N', title='', scale=alt.Scale(rangeStep=12)),
alt.Y('acc:Q', title='Accuracy', axis=alt.Axis(grid=False)),
color='model_name:N',
column='task_name:N'
)
text = bars.mark_text(
align='center',
).encode(
text='acc:Q'
)
alt.layer(bars, text).configure_view(
stroke='transparent'
).configure_axis(
domainWidth=0.8
)