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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:36:03