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
相关产品推荐
相关产品推荐

