Altair 中使用两个不同列的分组条形图

Ror*_*ule 1 python plot bar-chart altair

太长了;如何在最新版本的 Altair 中制作分组条形图,其中分组条形图来自不同的定量数据列,而不是一列分类数据?

虽然我在这里找到了一些关于在 Altair 中创建分组条形图的很好的答案(如这个),但没有一个回答我的具体问题。

我有一个包含多个列的表,其中两列是定量的,代表两个不同的值,可以分为一个类别(例如“cm_of_rain”和“cm_of_snow”可以相加并称为“cm_of_precipitation”),一个是月份作为序数字符串,另一个是作为数字的日期。因此数据的数据框看起来像这样:

data = {'Month':['Jan', 'Jan', 'Feb', 'Feb', 'Mar', 'Mar', 'Apr', 'Apr'], 
        'Day': [1, 15, 1, 15, 1, 15, 1, 15],
        'cm_of_rain':[20, 21, 19, 18, 1, 12, 33, 12], 
        'cm_of_snow':[0, 2, 6, 3, 4, 2, 5 ,11]}
 
df = pd.DataFrame(data)
print(df)

 Month  Day  cm_of_rain  cm_of_snow
   Jan    1          20           0
   Jan   15          21           2
   Feb    1          19           6
   Feb   15          18           3
   Mar    1           1           4
   Mar   15          12           2
   Apr    1          33           5
   Apr   15          12          11
Run Code Online (Sandbox Code Playgroud)

我想制作一个条形图,其中数据在 X 轴上按月份分组,降水量厘米显示在 Y 轴上,但我不想绘制雨雪相加的堆积条形图,而是绘制每个月的两个值作为并排条形图。因此,结果应该类似于上面链接的帖子中的分组条形图

分组条形图的示例,取自此链接的 StackOverflow 帖子。

除了类型(“行动”、“犯罪”)将替换为月份(“一月”、“二月”、“三月”、“四月”),性别(女、男)将替换为 Precipitation_Type(雨、雪) ,评级将替换为 Precipitation_(cm)。

对于上下文,我的问题与其他人之前提出的问题之间的主要区别在于,我想要分组在一起的数据来自我的数据框中的两个不同的定量数据列,而我见过的所有其他帖子都使用某种来自单列的分类数据。

joe*_*lom 5

您拥有的数据通常被称为“宽格式”或“不整齐”的数据。Altair 通常更适合“长格式”或“整洁的数据”。您可以在文档中阅读有关如何在两者之间进行转换的更多信息,但一种方法是使用transform_fold.

import altair as alt
import pandas as pd


data = {'Month':['Jan', 'Jan', 'Feb', 'Feb', 'Mar', 'Mar', 'Apr', 'Apr'], 
        'Day': [1, 15, 1, 15, 1, 15, 1, 15],
        'rain':[20, 21, 19, 18, 1, 12, 33, 12], 
        'snow':[0, 2, 6, 3, 4, 2, 5 ,11]}
 
df = pd.DataFrame(data)

alt.Chart(df).mark_bar().encode(
    x='amount (cm):Q',
    y='type:N',
    color='type:N',
    row=alt.Row('Month', sort=['Jan', 'Feb', 'Mar', 'Apr'])
).transform_fold(
    as_=['type', 'amount (cm)'],
    fold=['rain', 'snow']
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述