如何用Matplotlib在同一y刻度下绘制F1排位赛多成绩水平条形图?
F1排位赛圈速可视化修复方案
原有代码问题梳理
- 循环绘制时误用了完整的y数组而非当前车手对应的单个y坐标
y[i],导致所有车手的柱子重叠绘制在全部y轴位置 - Q3阶段的圈速取值错误写成了Q2的数值
- 每次循环都为柱子添加label,导致图例重复生成
- 没有调整y轴顺序,排名第一的车手默认显示在最下方,和预期相反
- 缺失排序逻辑,若原始数据未按排位排列会导致显示顺序错误
修复后完整代码
import matplotlib.pyplot as plt import numpy as np # 原始数据 Drivers_name = ['VER', 'HAM', 'VET', 'MSC'] Drivers_position = [1, 2, 12, 20] Drivers_timings = [[94.352, 93.464, 92.91], [94.579, 93.797, 93.119], [95.281, 95.5], [96.119]] # 按最终排位升序排序,确保排名越高的车手顺序越靠前 sorted_data = sorted(zip(Drivers_position, Drivers_name, Drivers_timings), key=lambda x: x[0]) sorted_pos, sorted_names, sorted_timings = zip(*sorted_data) fig, ax = plt.subplots(figsize=(8, 5)) y = np.arange(len(sorted_names)) eps = 0.25 # 单组柱子的高度间隔 # 标记已添加的label,避免图例重复 label_added = set() for i in range(len(sorted_names)): timings = sorted_timings[i] n_phase = len(timings) if n_phase == 3: ax.barh(y[i] - eps, timings[0], height=eps, color='g', label='Q1' if 'Q1' not in label_added else "") ax.barh(y[i], timings[1], height=eps, color='r', label='Q2' if 'Q2' not in label_added else "") ax.barh(y[i] + eps, timings[2], height=eps, color='b', label='Q3' if 'Q3' not in label_added else "") label_added.update(['Q1', 'Q2', 'Q3']) elif n_phase == 2: ax.barh(y[i] - eps/2, timings[0], height=eps, color='g', label='Q1' if 'Q1' not in label_added else "") ax.barh(y[i] + eps/2, timings[1], height=eps, color='r', label='Q2' if 'Q2' not in label_added else "") label_added.update(['Q1', 'Q2']) elif n_phase == 1: ax.barh(y[i], timings[0], height=eps, color='g', label='Q1' if 'Q1' not in label_added else "") label_added.add('Q1') # 配置y轴,排名高的车手显示在最上方 ax.set_yticks(y) ax.set_yticklabels(sorted_names) ax.invert_yaxis() # 配置轴标签 ax.set_xlabel('圈速(秒)') ax.set_ylabel('车手') # 图例二次去重,确保无重复条目 handles, labels = ax.get_legend_handles_labels() by_label = dict(zip(labels, handles)) ax.legend(by_label.values(), by_label.keys()) plt.tight_layout() plt.show()
实现效果说明
- 车手按最终排位从高到低排列,排名第一的车手位于y轴最上方
- 每位车手不同阶段的最佳圈速按颜色分组展示,数值无错误
- 图例仅展示Q1、Q2、Q3三个唯一条目,无重复
- 内置自动排序逻辑,适配任意顺序的原始输入数据
内容的提问来源于stack exchange,提问作者AliStonks
相关产品推荐
相关产品推荐

