【问题标题】:Plotting a multi-index dataframe with Altair使用 Altair 绘制多索引数据框
【发布时间】:2019-10-03 23:37:45
【问题描述】:

我有一个如下所示的数据框:

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 轴应该是行中唯一值的计数。

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

【问题讨论】:

    标签: pandas bar-chart altair


    【解决方案1】:

    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)
    

    虽然这是一个有点奇怪的可视化,所以我怀疑我误解了你所追求的......你的数据有十行,所以每行一个图表就是十个图表。

    【讨论】:

    • 谢谢。对于真实数据,第二个可视化更有意义。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2021-04-03
    • 2018-10-29
    • 2020-11-24
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多