python - 在 Altair fiddle 图上绘制中位数线和四分位数线

标签 python plot altair

假设我有以下情节(取自 Altair 文档中的 tutorial):

import altair as alt
from vega_datasets import data

alt.Chart(data.cars()).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
)

violin_plot

我如何在每个 fiddle 图上绘制四分位数线和中线?我是否必须定义另一个图并将其分层在 fiddle 图之上?如果线条的宽度与分布上特定位置处的 fiddle 图的宽度相同,那就太好了。

最佳答案

是的,您可以在刻面之前将它们分层。需要分别添加到分层图表和多面图表中的内容有点棘手,但类似这样的东西是可行的:

import altair as alt
from vega_datasets import data

violins = alt.Chart().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),
    ),
)

alt.layer(
    violins,
    alt.Chart().mark_rule().encode(
        y='median(Miles_per_Gallon)',
        x=alt.X(),
        color=alt.value('black')),
).properties(
    width=100
).facet(
    data=data.cars(),
    column=alt.Column(
        'Origin:N',
        header=alt.Header(
            titleOrient='bottom',
            labelOrient='bottom',
            labelPadding=0,
        ),
    )
).configure_facet(
    spacing=0
).configure_view(
    stroke=None
)

enter image description here

然后您可以对四分位数执行相同的操作。我不确定除了手动输入值之外,如何将线条限制为区域的宽度,而且我认为这也有点棘手。我建议在 fiddle 内放置一个箱线图:

alt.layer(
    violins,
    alt.Chart().mark_boxplot(size=5, extent=0, outliers=False).encode(
        y='Miles_per_Gallon',
        x=alt.value(46),
        color=alt.value('black')
    )
).properties(
    width=100
).facet(
    data=data.cars(),
    column=alt.Column(
        'Origin:N',
        header=alt.Header(
            titleOrient='bottom',
            labelOrient='bottom',
            labelPadding=0,
        ),
    )
).configure_facet(
    spacing=0
).configure_view(
    stroke=None
)

enter image description here

这类似于 how seaborn handles violinplots by default the original paper by Hintze and Nelson in 1997 中也是这样描述它们的.

enter image description here

关于python - 在 Altair fiddle 图上绘制中位数线和四分位数线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72135370/

相关文章:

python - 解决在 python 中打开 pdf 文件时的路径问题

Python Keras 预测返回 nan

plot - 在 HighStock 的 xAxis 上添加垂直线

r - 星图格式 : keys on the graphs

python - Altair:从偏移量向下指向的条形图

Python-MySQLdb : ValueError - unsupported format - although the use of the execute substitution

python - 按数值对 csv 进行排序

python - pyplot step 函数不为第一个/最后一个点绘制水平

python - 查看转换后的数据

python - 可以使用 Altair 将 mark_rule 扩展到图表之外吗?