在Altair中标记分层图表(Python)

时间:2020-01-26 19:34:31

标签: python altair

我正在尝试在Altair中创建两个分层的直方图(每个垂直直尺)。我想要一个传说来标记这四个标签。

我正在使用可以here找到的第一个“我的体重”数据

我的代码(很长,很抱歉)看起来像这样:

for

最终的分层图表如下所示: https://i.stack.imgur.com/OR9f4.png

我只想用一个图例指定哪个直方图/均值属于什么。

如果我也可以给它们着色,并且也许以这种方式添加图例,那也很好,但是我不确定如何这样做。

感谢您的见解!

2 个答案:

答案 0 :(得分:3)

您应该在整个数据集上使用颜色编码,而不是手动创建带有过滤数据的图层:这样,图例将自动生成。

例如:

import altair as alt
import pandas as pd

babyData = pd.read_csv('https://www.stat.berkeley.edu/users/statlabs/data/babiesI.data', delim_whitespace=True)

base = alt.Chart(babyData).transform_filter(
    'datum.smoke != 9'
)

hist = base.mark_bar(opacity=0.5).encode(
    alt.X("bwt:Q",title='Birth Weight (Ounces)', bin=True),
    alt.Y('count()', title='Count'),
    color='smoke:N'
).properties(
    width=400,
    height=400
)

mean = base.mark_rule().encode(
    x='mean(bwt):Q',
    size=alt.value(4),
    color='smoke:N'
)

hist + mean

enter image description here

从那里开始,您可以对每个标记使用Customize the color schemes的标准方法。

答案 1 :(得分:2)

@jakevdp击败了我!我打算说同样的话。这是一个完整的示例供您使用。

import pandas as pd
import altair as alt

# Link to data source
URL =  'https://www.stat.berkeley.edu/users/statlabs/data/babiesI.data'
# Read data into a pandas dataframe
df = pd.read_table(URL, sep='\s+')

hist = alt.Chart(df).mark_area(
    opacity=0.7,
    interpolate='step'
).encode(
    alt.X("bwt:Q", axis=alt.Axis(title='Birth Weight (Ounces)'), bin=True),
    alt.Y('count()', axis=alt.Axis(title='Count'), stack=None), 
    alt.Color('smoke:N')
).properties(
    width=400,
    height=400
).transform_filter(alt.datum.smoke != 9)

rule = alt.Chart(df).mark_rule(color='red').encode(
    alt.Detail('smoke:N'),
    alt.Color('smoke:N'),
    alt.X('mean(bwt):Q'),
    size=alt.value(4), 
).transform_filter(alt.datum.smoke != 9)

hist + rule