使用 Altair 绘制多索引数据框

Plotting a multi-index dataframe with Altair

我有一个数据框,看起来像:

data = {'ColA': {('A', 'A-1'): 0,
                 ('A', 'A-2'): 1,
                 ('A', 'A-3'): 1,
                 ('B', 'B-1'): 2,
                 ('B', 'B-2'): 2,
                 ('B', 'B-3'): 0,
                 ('C', 'C-1'): 1,
                 ('C', 'C-2'): 2,
                 ('C', 'C-3'): 2,
                 ('C', 'C-4'): 3},
        'ColB': {('A', 'A-1'): 3,
                 ('A', 'A-2'): 1,
                 ('A', 'A-3'): 1,
                 ('B', 'B-1'): 0,
                 ('B', 'B-2'): 2,
                 ('B', 'B-3'): 2,
                 ('C', 'C-1'): 2,
                 ('C', 'C-2'): 0,
                 ('C', 'C-3'): 3,
                 ('C', 'C-4'): 1}}

df = pd.DataFrame( data )

每列的值是 0、1、2 或 3。这些值可以很容易地是 'U'、'Q'、'R' 或 'Z' ...即它们本身没有任何数字。

我想用Altair

** 第一组图表

我想要每列一个条形图。

X 轴的标签应基于列中的唯一值。 Y 轴应该是列中唯一值的计数。

** 第二组图表

与第一组类似,我想要每行一个条形图。

X 轴的标签应基于行中的唯一值。 Y 轴应该是行中唯一值的计数。

这应该很容易,但我不知道该怎么做。

Altair 的所有 API 都是基于列的,并且会忽略索引,除非您明确包含它们(请参阅 Altair 文档中的 Including Index Data)。

对于第一组图表(每列一个条形图),您可以这样做:

alt.Chart(df.reset_index()).mark_bar().encode(
    alt.X(alt.repeat(), type='nominal'),
    y='count()'
).repeat(['ColA', 'ColB'])

对于第二组图表(每行一个条形图),您可以这样做:

df_transposed = df.reset_index(0, drop=True).T
alt.Chart(df_transposed).mark_bar().encode(
    alt.X(alt.repeat(), type='nominal'),
    y='count()'
).repeat(list(df_transposed.columns), columns=5)

尽管这有点奇怪,所以我怀疑我误解了你的意思...你的数据有十行,所以每行一个图表是十个图表。