

文字列のindexを持つpandas.Dataframeにおいて、縦の補助線を引く場合にindex（x軸）をうまく指定できないです。

plotしたいpandas.Dataframeは以下のようになります。indexがobjectなのは確認できています。

[code]

    print(df_occ_test.index.dtype)
    
    object
    
    print(df_occ_test)
    
                a      b      c      d      e      f
    p_time                                          
    16:45   15.99  24.60  16.05  16.19  13.14  16.26
    16:46   15.50  22.83  15.92  16.09  13.14  16.67
    16:47   15.38  23.62  15.78  16.01  13.36  16.46
    16:48   16.42  23.37  15.69  15.82  13.14  17.55
    16:49   16.79  23.19  15.90  15.79  14.13  17.79
    16:50   16.73  23.05  16.15  16.16  13.62  17.66
    16:51   16.91  23.42  16.45  16.32  14.03  16.51
    16:52   17.04  22.30  16.32  16.67  14.75  16.78
                            .
                            .
                            .
    
[/code]

as.vlinesで['17:00','17:30']を指定しても上手く機能しません。

[code]

    ax = df_occ_test.plot(figsize=(8,5))
    
    #縦の補助線
    ax.vlines(['17:00','17:30'],ax.get_ylim()[0],ax.get_ylim()[1],colors='black',linestyles='dashed')
    
    #凡例
    ax.legend(loc="lower right", bbox_to_anchor=(0.3, -0.3,), borderaxespad=0,ncol=3)
    
    plt.show()
    
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/4yTH8.png)](https://i.stack.imgur.com/4yTH8.png)


CC BY-SA 4.0
2022-03-16T04:11:15.900
86850
2022-03-23T05:54:54.670
2022-03-17T13:10:29.903
3060
51842
question
python python3 pandas matplotlib
pandas.plotにおいてstring indexの場合のvlines()がうまく機能しない


例えば以下のコードだと, 図のように出力されます

[code]

    import matplotlib.pyplot as plt
    
    plt.axis([0, 6, 0, 20])
    plt.vlines(['10:00', '16:00'], ymin=0, ymax=18, color='r')
    plt.vlines(['19:00', '12:00', '3:00', '16:00'], ymin=0, ymax=12, color='g')
    plt.vlines(['12:30', '19:00', '12:35'], ymin=0, ymax=9, color='y')
    plt.vlines([3.7, 3.2, 3.8], ymin=0, ymax=3, color='b')
    
[/code]

[![plt.vlines
出力](https://i.stack.imgur.com/aKZbU.jpg)](https://i.stack.imgur.com/aKZbU.jpg)

  * 0〜6 の位置へ順々に割り当てられる感じ。
  * '16:00'や '19:00'のように, すでに割り振られている X軸項目は, 再利用される
  * 実際は 7項目分ではなく, 小数点数指定して位置決め可能
  * X軸で表示してるものは tick labels と呼ばれる。`plt.xticks([0, 2, 5], ['hello', 'plot', 'world'])` のように変更可能

* * *

X軸の位置を指定するなら 文字列でなく数値で,  
`df.index.get_loc()` で (あるいは listから)探し, その数値で指定するか  
あるいは, 以下のように `DatetimeIndex`用いるとよいでしょう

[code]

    today = pd.Timestamp('today').floor(freq='D')
    df.index = today + pd.to_timedelta(df.index +':00')
    
[/code]

* * *

#### 追記

(たぶん) `DataFrame.plot` ではなく直接 matplotlib使うとよい, のでしょう  
(その場合なら？ plotに使用された x軸文字列で利用可能)

参考:
[Axes.plot](https://matplotlib.org/3.5.1/api/_as_gen/matplotlib.axes.Axes.plot.html)

[code]

    df = pd.DataFrame({'val': [3.6, 3.2, 3.3, 3.6, 3.8]},
                index=['10:00', '15:00', '16:55', '17:00', '17:03'])
    fig,ax = plt.subplots(figsize=(6.4,4.8))
    
    ax.plot('val', 'go-', data=df)
    ax.vlines(x=['17:00', '16:55'], ymin=3.2, ymax=3.7, color='orange')
    plt.show()
    
[/code]

[![Axes.plot](https://i.stack.imgur.com/lx8x4.png)](https://i.stack.imgur.com/lx8x4.png)


CC BY-SA 4.0
2022-03-17T09:45:50.880
86877
2022-03-23T05:54:54.670
2022-03-23T05:54:54.670
43025
43025
86850
answer