控制牵牛星区域的堆叠顺序

Controlling stack-order of an altair area

我有一张 mark_area 图表,该图表以明显无意义的顺序堆叠。我更喜欢订购底部最大的层,上面递减。

这是图表的图片,标有首选顺序:

我试着做了一个玩具示例:

import random
import altair as alt

seed = {"date": pd.date_range('1/1/2019',periods=20,freq="M"),
        "jack": random.sample(range(100, 500), 20), 
        "roy":random.sample(range(20, 90), 20),
        "bill":random.sample(range(600, 900), 20), 
        }

df = pd.DataFrame.from_dict(seed)
df = df.melt(id_vars="date", var_name="person", value_name="measure")
alt.renderers.enable('notebook')
alt.Chart(df).mark_area().encode(
                        x=alt.X(
                            'date',                        
                        ),
                        y=alt.Y(
                            'measure',
                        ),
                        color='person',                                                                               
                )

这会自动生成如下图表:

我尝试重用在别处找到的一些咒语,但它们默默无闻。使用 'ascending' 或 'descending':

没有区别
alt.Chart(df).mark_area().encode(
                        x=alt.X(
                            'date',                        
                        ),
                        y=alt.Y(
                            'measure',
                             sort=alt.EncodingSortField(
                                field="measure",
                                op="sum",
                                order="ascending")  
                        ),
                        color='person',                                                                               
                )

您可以使用order 通道来控制堆叠顺序。例如:

import random
import altair as alt
import pandas as pd

df = pd.DataFrame({
    "date": pd.date_range('1/1/2019',periods=20,freq="M"),
    "jack": random.sample(range(100, 500), 20), 
    "roy":random.sample(range(20, 90), 20),
    "bill":random.sample(range(600, 900), 20), 
})
df = df.melt(id_vars="date", var_name="person", value_name="measure")
alt.Chart(df).mark_area().encode(
    x='date',       
    y='measure',
    color='person',
    order=alt.Order('sum(measure):Q', sort='descending')
)


编辑:如果排名不一致,您可以使用 joinaggregate transform 来定义整个图表的统一顺序。例如:

import random
import altair as alt
import pandas as pd

df = pd.DataFrame({
    "date": pd.date_range('1/1/2019',periods=20,freq="M"),
    "jack": random.sample(range(100, 500), 20), 
    "roy":random.sample(range(20, 200), 20),
    "bill":random.sample(range(600, 900), 20), 
})
df = df.melt(id_vars="date", var_name="person", value_name="measure")

alt.Chart(df).transform_joinaggregate(
    order='sum(measure)',
    groupby=['person']
).mark_area().encode(
    x='date',       
    y='measure',
    color='person',
    order=alt.Order('order:Q', sort='descending')
)