如何用Python创建按国家与城市双变量分组X轴的柱状图
Python实现按国家+城市分组的柱状图
下面提供两种实现方案,你可以根据需求选择:
方案一:使用Matplotlib手动控制分组绘制
适合需要精细调整图表样式的场景:
步骤1:导入依赖并准备数据
替换成你自己的DataFrame生成代码即可
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 示例数据集 data = { '国家': ['中国', '中国', '美国', '美国', '英国'], '城市': ['北京', '上海', '纽约', '洛杉矶', '伦敦'], '大学数量': [56, 42, 68, 39, 27] } df = pd.DataFrame(data)
步骤2:绘制分组柱状图
# 设置画布大小 plt.figure(figsize=(10, 6)) # 按国家分组处理数据 country_groups = df.groupby('国家') country_list = list(country_groups.groups.keys()) bar_width = 0.35 # 生成国家对应的X轴基准位置 country_x = np.arange(len(country_list)) # 遍历每个国家的子组,绘制城市对应的柱状图 for idx, (country, city_group) in enumerate(country_groups): # 计算同一国家下每个城市的X轴偏移位置,让柱状图并列不重叠 city_offset = np.arange(len(city_group)) * bar_width - (len(city_group)-1)*bar_width/2 city_x_pos = country_x[idx] + city_offset # 绘制柱状图 plt.bar(city_x_pos, city_group['大学数量'], width=bar_width, label=city_group['城市'].values) # 在每个柱子上方添加数值标签 for pos, count in zip(city_x_pos, city_group['大学数量']): plt.text(pos, count + 1, str(count), ha='center', fontsize=10) # 设置X轴标签为国家 plt.xticks(country_x, country_list) # 设置坐标轴和标题 plt.xlabel('国家/城市', fontsize=12) plt.ylabel('大学数量', fontsize=12) plt.title('各国主要城市大学数量对比', fontsize=14) # 调整图例位置避免遮挡图表 plt.legend(title='城市', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
方案二:使用Seaborn快速实现
代码更简洁,适合快速生成标准化图表:
步骤1:导入依赖并准备数据
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 示例数据集(替换为你的实际数据) data = { '国家': ['中国', '中国', '美国', '美国', '英国'], '城市': ['北京', '上海', '纽约', '洛杉矶', '伦敦'], '大学数量': [56, 42, 68, 39, 27] } df = pd.DataFrame(data)
步骤2:绘制分组柱状图
plt.figure(figsize=(10, 6)) # 用hue参数指定城市作为二级分组,自动实现同国家下的城市柱状图并列 sns.barplot(data=df, x='国家', y='大学数量', hue='城市', width=0.8) # 添加数值标签 for patch in plt.gca().patches: height = patch.get_height() plt.text(patch.get_x() + patch.get_width()/2., height + 1, f'{int(height)}', ha='center', fontsize=10) # 设置图表元素 plt.xlabel('国家', fontsize=12) plt.ylabel('大学数量', fontsize=12) plt.title('各国主要城市大学数量对比', fontsize=14) plt.legend(title='城市', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
关键说明
- 两种方案都实现了国家作为一级分组、城市作为二级分组的X轴展示逻辑
- 数值标签可直观展示每个城市的大学数量
- 图例配合X轴的国家标签,清晰区分分组层级
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

