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

Matplotlib排班表绘制:同班次多医生方块叠加显示问题求解

医生排班表同班次方块叠加显示解决方案

我正在开发自动生成医生排班表的项目,代码接收由0和1组成的列表,列表对应位置为1时显示代表班次的方块。目前功能基本正常,但存在问题:当多名医生在同一班次值班(即多个列表对应位置均为1)时,仅显示最后一个医生的方块。需要修改代码实现:同班次有2名或3名医生值班时,额外的方块依次向上叠加显示。

示例场景:

  • doctor1 = [0,1,0,...]、doctor2 = [0,1,1,...]、doctor3 = [1,1,0,...]时,第一天第二班次的三个方块坐标应分别为(1.4, 0)、(1.4, 1)、(1.4, 2)
  • doctor1 = [0,0,0,...]、doctor2 = [0,1,1,...]、doctor3 = [1,1,0,...]时,第一天第二班次的方块坐标应为(1.4, 0)(doctor2)、(1.4, 1)(doctor3)
  • doctor1 = [0,1,0,...]、doctor2 = [0,1,1,...]、doctor3 = [1,0,0,...]时,第一天第二班次的方块坐标应为(1.4, 0)(doctor1)、(1.4, 1)(doctor3)

解决方案代码

你的更新思路是正确的,核心是为每个班次单独维护垂直偏移量,每添加一个医生的方块就增加偏移。以下是优化后的代码片段:

for day in range(num_days):
    for shift in range(3):
        index = day * 3 + shift
        # 仅包含医生列表,超编/缺编列表单独处理
        doctors = [doctor_1, doctor_2, doctor_3]
        # 对应医生的颜色,确保顺序与医生列表匹配
        colors = ['teal', 'orange', 'violet']
        # 每个班次初始化垂直偏移为0
        vertical_offset = 0
        base_position = np.array(positions[index])
        
        for doctor, color in zip(doctors, colors):
            if doctor[index] == 1:
                # 计算当前方块位置:基础位置 + 垂直偏移(y轴方向)
                position = base_position + np.array((0, vertical_offset))
                # 设置对应填充图案
                hatch_pattern = ''
                if color == 'teal':
                    hatch_pattern = '//'
                elif color == 'orange':
                    hatch_pattern = '|'
                elif color == 'violet':
                    hatch_pattern = '...'
                # 添加方块到画布
                ax.add_patch(Rectangle(position, 1, 1, facecolor=color, edgecolor="black", hatch=hatch_pattern))
                # 偏移量递增,下一个方块向上移动
                vertical_offset += 1
        
        # 单独处理超编标记
        if overstaffing_list[index] == 1:
            overstaff_pos = base_position + np.array((0, vertical_offset))
            ax.add_patch(Rectangle(overstaff_pos, 1, 1, facecolor='red', edgecolor="black", hatch='XX'))
        # 单独处理缺编标记
        if understaffing_list[index] == 1:
            understaff_pos = base_position + np.array((0, vertical_offset))
            ax.add_patch(Rectangle(understaff_pos, 1, 1, facecolor='yellow', edgecolor="black", hatch='--'))

关键说明

  • 每个班次单独初始化vertical_offset,确保不同班次的偏移逻辑互不干扰
  • 将医生列表与超编/缺编列表分开处理,避免偏移计算混乱
  • 直接使用整数偏移量计算位置,逻辑更直观
  • 严格保证颜色与医生列表的顺序对应,避免显示错误

修改后,同班次的医生方块会按照遍历顺序依次向上叠加,完全符合你给出的三个示例场景要求。

内容的提问来源于stack exchange,提问作者nflgreaternba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:32:00