Python 带标签的牵牛星流图

Python 带标签的牵牛星流图,python,altair,Python,Altair,我能够在Altair中生成一个漂亮的流图,并且希望添加标签而不是图例。我遵循了这个示例,但它似乎为每个数据点指定了一个标签 import altair as alt from vega_datasets import data source = data.unemployment_across_industries.url stream = ( alt.Chart(source) .mark_area() .encode( alt.X(

我能够在Altair中生成一个漂亮的流图,并且希望添加标签而不是图例。我遵循了这个示例,但它似乎为每个数据点指定了一个标签

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')

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

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')

您正在指定
month(date)
作为文本的x编码,这意味着您希望每个月都有一个文本标记。如果需要单个文本标记,则应使用聚合或单个值。我会回答你的问题,但你还没有弄清楚你的预期产出是什么。你希望文本标记出现在哪里?我希望标签在每一个区域的中间,像这样:根据你所看到的数据,这是相当简单的,但是看起来上面的代码中没有足够的空间把标签放在每一个区域。我只是以这些数据为例,在我的实际数据集中我有更多的空间。也许我从Tableau的角度来处理这个问题太多了,我不一定要使用它,但我想知道它作为PoC是如何工作的。您正在指定
month(date)
作为文本的x编码,这意味着您希望每个月都有一个文本标记。如果需要单个文本标记,则应使用聚合或单个值。我会回答你的问题,但你还没有弄清楚你的预期产出是什么。你希望文本标记出现在哪里?我希望标签在每一个区域的中间,像这样:根据你所看到的数据,这是相当简单的,但是看起来上面的代码中没有足够的空间把标签放在每一个区域。我只是以这些数据为例,在我的实际数据集中我有更多的空间。也许我从图表的角度来处理这个问题太多了,我不一定要使用这个,但我想知道它作为PoC是如何工作的。