如何基于6个地区DataFrame绘制分组多条形图?
解决方法
1. 先统一整合所有地区数据
首先给每个地区的DataFrame添加地区标识列,再合并成完整数据集,这是跨地区绘图的核心前提:
import pandas as pd # 为各地区数据添加地区标签 df_asia['region'] = '亚洲' df_africa['region'] = '非洲' df_europe['region'] = '欧洲' df_america['region'] = '美洲' df_latin_america['region'] = '拉丁美洲' df_middle_east['region'] = '中东' # 合并所有地区数据 df_all = pd.concat([df_asia, df_africa, df_europe, df_america, df_latin_america, df_middle_east], ignore_index=True)
2. 用Seaborn快速绘制分组条形图(两种展示方式)
方式一:同一画布内按地区分组,组内展示事件类型
适合同时对比地区间、地区内的事件数量差异:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(15, 8)) # x轴为地区,hue区分事件类型,绘制分组条形 sns.barplot(data=df_all, x='region', y='counts', hue='events') plt.title('各地区不同事件类型数量对比') plt.xlabel('地区') plt.ylabel('事件数量') # 将图例移至画布外侧,避免遮挡条形 plt.legend(title='事件类型', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
方式二:每个地区单独子图,聚焦单一地区事件分布
如果同一画布过于拥挤,用子图分开展示:
# 创建子图网格,每个子图对应一个地区,col_wrap控制每行显示的子图数量 g = sns.catplot(data=df_all, x='events', y='counts', col='region', kind='bar', col_wrap=3, figsize=(18, 10)) # 统一设置子图标题和坐标轴标签 g.set_titles('{col_name} 事件类型数量') g.set_xlabels('事件类型') g.set_ylabels('事件数量') plt.tight_layout() plt.show()
3. 用Matplotlib手动实现(自定义细节更灵活)
如果需要精细调整条形宽度、颜色、位置等,可手动绘制:
import matplotlib.pyplot as plt import numpy as np # 获取所有唯一的地区和事件类型 regions = df_all['region'].unique() events = df_all['events'].unique() n_regions = len(regions) n_events = len(events) # 设置单个条形的宽度 bar_width = 0.8 / n_events plt.figure(figsize=(16, 9)) # 遍历每个地区,绘制该地区下的所有事件条形 for i, region in enumerate(regions): region_data = df_all[df_all['region'] == region] # 计算当前地区所有条形的x轴位置 x_pos = np.arange(n_events) + i * bar_width plt.bar(x_pos, region_data['counts'], width=bar_width, label=region) # 设置x轴刻度为事件类型,对齐分组中心 plt.xticks(np.arange(n_events) + bar_width * (n_regions - 1)/2, events) plt.title('各地区事件类型数量对比') plt.xlabel('事件类型') plt.ylabel('事件数量') plt.legend(title='地区') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Malhar
相关产品推荐
相关产品推荐

