基于Pandas开发按城市分组的多柱状图数组技术问询
Pandas实现按城市分组的多柱状图(工作日×时段组合X轴)
没问题,我帮你把之前两次尝试的功能结合起来——给每个城市生成独立的柱状图,X轴用7个工作日×3个时段的21种组合,Y轴严格锁定70-210的计数值范围。下面是完整的可运行方案:
步骤1:准备示例数据(可替换为你的真实数据)
首先构造一个符合需求的数据集,包含城市、工作日、时段和计数值四个字段:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 构造基础维度 cities = ["北京", "上海", "广州"] weekdays = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] time_slots = ["早高峰", "午间", "晚高峰"] # 生成示例数据 data = [] for city in cities: for day in weekdays: for slot in time_slots: # 生成70-210之间的随机计数值 count = np.random.randint(70, 211) data.append({"城市": city, "工作日": day, "时段": slot, "计数值": count}) df = pd.DataFrame(data)
步骤2:数据预处理(合并X轴标签)
把工作日和时段合并成一个新字段,作为每个柱状条的X轴标签,比如周一-早高峰:
# 合并工作日和时段为X轴标签 df["X轴标签"] = df["工作日"] + "-" + df["时段"] # 确保X轴按工作日+时段的顺序排列(避免乱序) # 先定义固定顺序,再设置为分类类型 ordered_labels = [f"{day}-{slot}" for day in weekdays for slot in time_slots] df["X轴标签"] = pd.Categorical(df["X轴标签"], categories=ordered_labels, ordered=True)
步骤3:按城市分组生成图表数组
遍历每个城市的数据,为每个城市单独绘制柱状图,同时设置Y轴范围和X轴样式:
# 设置图表整体风格 plt.style.use("seaborn-v0_8") # 按城市分组循环绘图 for city, group_df in df.groupby("城市"): # 创建新的图表对象 fig, ax = plt.subplots(figsize=(12, 6)) # 绘制柱状图 ax.bar(group_df["X轴标签"], group_df["计数值"], color="#2ecc71") # 设置Y轴范围为70-210 ax.set_ylim(70, 210) # 设置图表标题和轴标签 ax.set_title(f"{city} 各工作日时段计数值分布", fontsize=14, pad=20) ax.set_xlabel("工作日-时段组合", fontsize=12) ax.set_ylabel("计数值", fontsize=12) # 旋转X轴标签,避免重叠 plt.xticks(rotation=45, ha="right") # 调整布局,防止标签被截断 plt.tight_layout() # 显示图表(如果要保存可以用plt.savefig(f"{city}_柱状图.png")) plt.show()
关键功能说明
- X轴组合逻辑:通过分类类型
pd.Categorical强制X轴按工作日+时段的固定顺序排列,保证21个柱状条的顺序正确。 - Y轴范围锁定:用
ax.set_ylim(70, 210)严格限制Y轴显示区间,符合你的需求。 - 按城市生成独立图表:利用
groupby遍历每个城市的子数据集,为每个城市创建单独的图表对象,实现“图表数组”的效果。 - 样式优化:旋转X轴标签、调整图表尺寸、设置配色,提升图表可读性。
如果你的真实数据字段名和示例不同,只需要替换代码中对应的字段(比如把城市换成city,计数值换成count)即可轻松适配~
内容的提问来源于stack exchange,提问作者Calculus
相关产品推荐
相关产品推荐

