altair 多面直方图 - 独立尺度

Posted

技术标签:

【中文标题】altair 多面直方图 - 独立尺度【英文标题】:altair faceted histogram - independent scales 【发布时间】:2020-07-05 11:07:00 【问题描述】:

假设我有一个数据集,其中变量的缩放比例可以完全不同。我想为每个数字变量创建直方图。我试图使 x 和 y 比例相互独立,这样比例就不会影响视觉质量。但即使我使用resolve_scale(),它也只会使 y 尺度独立,而 x 在所有变量中仍然很常见。从下图可以看出,应用代码就可以得到。这是期望的行为还是我错过了什么?

我的问题是: 1. 如何使 x 刻度独立? 2、如何让标题更贴近剧情?

感谢您的帮助。

版本:python altair 4.0

alt.__version__
'4.0.1'
import altair as alt

data = alt.datasets.load_dataset('flights-2k')
chosen_origin_airports = data.groupby('origin').size().sort_values(ascending=False).head(12).index.tolist()
data = data[data.origin.isin(chosen_origin_airports)]
data.loc[data.origin=='BWI', 'delay']  = data.loc[data.origin=='BWI', 'delay'] * (10000)

alt.Chart(data=data).mark_bar().encode(
    x = alt.X('delay:Q', 
              axis=alt.Axis(title=''), 
              scale=alt.Scale(zero=False),
              bin=alt.Bin(maxbins=20)),
    y = alt.Y('count():Q', 
              axis=alt.Axis(title='')),
    color = alt.Color('origin:N')
).properties(
    width=130,
    height=130
).facet(
    alt.Column('origin:N', sort = alt.EncodingSortField(order=None)),
    align= 'all',
    padding=0,
    columns=4,
    spacing=0
).properties(
    title=''
).configure_title(
    fontSize=20,
    font='Courier',
    anchor='middle',
    color='gray',
    align='left'
).configure_header(
    title=None,
    titleColor='green',
    titleFontSize=14,
    labelColor='forestgreen',
    labelFontSize=14
).resolve_axis(
    x='independent',
    y='independent'
).resolve_scale(
    x='independent', 
    y='independent'
)

【问题讨论】:

【参考方案1】:

您的秤是独立的,但您的分箱不是。不幸的是,Vega-Lite 语法没有提供简单的方法来定义将不同 bin 参数应用于不同数据子集的 bin 变换,因此您必须为图表的每个面板手动使用不同的 bin 变换。

我可能会这样做:

chart = alt.Chart(data).mark_bar().encode(
    x = alt.X('delay:Q', 
              axis=alt.Axis(title=''), 
              scale=alt.Scale(zero=False),
              bin=alt.Bin(maxbins=20)),
    y = alt.Y('count():Q', 
              axis=alt.Axis(title='')),
    color = alt.Color('origin:N')
).properties(
    width=130,
    height=130
)

alt.ConcatChart(
    concat=[
      chart.transform_filter(alt.datum.origin == value).properties(title=value)
      for value in sorted(data.origin.unique())
    ],
    columns=4
).configure_title(
    fontSize=20,
    font='Courier',
    anchor='middle',
    color='gray',
    align='left'
).resolve_axis(
    x='independent',
    y='independent'
).resolve_scale(
    x='independent', 
    y='independent'
)

【讨论】:

天哪,这确实很难。我们如何向上或向下移动每个子图的标题? 另外,我们如何才能将垃圾箱的数量固定在 20 个? 这里列出了控制自动分箱的旋钮:altair-viz.github.io/user_guide/generated/core/…。您可以指定 maxbins,但如果不为每个数据集指定明确的范围和步长,则无法指定确切的 bin 数量(在自动分箱中,vega-lite 优先考虑具有合理的 bin 边缘而不是具有精确的 bin 计数) 感谢您的帮助,杰克。顺便说一句,我喜欢 altair,它看起来很整洁。潜力巨大。

以上是关于altair 多面直方图 - 独立尺度的主要内容,如果未能解决你的问题,请参考以下文章

对从大型数据集中聚合的数据使用 Altair

在ggplot2中分别标准化多面直方图

使用 Matplotlib 在对数尺度上绘制直方图

Staple: Complementary Learners for Real-Time Tracking——笔记

图像特征提取方法

MSCOCO目标尺度分布的统计工具