gpt4 book ai didi

pandas - 对堆积条形图进行排序

转载 作者:行者123 更新时间:2023-12-04 01:39:13 24 4
gpt4 key购买 nike

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

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'
)

通过执行以下操作,我确实可以控制堆栈的顺序:
alt.Chart( unstacked ).mark_bar().encode(
x='category',
y='sum(counts)',
color='kind',
order=alt.Order(
'kind',
sort='descending'
)
)

但是,alt.Order 的排序参数只接受“升序”或“降序”。我想自定义顺序为绿色、黄色、红色、白色。

这可能吗?如何?

最佳答案

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

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

以下是预处理方法的示例:

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
)

enter image description here

关于pandas - 对堆积条形图进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58244570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com