在同一y記號內打印多個水平條

我正在做一個個人項目,我想畫出每個一級方程式車手在排位賽中的最佳時間(分三個部分:第一季度、第二季度和第三季度)

繪圖將在y-axis上顯示驅動程序的名稱(按其最終結果排序:第一個在頂部,最后一個在底部),在x-axis上的時間如下所示,4個驅動程序的Excel表示:

通過Python,我能夠收集每個會話(Q1、Q2和Q3)的最佳時間,我將其存儲為列表(t_Q1,t_Q2,t_Q3)中的列表,以及它們的最終位置。以下是代碼的開頭:

import matplotlib.pyplot as plt
import numpy as np


Drivers_name=['VER','HAM','VET','MSC'] #for the label of the Y-axis
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]]


fig,ax = plt.subplots()

y=np.arange(len(Drivers_name))

for i in range(len(Drivers_name)):
    if len(Drivers_timings[i])==3:
        eps=0.2
        ax.barh(y-eps,Drivers_timings[i][0],height=eps,color='g', label='Q1')
        ax.barh(y,Drivers_timings[i][1],height=eps,color='r', label='Q2')
        ax.barh(y+eps,Drivers_timings[i][1],height=eps,color='b', label='Q3')
    elif len(Drivers_timings[i])==2:
        eps=0.2
        ax.barh(y-eps/2,Drivers_timings[i][0],height=eps,color='g', label='Q1')
        ax.barh(y+eps/2,Drivers_timings[i][1],height=eps,color='r', label='Q2')
    elif len(Drivers_timings[i])==1:
        ax.barh(y,Drivers_timings[i][0],height=0.2,color='g', label='Q1')

plt.yticks(y,Drivers_name)
plt.legend()
plt.show()

但這是我執行它時得到的:

我們可以注意到,它并沒有真正代表我所尋找的,并且圖例多次顯示相同的元素(這是正常的,因為label參數在for循環中,但我無法理解任何其他想法)

評論:總結一下,以下是我的帖子的目的

  • 獲得預期圖(我用Excel獲得的圖)
  • 固定圖例框
? 最佳回答:

通過使用ax.barh(y-eps, ...),其中y=np.arange(len(Drivers_name)),在每個步驟中,為所有y-values創建循環條。例如,對于i=0,將在y=0周圍創建三個條形圖,但也會在y=1周圍創建三個條形圖,在y=2周圍創建三個條形圖,在y=3周圍創建三個條形圖。用i替換y會產生所需的效果。

每次使用label=時,圖例都包含一行。在完整的繪圖中,ax.barh將被調用9次,每次調用label=。解決方案是從虛擬矩形創建圖例。

import matplotlib.pyplot as plt
import numpy as np

Drivers_name = ['VER', 'HAM', 'VET', 'MSC']  # for the label of the Y-axis
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]]

colors = ['g', 'r', 'b']
labels = ['Q1', 'Q2', 'Q3']
fig, ax = plt.subplots()
for i in range(len(Drivers_name)):
    eps = 0.2
    if len(Drivers_timings[i]) == 3:
        ax.barh(i - eps, Drivers_timings[i][0], height=eps, color=colors[0])
        ax.barh(i, Drivers_timings[i][1], height=eps, color=colors[1])
        ax.barh(i + eps, Drivers_timings[i][1], height=eps, color=colors[2])
    elif len(Drivers_timings[i]) == 2:
        ax.barh(i - eps / 2, Drivers_timings[i][0], height=eps, color=colors[0])
        ax.barh(i + eps / 2, Drivers_timings[i][1], height=eps, color=colors[1])
    elif len(Drivers_timings[i]) == 1:
        ax.barh(i, Drivers_timings[i][0], height=eps, color=colors[0])

plt.yticks(np.arange(len(Drivers_name)), Drivers_name)
handles = [plt.Rectangle((0, 0), 0, 0, color=color) for color in colors]
plt.legend(handles=handles, labels=labels, bbox_to_anchor=(1.01, 0.99), loc='upper left')
plt.tight_layout()
plt.show()

主站蜘蛛池模板: 精品国产亚洲一区二区三区在线观看 | 亚洲一区在线免费观看| 乱精品一区字幕二区| 精品一区二区三区水蜜桃| 国语对白一区二区三区| 亚洲国产精品自在线一区二区| 在线精品亚洲一区二区小说| 中文字幕一区日韩在线视频| 日本免费电影一区二区| 国产午夜福利精品一区二区三区| 午夜视频在线观看一区二区| 精品国产一区二区三区麻豆| 中文字幕精品一区二区 | 久久一区二区三区免费| av无码一区二区三区| 国产在线观看一区二区三区精品 | 久久99国产精品一区二区| 一区二区三区在线看| 夜色阁亚洲一区二区三区 | 天堂va在线高清一区| 久久青青草原一区二区| 日本丰满少妇一区二区三区| 日韩一区二区三区电影在线观看| 鲁大师成人一区二区三区 | 亚洲欧美日韩中文字幕一区二区三区| 少妇人妻精品一区二区三区| 亚洲AV成人一区二区三区AV| 国产日产久久高清欧美一区| 一区二区在线视频观看| 无码av不卡一区二区三区| 亚洲av无码天堂一区二区三区| 一区二区在线免费视频| 久久精品中文字幕一区| av无码免费一区二区三区| 亚洲国产精品无码第一区二区三区 | 成人区精品一区二区不卡| 亚洲日韩精品一区二区三区无码| 日本免费一区二区久久人人澡| 亚洲乱码一区av春药高潮| 无码人妻精一区二区三区 | 久久青青草原一区二区|