如何用Altair按多变量分组统计Hit/Miss与sza的月度关联?
解决思路与代码示例
步骤1:数据预处理
首先从时间戳提取月份、季节,并对太阳天顶角(sza)做分箱处理,这是后续统计和绘图的基础。假设你的数据集已用pandas读入为df:
import pandas as pd # 确保时间戳为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 提取月份(1-12) df['month'] = df['timestamp'].dt.month # 划分季节(以北半球为例,可根据实际需求调整) df['season'] = pd.cut( df['month'], bins=[0, 3, 6, 9, 12], labels=['冬季', '春季', '夏季', '秋季'] ) # 对sza分箱,这里按0-30°、30-60°、60-90°划分,可自行修改区间 df['sza_bin'] = pd.cut( df['sza'], bins=[0, 30, 60, 90], labels=['0-30°', '30-60°', '60-90°'] )
步骤2:统计各类别数量
按月份/季节、sza分箱、Hit/Miss分类分组,统计每组的样本数量:
# 按月份统计 monthly_count = df.groupby(['month', 'sza_bin', 'Hit/Miss']).size().reset_index(name='count') # 按季节统计(用于分析季节关联) seasonal_count = df.groupby(['season', 'sza_bin', 'Hit/Miss']).size().reset_index(name='count')
步骤3:用Altair绘制可视化图表
图表1:每月各Hit/Miss类别在不同sza分箱的数量分布
用分组柱状图展示,以月份为横轴,数量为纵轴,颜色区分Hit/Miss类别,列区分sza分箱,直观呈现每月的分布差异:
import altair as alt month_chart = alt.Chart(monthly_count).mark_bar().encode( x=alt.X('month:O', title='月份'), # O表示离散型数据 y=alt.Y('count:Q', title='样本数量'), # Q表示连续型数据 color=alt.Color('Hit/Miss:N', title='Hit/Miss分类'), # N表示标称型数据 column=alt.Column('sza_bin:N', title='太阳天顶角分箱'), tooltip=['month', 'sza_bin', 'Hit/Miss', 'count'] # 鼠标悬停显示详细信息 ).properties( width=180, height=350, title='每月Hit/Miss类别在不同SZA分箱中的数量分布' ) month_chart.show()
图表2:各季节Hit/Miss类别在不同sza分箱的数量分布
如果重点分析季节关联,将横轴替换为季节即可:
season_chart = alt.Chart(seasonal_count).mark_bar().encode( x=alt.X('season:O', title='季节'), y=alt.Y('count:Q', title='样本数量'), color=alt.Color('Hit/Miss:N', title='Hit/Miss分类'), column=alt.Column('sza_bin:N', title='太阳天顶角分箱'), tooltip=['season', 'sza_bin', 'Hit/Miss', 'count'] ).properties( width=180, height=350, title='各季节Hit/Miss类别在不同SZA分箱中的数量分布' ) season_chart.show()
注意事项
- 若你的sza范围不是0-90°,可调整
pd.cut的bins参数,添加对应区间。 - 季节划分可根据所在半球修改,比如南半球冬季为6-8月,需同步调整
labels和bins。 - 若数据存在缺失值,建议先执行
df = df.dropna(subset=['sza', 'Hit/Miss'])清理无效数据。
内容的提问来源于stack exchange,提问作者confused student
相关产品推荐
相关产品推荐

