75780


下記のように、  
項目別に、係数・95％信頼区間上限値・下限値を保持したデータフレームがあります。

[code]

    df = pd.DataFrame({'項目': ['A', 'B', 'C', 'D', 'E', 'F'],
                       '係数': [1.255, 1.087, 0.990, 1.064, 0.885, 0.092],
                       '信頼区間上限値': [2.031, 1.535, 2.162, 1.554, 1.337, 0.382],
                       '信頼区間下限値': [0.775, 0.770, 0.453, 0.728, 0.531,0.022]})
    df.set_index('項目', inplace=True)
    df
    
[/code]

上記のデータフレームから、下記画像のようなエラーバーのグラフを作成したいと考えています。

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

エラーバー自体は、matplotlibの errorbar() で作図できるようなのですが、ｘ軸に値を入れる必要があるようです。  
<https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.errorbar.html>

上記画像のように、X軸にカテゴリ値を持ちたい場合、  
どのように実現可能かご存じの方がいらっしゃいましたらアドバイスいただけませんでしょうか？？

＜追記＞  
kunifさまからアドバイスいただいた内容を参考に模索した結果、下記で実現できそうです。（アドバイスをアレンジしてみた部分（上下の範囲計算）他にもっといいやり方があるような気もしますが。。）

[code]

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame({'項目': ['A', 'B', 'C', 'D', 'E', 'F'],
                       '係数': [1.255, 1.087, 0.990, 1.064, 0.885, 0.092],
                       '信頼区間上限値': [2.031, 1.535, 2.162, 1.554, 1.337, 0.382],
                       '信頼区間下限値': [0.775, 0.770, 0.453, 0.728, 0.531,0.022]})
    df['上範囲'] = df['信頼区間上限値'] - df['係数']
    df['下範囲'] = df['係数'] - df['信頼区間下限値']
    display(df)
    
    ebxname = list(df['項目']) #### X軸目盛りの文字列リスト作成
    ebxname.insert(0, '') #### 先頭に空文字列の挿入
    
    ebx = [i for i in range(len(df))] #### X軸値はデータ行番号をリスト化
    eby = list(df['係数']) #### Y軸値
    
    ebyerr = [df['下範囲'], df['上範囲']] #### 
    ebyerr = np.array(ebyerr) #### numpy.dnarray化
    
    fig, ax = plt.subplots()
    ax.errorbar(ebx, eby, yerr=ebyerr, marker='.', mfc='black', ms=10, linestyle='')
    ax.set_xticklabels(ebxname) #### X軸目盛り文字列設定
    plt.yticks(np.arange(0, 3, step=0.5))
    plt.show()
    
[/code]


CC BY-SA 4.0
2021-05-10T14:11:11.887
75767
2021-05-11T08:29:31.977
2021-05-11T06:06:22.513
41758
41758
question
python matplotlib
pythonによるエラーバーの作図方法


これらの記事のように、X軸の値そのものは数値にして、目盛りの表示を文字列にすれば良いでしょう。  
[Pythonで、横軸が文字列のグラフを作成したい](https://ja.stackoverflow.com/q/71750/26370)  
[pyplotではxticks()、Axesではset_xticklabels()を使うんだって。](https://qiita.com/tomiyou/items/38fce051f8bd7246a0ce)

例えば質問の参照ページのさらに先にあるこちらの内容に合わせて`Axes`を使う場合：  
[Errorbar
function](https://matplotlib.org/3.1.1/gallery/statistics/errorbar.html)

'係数'や'信頼区間'の'上限値'/'下限値'を何にどう当てはめるのかは知識が無いので不明ですが、推測するとおそらくこんな感じで出来るでしょう。(範囲上下端の横線指定方法は知識不足で入っていません)

[code]

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame({'項目': ['A', 'B', 'C', 'D', 'E', 'F'],
                       '係数': [1.255, 1.087, 0.990, 1.064, 0.885, 0.092],
                       '信頼区間上限値': [2.031, 1.535, 2.162, 1.554, 1.337, 0.382],
                       '信頼区間下限値': [0.775, 0.770, 0.453, 0.728, 0.531,0.022]})
    
    #### df.set_index('項目', inplace=True) #### 項目のインデックス化は行わない
    
    ebxname = list(df['項目']) #### X軸目盛りの文字列リスト作成
    ebxname.insert(0, '') #### 先頭に空文字列の挿入
    
    ebx = [i for i in range(len(df))] #### X軸値はデータ行番号をリスト化
    eby = list(df['係数']) #### Y軸値
    
    ebyerr = [df['信頼区間下限値'],df['信頼区間上限値']] #### 
    ebyerr = np.array(ebyerr) #### numpy.dnarray化
    
    fig, ax = plt.subplots()
    ax.errorbar(ebx, eby, yerr=ebyerr, marker='.', mfc='black', ms=10, linestyle='')
    ax.set_xticklabels(ebxname) #### X軸目盛り文字列設定
    plt.show()
    
[/code]


CC BY-SA 4.0
2021-05-10T18:09:27.470
75770
2021-05-10T18:20:10.227
2021-05-10T18:20:10.227
26370
26370
75767
answer


X軸の値には `df['項目']` を指定すればよろしいかと思います。また、キャップは `capsize` で指定します。今回、`ax` は不要に見えるので
`plt.errorbar()` を使用しています。

[code]

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame({
      '項目': ['A', 'B', 'C', 'D', 'E', 'F'],
      '係数': [1.255, 1.087, 0.990, 1.064, 0.885, 0.092],
      '信頼区間上限値': [2.031, 1.535, 2.162, 1.554, 1.337, 0.382],
      '信頼区間下限値': [0.775, 0.770, 0.453, 0.728, 0.531,0.022]
    })
    
    ebx = df['項目'] #### X値
    eby = df['係数'] #### Y値
    ebyerr = (
      df['係数'] - df['信頼区間下限値'], #### 下範囲
      df['信頼区間上限値'] - df['係数'], #### 上範囲
    )
    
    plt.errorbar(
      ebx, eby, yerr=ebyerr,
      marker='.', mfc='black', ms=10, linestyle='', capsize=4)
    plt.yticks(np.arange(0.0, 3.0, step=0.5))
    plt.show()
    
[/code]

[![figure](https://i.stack.imgur.com/UhKBt.png)](https://i.stack.imgur.com/UhKBt.png)


CC BY-SA 4.0
2021-05-11T08:22:24.387
75780
2021-05-11T08:29:31.977
2021-05-11T08:29:31.977
75767
answer