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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:42:35