Altair:如何向具有行的条形图添加标签

Altair: How to add labels to bar charts that have rows

在尝试向具有行的 Altair 条形图添加标签时,我收到 SchemaValidationError。我说的是像这里这样的标签: https://altair-viz.github.io/gallery/bar_chart_with_labels.html

我说的是带行或 "horizontal grouped bar charts" 的条形图,如下所示: https://altair-viz.github.io/gallery/grouped_bar_chart_horizontal.html

这是不起作用的代码:

from vega_datasets import data

source = data.barley()

bars = alt.Chart(source).mark_bar().encode(
    x='sum(yield):Q',
    y='year:O',
    row='variety:N',
)
bars

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='sum(yield):Q'
)

bars + text

如果我删除条形图中的行选项,它会按预期工作:

bars = alt.Chart(source).mark_bar().encode(
    x='sum(yield):Q',
    y='year:O'
)
bars

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='sum(yield):Q'
)

bars + text

将行添加到 'mark_text' 方法也无济于事...

最后,我希望看到栏右侧的标签,如下所示: https://imgur.com/KFJtNkb

您的代码片段中的错误是

ValueError: Faceted charts cannot be layered.

一般来说,不能保证两个分面图会有匹配的分面可以分层,所以Vega-Lite不允许分面图分层。

解决这个问题的方法是对分层图表进行分面,而不是对多面图表进行分层。例如:

import altair as alt
from vega_datasets import data

source = data.barley()

bars = alt.Chart(source).mark_bar().encode(
    x='sum(yield):Q',
    y='year:O',
)
bars

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='sum(yield):Q'
)

(bars + text).facet(row='variety:N')