You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:53:36