使用两个不同的列在 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']
)
TLDR;如何在最新版本的 Altair 中制作分组条形图,其中分组条形图来自不同的定量数据列,而不是一列分类数据?
虽然我在这里找到了一些关于在 Altair 中创建分组条形图的很好的答案(例如
我有一个包含多列的 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']
)