【问题标题】:How to put fraction labels in normalized bar chart in Altair?如何在 Altair 的标准化条形图中放置分数标签?
【发布时间】:2021-07-01 07:14:23
【问题描述】:
import altair as alt
from vega_datasets import data

# get iris dataset and take 120 observations from it
source = data.iris()[10:130]
# add one more feature to dataset
colors = ['red', 'orange', 'blue', 'red'] * 30
source['colors'] = colors

chart = alt.Chart(source).mark_bar().encode(
    alt.Y('species:N', sort='x'),
    alt.X('count():Q', stack='zero'),
    color=alt.Color('colors', sort=colors), 
    order="colors",
    
)

text = alt.Chart(source).mark_text(dx=-7, dy=3, color='white')\
    .encode(
    alt.Y("species:N", sort='x'),
    alt.X('count():Q', stack="zero"),
    order="colors",
    text=alt.Text('count():Q')
    )

chart + text

现在我想规范化这个图表,标签应该代表整体的一小部分。

import altair as alt
from vega_datasets import data

source = data.iris()[10:130]
colors = ['red', 'orange', 'blue', 'red'] * 30
source['colors'] = colors


chart = alt.Chart(source).mark_bar().encode(
    alt.Y('species:N', sort='x'),
    alt.X('count():Q', stack='normalize'),
    color=alt.Color('colors', sort=colors), 
    order="colors",
    
)

text = alt.Chart(source).mark_text(dx=-7, dy=3, color='white')\
    .encode(
    alt.Y("species:N", sort='x'),
    alt.X('count():Q', stack="normalize"),
    order="colors",
    text=alt.Text('count():Q')
    )

chart + text

因此,在本例中,我希望看到 0.27、0.23、0.5(逗号后四舍五入为 2 位),而不是 8、7、15 作为第一个柱。我怎样才能做到这一点?

更新 这就是我设法取得进展的方式:

import altair as alt
from vega_datasets import data

source = data.iris()[10:130]
colors = ['red', 'orange', 'blue', 'red'] * 30
sort_order=['blue', 'orange', 'red']
source['colors'] = colors

chart = alt.Chart(source).mark_bar().encode(
    alt.Y('species:N', sort='x'),
    alt.X('count():Q', stack='normalize'),
    color=alt.Color('colors', sort=sort_order), 
    order = 'colors'
)

text = alt.Chart(source).transform_aggregate(count='count()', groupby=['species', 'colors'])\
    .transform_joinaggregate(total='sum(count)', groupby=["species"])\
    .transform_calculate(frac=alt.datum.count / alt.datum.total)\
    .mark_text(align='right', dx=-7, dy=3, color='white')\
    .encode(
    alt.Y("species:N", sort='x'),
    alt.X('count():Q', stack="normalize"),
    text=alt.Text('frac:Q', format='.0%'),
    order = 'colors'
    )

chart + text

但是标签没有正确对齐(我需要它们位于每种颜色的末尾,就像在前两张图片中一样)。任何想法如何解决它?

【问题讨论】:

    标签: python charts bar-chart altair vega-lite


    【解决方案1】:

    您可以使用一系列joinaggregatecalculate 转换来计算您希望显示的值。您可以使用format 文本属性使用d3-format 字符串调整格式,并使用align 标记属性调整对齐方式。例如:

    import altair as alt
    from vega_datasets import data
    
    source = data.iris()[10:130]
    colors = ['red', 'orange', 'blue', 'red'] * 30
    source['colors'] = colors
    sort_order=['blue', 'orange', 'red']
    
    
    chart = alt.Chart(source).mark_bar().encode(
        alt.Y('species:N', sort='x'),
        alt.X('count():Q', stack='normalize'),
        color=alt.Color('colors', sort=sort_order), 
        order="colors",
        
    )
    
    text = chart.transform_joinaggregate(
        count='count()',
        groupby=['species', 'colors']
    ).transform_joinaggregate(
        total='count()',
        groupby=['species']
    ).transform_calculate(
        fraction='datum.count / datum.total'   
    ).mark_text(
        dx=-7, dy=3, align='right'
    ).encode(
        color=alt.ColorValue('white'),
        text=alt.Text('fraction:Q', format='.2')
    )
    
    chart + text
    

    (注意:我还通过在两个图表之间共享数据和编码使脚本更加简洁)

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      相关资源
      最近更新 更多