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

Grouped bar charts in Altair using two different columns

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

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

我有一个包含多列的 table,其中两列是定量的,表示可以归为一类的两个不同值(例如,'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

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

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

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

您拥有的数据通常称为“宽格式”或“不整洁”数据。 Altair 通常更适合“长格式”或“整齐的数据”。您可以 read more about how to convert between the two in the documentation, 但一种方法是使用 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']
)