带标签的 Altair 流图

Altair stream graph with labels

我能够在 Altair 中生成一个漂亮的流图,并且想添加标签而不是图例。我按照这个例子 https://altair-viz.github.io/gallery/stacked_bar_chart_with_text.html,但它似乎为每个数据点分配了一个标签。

import altair as alt
from vega_datasets import data

source = data.unemployment_across_industries.url

stream = (
    alt.Chart(source)
    .mark_area()
    .encode(
        alt.X(
            "yearmonth(date):T", axis=alt.Axis(format="%Y", domain=False, tickSize=0)
        ),
        alt.Y("sum(count):Q", stack="center", axis=None),
        alt.Color("series:N", scale=alt.Scale(scheme="category20b")),
    )
)

text = (
    alt.Chart(source)
    .mark_text(dx=-15, dy=3, color='white')
    .encode(
       alt.X(
            "yearmonth(date):T", axis=alt.Axis(format="%Y", domain=False, tickSize=0)
        ),
        alt.Y("sum(count):Q", stack="center", axis=None),
        alt.Color("series:N", scale=alt.Scale(scheme="category20b")),
        detail="series:N",
        text=alt.Text("series:N", format=".1f"),
    )
)

stream + text

或者我试过这个,但它变得更糟。

text = stream.mark_text(
align="left",
baseline="middle",
dx=3, 
).encode(text="series:N")

如有任何帮助,我们将不胜感激。

您可以创建一个专门用于标记的数据框:

import altair as alt
from vega_datasets import data

source = data.unemployment_across_industries().query("series in ['Agriculture', 'Finance']")

stream = (
    alt.Chart(source)
    .mark_area()
    .encode(
        alt.X("yearmonth(date):T", axis=alt.Axis(format="%Y")),
        alt.Y("sum(count):Q", stack="center", axis=None),
        alt.Color("series:N", scale=alt.Scale(scheme="category20b"))))

text_df = pd.DataFrame({'x': ['2005', '2005'], 'y': [650, 450], 'text': ['Agriculture', 'Finance']})
stream + alt.Chart(text_df).mark_text(color='white').encode(
    x='x:T',
    y='y',
    text='text')