将样本编号附加到 altair 中的 X-Labels
Appending sample number to X-Labels in altair
我想自动附加与 altair 图形的 x 标签相对应的示例 #(在括号中)。我愿意在 altair 之外执行此操作,但我认为可能有一种方法可以使用 altair/vega-lite 在图形级别执行此操作。我使用来自 altair/vega 网站(vega_dataset 的一部分)的示例粘贴代码,但使用的是一种陈腐的手动方法,在该方法中,我为其中一个标签显式重命名标签。在这种情况下,我将73的样本编号添加到欧洲。
import altair as alt
from vega_datasets import data
df = data.cars()
df['Origin'] = df['Origin'].replace({'Europe':'Europe (n=73)'})
alt.Chart(df).transform_density(
'Miles_per_Gallon',
as_=['Miles_per_Gallon', 'density'],
extent=[5, 50],
groupby=['Origin']
).mark_area(orient='horizontal').encode(
y='Miles_per_Gallon:Q',
color='Origin:N',
x=alt.X(
'density:Q',
stack='center',
impute=None,
title=None,
axis=alt.Axis(labels=False, values=[0],grid=False, ticks=True),
),
column=alt.Column(
'Origin:N',
header=alt.Header(
titleOrient='bottom',
labelOrient='bottom',
labelPadding=0,
),
)
).properties(
width=100
).configure_facet(
spacing=0
).configure_view(
stroke=None
)
您可以使用 pandas 生成替换字典并将其分配给新的数据框列:
import altair as alt
from vega_datasets import data
df = data.cars()
group_sizes = df.groupby('Origin').size()
replace_dict = group_sizes.index + ' (n=' + group_sizes.astype(str) + ')'
df['Origin_with_count'] = df['Origin'].replace(replace_dict)
alt.Chart(df).transform_density(
'Miles_per_Gallon',
as_=['Miles_per_Gallon', 'density'],
extent=[5, 50],
groupby=['Origin_with_count', 'Origin']
).mark_area(orient='horizontal').encode(
y='Miles_per_Gallon:Q',
color='Origin:N',
x=alt.X(
'density:Q',
stack='center',
impute=None,
title=None,
axis=alt.Axis(labels=False, values=[0],grid=False, ticks=True),
),
column=alt.Column(
'Origin_with_count:N',
header=alt.Header(
title=None,
labelOrient='bottom',
labelPadding=0,
),
)
).properties(
width=100
).configure_facet(
spacing=0
).configure_view(
stroke=None
)
你也许可以用 labelExpr
做一些更优雅的事情,不确定。
您可以用计数覆盖文本标记。
我能够使用以下代码执行此操作。由于某种原因,我无法管理文本的 y 位置(参见 commented-out 行)或在 header labelExpr 中使用 n 数据。
df = data.cars()
violin = alt.Chart(df).transform_density(
'Miles_per_Gallon',
as_=['Miles_per_Gallon', 'density'],
extent=[5, 50],
groupby=['Origin']
).mark_area(orient='horizontal').encode(
y='Miles_per_Gallon:Q',
color='Origin:N',
x=alt.X(
'density:Q',
stack='center',
impute=None,
title=None,
axis=alt.Axis(labels=False, values=[0],grid=False, ticks=True),
),
).properties(width=100)
text = alt.Chart(df).mark_text().transform_aggregate(
cnt='count()',
groupby=["Origin"]
).transform_calculate(
n = "'n=' + datum.cnt",
).encode(
# y=alt.Y('mean(Miles_per_Gallon):Q'),
text=alt.Text('n:N'),
)
(violin + text).facet(
column=alt.Column('Origin:N'),
).configure_header(
labelExpr="[datum.value, datum.n]",
)
我想自动附加与 altair 图形的 x 标签相对应的示例 #(在括号中)。我愿意在 altair 之外执行此操作,但我认为可能有一种方法可以使用 altair/vega-lite 在图形级别执行此操作。我使用来自 altair/vega 网站(vega_dataset 的一部分)的示例粘贴代码,但使用的是一种陈腐的手动方法,在该方法中,我为其中一个标签显式重命名标签。在这种情况下,我将73的样本编号添加到欧洲。
import altair as alt
from vega_datasets import data
df = data.cars()
df['Origin'] = df['Origin'].replace({'Europe':'Europe (n=73)'})
alt.Chart(df).transform_density(
'Miles_per_Gallon',
as_=['Miles_per_Gallon', 'density'],
extent=[5, 50],
groupby=['Origin']
).mark_area(orient='horizontal').encode(
y='Miles_per_Gallon:Q',
color='Origin:N',
x=alt.X(
'density:Q',
stack='center',
impute=None,
title=None,
axis=alt.Axis(labels=False, values=[0],grid=False, ticks=True),
),
column=alt.Column(
'Origin:N',
header=alt.Header(
titleOrient='bottom',
labelOrient='bottom',
labelPadding=0,
),
)
).properties(
width=100
).configure_facet(
spacing=0
).configure_view(
stroke=None
)
您可以使用 pandas 生成替换字典并将其分配给新的数据框列:
import altair as alt
from vega_datasets import data
df = data.cars()
group_sizes = df.groupby('Origin').size()
replace_dict = group_sizes.index + ' (n=' + group_sizes.astype(str) + ')'
df['Origin_with_count'] = df['Origin'].replace(replace_dict)
alt.Chart(df).transform_density(
'Miles_per_Gallon',
as_=['Miles_per_Gallon', 'density'],
extent=[5, 50],
groupby=['Origin_with_count', 'Origin']
).mark_area(orient='horizontal').encode(
y='Miles_per_Gallon:Q',
color='Origin:N',
x=alt.X(
'density:Q',
stack='center',
impute=None,
title=None,
axis=alt.Axis(labels=False, values=[0],grid=False, ticks=True),
),
column=alt.Column(
'Origin_with_count:N',
header=alt.Header(
title=None,
labelOrient='bottom',
labelPadding=0,
),
)
).properties(
width=100
).configure_facet(
spacing=0
).configure_view(
stroke=None
)
你也许可以用 labelExpr
做一些更优雅的事情,不确定。
您可以用计数覆盖文本标记。
我能够使用以下代码执行此操作。由于某种原因,我无法管理文本的 y 位置(参见 commented-out 行)或在 header labelExpr 中使用 n 数据。
df = data.cars()
violin = alt.Chart(df).transform_density(
'Miles_per_Gallon',
as_=['Miles_per_Gallon', 'density'],
extent=[5, 50],
groupby=['Origin']
).mark_area(orient='horizontal').encode(
y='Miles_per_Gallon:Q',
color='Origin:N',
x=alt.X(
'density:Q',
stack='center',
impute=None,
title=None,
axis=alt.Axis(labels=False, values=[0],grid=False, ticks=True),
),
).properties(width=100)
text = alt.Chart(df).mark_text().transform_aggregate(
cnt='count()',
groupby=["Origin"]
).transform_calculate(
n = "'n=' + datum.cnt",
).encode(
# y=alt.Y('mean(Miles_per_Gallon):Q'),
text=alt.Text('n:N'),
)
(violin + text).facet(
column=alt.Column('Origin:N'),
).configure_header(
labelExpr="[datum.value, datum.n]",
)