如何在Python中按DataFrame的ProgramID分组自动绘制水平条形图
按ProgramID分组绘制独立水平条形图实现方案
没问题,我来帮你搞定这个需求!我们可以用pandas做数据分组,搭配matplotlib来绘制每个Program对应的独立水平条形图,还能把Program的时间范围作为参考背景,一眼就能看出哪些Project的起止日期超出了Program的范围。
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 构造你提供的示例数据 data = { 'ProgramID': [1113, 1113, 1114], 'ProgramStartDate': [8.794, 8.794, 23.3], 'ProgramEndDate': [9.345, 9.345, 34.5], 'ProjectID': [101, 102, 103], 'ProjectStartDate': [8.7, 9.1, 25.3], 'ProjectEndDate': [8.98, 9.3, 37] } df = pd.DataFrame(data) # 按ProgramID分组,遍历每个分组绘制图表 for program_id, group in df.groupby('ProgramID'): # 创建新的绘图窗口,每个Program一个独立窗口 plt.figure(figsize=(10, len(group)*0.8)) # 获取当前Program的时间范围 prog_start = group['ProgramStartDate'].iloc[0] prog_end = group['ProgramEndDate'].iloc[0] prog_duration = prog_end - prog_start # 设置y轴为ProjectID,按原顺序排列 y_pos = range(len(group)) projects = group['ProjectID'].tolist() # 绘制Program的时间范围作为参考背景(灰色长条) plt.barh(y_pos, [prog_duration]*len(group), left=prog_start, height=0.5, color='#cccccc', alpha=0.5, label='Program Range') # 绘制每个Project的时间条形 project_durations = group['ProjectEndDate'] - group['ProjectStartDate'] plt.barh(y_pos, project_durations, left=group['ProjectStartDate'], height=0.3, color='#2ecc71', label='Project Duration') # 设置图表标题和标签 plt.title(f'Timeline for Program {program_id}', fontsize=14) plt.xlabel('Date Value', fontsize=12) plt.yticks(y_pos, projects, fontsize=12) # 添加图例,调整布局 plt.legend() plt.tight_layout() # 显示当前Program的图表 plt.show()
代码解释
- 数据准备:先把你提供的结构化数据转换成
pandas.DataFrame,方便后续分组操作。 - 分组遍历:用
groupby('ProgramID')把数据按Program拆分,然后逐个处理每个Program的数据。 - 参考背景绘制:每个图表里先画一个灰色的长条,代表当前Program的时间范围,这样能直观对比Project是否超出这个范围。
- Project条形绘制:用绿色的短条绘制每个Project的时间跨度,长度是
ProjectEndDate - ProjectStartDate,左起始点是ProjectStartDate。 - 图表美化:设置标题、坐标轴标签,调整布局避免内容重叠,每个Program的图表都是独立窗口显示。
运行这段代码后,你会得到两个独立的窗口:一个是Program 1113的图表(包含Project 101和102),另一个是Program 1114的图表(包含Project 103),一眼就能看到Project 103的结束日期超出了Program 1114的范围。
内容的提问来源于stack exchange,提问作者tintin
相关产品推荐
相关产品推荐

