控制高空区域的堆叠顺序

时间:2019-04-16 04:46:24

标签: python altair

我有一个mark_area图表以明显荒谬的顺序堆叠。我更喜欢对最底部的图层进行排序,并在上方进行排序。

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

enter image description here

我尝试举一个玩具示例:

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

这会自动生成如下图表:

enter image description here

我试图重用其他地方的咒语,但它们无声无息。无论我使用“升序”还是“降序”:

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

1 个答案:

答案 0 :(得分:1)

您可以使用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('measure:Q', sort='descending')
)

enter image description here