首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对堆叠条形图进行排序

对堆叠条形图进行排序
EN

Stack Overflow用户
提问于 2019-10-05 08:59:14
回答 1查看 1.4K关注 0票数 4

我可以通过执行以下操作来创建堆叠条形图:

代码语言:javascript
复制
import pandas as pd
import numpy as np
import altair as alt

data = {'First': {('Header-1', 'H1-A'): 'Red',
                  ('Header-1', 'H1-B'): 'Red',
                  ('Header-1', 'H1-C'): 'Red',
                  ('Header-2', 'H2-A'): 'White',
                  ('Header-2', 'H2-B'): 'White',
                  ('Header-2', 'H2-C'): 'Yellow',
                  ('Header-3', 'H3-A'): 'Red',
                  ('Header-3', 'H3-B'): 'White',
                  ('Header-3', 'H3-C'): 'White',
                  ('Header-3', 'H3-D'): 'Yellow'},
        'Second': {('Header-1', 'H1-A'): 'White',
                   ('Header-1', 'H1-B'): 'Yellow',
                   ('Header-1', 'H1-C'): 'Yellow',
                   ('Header-2', 'H2-A'): 'Yellow',
                   ('Header-2', 'H2-B'): 'Green',
                   ('Header-2', 'H2-C'): 'Green',
                   ('Header-3', 'H3-A'): 'Green',
                   ('Header-3', 'H3-B'): 'Red',
                   ('Header-3', 'H3-C'): 'Red',
                   ('Header-3', 'H3-D'): 'White'},
        'Third': {('Header-1', 'H1-A'): 'Red',
                  ('Header-1', 'H1-B'): 'Green',
                  ('Header-1', 'H1-C'): 'Green',
                  ('Header-2', 'H2-A'): 'Green',
                  ('Header-2', 'H2-B'): 'White',
                  ('Header-2', 'H2-C'): 'White',
                  ('Header-3', 'H3-A'): 'White',
                  ('Header-3', 'H3-B'): 'Green',
                  ('Header-3', 'H3-C'): 'Green',
                  ('Header-3', 'H3-D'): 'Yellow'},        
       }
df = pd.DataFrame(data)
column_counts = df.apply(pd.Series.value_counts).fillna(0)
column_counts[column_counts.columns] = column_counts[column_counts.columns].astype('int64')
unstacked = pd.DataFrame(column_counts.unstack())
unstacked = unstacked.reset_index()
unstacked.columns = ['category','kind','counts']
alt.Chart( unstacked ).mark_bar().encode(
    x='category',
    y='sum(counts)',
    color='kind'
)

我确实可以通过执行以下操作来控制堆栈的顺序:

代码语言:javascript
复制
alt.Chart( unstacked ).mark_bar().encode(
    x='category',
    y='sum(counts)',
    color='kind',
    order=alt.Order(
      'kind',
      sort='descending'
    )
)

但是,alt.Order的排序参数只接受‘升序’或‘降序’。我想定制的顺序是绿色,黄色,红色,白色。

这个是可能的吗?多么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-05 22:36:31

除了基于另一个字段的降序或升序之外,没有办法直接提供自定义堆栈顺序。但是,您可以通过提供一个具有所需顺序的字段来自定义此字段。

这可以使用图表规范中的calculate transform (堆栈顺序的vega-lite版本概述为here)或通过预处理Pandas中的数据来完成。

下面是预处理方法的一个示例:

代码语言:javascript
复制
unstacked['order'] = unstacked['kind'].replace(
    {val: i for i, val in enumerate(['Green', 'Yellow', 'Red', 'White'])}
)

alt.Chart( unstacked ).mark_bar().encode(
    x='category',
    y='sum(counts)',
    color=alt.Color('kind',
        # optional: make color order in legend match stack order
        sort=alt.EncodingSortField('order', order='descending')
    ),
    order='order',  # this controls stack order
)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58244570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档