【问题标题】:Broken axis in Altair/VegaAltair/Vega 中的断轴
【发布时间】:2017-08-11 16:04:32
【问题描述】:

我有一个标准化堆积面积图,其中一个变量与其他变量之间存在巨大差异,例如:

df1=pd.DataFrame.from_dict(
    {'YEAR': {0: 2010,
      1: 2010,  2: 2010,  3: 2010,  4: 2011,  5: 2011,  6: 2011,  7: 2011,
      8: 2012,  9: 2012,  10: 2012,  11: 2012,  12: 2013,  13: 2013,  14: 2013,  15: 2013},
     'impact_FU': {0: 0.031479085164086554,  1: 5.9856927170853295e-05,  2: 1.1035885271638534e-05,  3: 5.8233509026863169e-06,
      4: 0.059176271387395112,  5: 0.00011179170132430088,  6: 1.9783914536689014e-05,  7: 1.0670218804040578e-05,
      8: 0.083935088170893221,  9: 0.00014806339884972569,  10: 2.3424374354037232e-05,  11: 1.30716950360811e-05,
      12: 0.10678138273474649,  13: 0.00016610749233828763,  14: 2.4764766148334989e-05,
      15: 1.3509464279754472e-05},
     'proc': {0: 'biogenic',  1: 'harvesting',  2: 'planting',  3: 'tending',
      4: 'biogenic',  5: 'harvesting',  6: 'planting',  7: 'tending',
      8: 'biogenic',  9: 'harvesting',  10: 'planting',  11: 'tending',
      12: 'biogenic',  13: 'harvesting',  14: 'planting',  15: 'tending'},
     'scenario': {0: 'BAU45',  1: 'BAU45',  2: 'BAU45',  3: 'BAU45',  4: 'BAU45',  5: 'BAU45',  6: 'BAU45',
      7: 'BAU45',  8: 'BAU45',  9: 'BAU45',  10: 'BAU45',  11: 'BAU45',  12: 'BAU45',  13: 'BAU45', 
                  14: 'BAU45',  15: 'BAU45'}})

Chart(df1).mark_area(stacked='normalize').encode(
    X('YEAR:T', timeUnit='year',),
    Y('sum(impact_FU)'),
    color=Color('proc:N'),
)

在 Altair/vega-lite/Vega 中是否有任何方法可以制作损坏的 y-axys...类似于this

【问题讨论】:

    标签: python vega vega-lite altair


    【解决方案1】:

    由于您的数据列具有非常不同的值范围,因此您可以使用对数刻度转换,如下所示。 Altair 带有许多比例转换,在您的情况下,您可以使用 alt.Scale(type='log')

    alt.Chart(df1).mark_area().encode(
        alt.X('YEAR:O'), 
        alt.Y('impact_FU', scale=alt.Scale(type='log')),
        color='proc:N',
    )
    

    产生:

    Altair 非常适合 Facet 图表,因此您只需多一行代码即可在每个 proc 上保持对数刻度和 facet:

    alt.Chart(df1).mark_area().encode(
        alt.X('YEAR:O'), 
        alt.Y('impact_FU', scale=alt.Scale(type='log')),
        color='proc:N',
        column='proc:N'
    )
    

    得到:

    【讨论】:

    • 使用对数刻度时,最好避免使用面积图,因为面积的高度不再代表有意义的值。
    • @kanitw 我不是在提倡mark_area,也不是轴坏了。 OP 可能有一些正当的理由想要一个损坏的 y 轴,我展示了如何做到这一点。不确定我是否同意投反对票。
    • 使用对数比例的区域仍然是一个不好的建议。如果您编辑答案以建议换行符,我很乐意删除反对票并给予赞成票。
    【解决方案2】:

    断轴通常被认为是可视化设计中的不良做法 反正。

    您可能需要考虑其他视觉编码,例如使用点或线标记的对数刻度。

    【讨论】:

    猜你喜欢
    • 2017-08-17
    • 2019-11-12
    • 2021-09-27
    • 2017-10-02
    • 2019-06-02
    • 2019-06-22
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多