控制牵牛星区域的堆叠顺序
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')
)
我有一张 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')
)