49367


エラーバーの表示について質問です。  
細かなところですが、見栄えの問題で、エラーバーとマーカーとラインの重なりを細かく調整したい場合の方法はありますでしょうか？

[code]

    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    df = pd.DataFrame([[1.0, 10.0, 13.0, 11.0, 0.3], 
                       [2.0, 20.0, 30.0, 32.0, 0.5], 
                       [3.0, 30.0, 45.0, 21.0, 0.7], 
                       [4.0, 15.0, 13.0, 11.0, 0.1]], 
                      index=['a', 'b', 'c', 'd'], 
                      columns=['col1','col2','col3','col4','col5'])
    
[/code]

ここから、可視化プログラム。  
ax1がpandasのDataFrame.plot、  
ax2がmatplotlib.pyplotのplotで書かせています。

[code]

    fig = plt.figure(figsize=(6,3), dpi=200)
    ax1 = fig.add_subplot(121)
    df.plot(x="col1",y=["col2","col3","col4"], 
    color=["red","green","orange"], linewidth = 1.0,
    kind="line", linestyle='-',ax=ax1,
    yerr="col5",fmt="o", mfc="b", ms=2.0,
    elinewidth=1.0,ecolor='blue',capsize=2.0,)
    
    ax2 = fig.add_subplot(122)
    CL1=df.loc[:,"col1"]
    CL2=df.loc[:,"col2"]
    CL3=df.loc[:,"col3"]
    CL4=df.loc[:,"col4"]
    CL5=df.loc[:,"col5"]
    ax2.plot(CL1,CL2,"red",lw = 1.0)
    ax2.plot(CL1,CL3,"green",lw = 1.0)
    ax2.plot(CL1,CL4,"orange",lw = 1.0)
    ax2.errorbar(CL1,CL2,yerr=CL5,xerr=None,fmt="o",ms=2.0, mfc="b",
                 elinewidth=1.0, ecolor='blue',capsize=2.0)
    ax2.errorbar(CL1,CL3,yerr=CL5,xerr=None,fmt="o",ms=2.0, mfc="b",
                 elinewidth=1.0, ecolor='blue',capsize=2.0)
    ax2.errorbar(CL1,CL4,yerr=CL5,xerr=None,fmt="o",ms=2.0, mfc="b",
                 elinewidth=1.0, ecolor='blue',capsize=2.0)
    
    ax2.legend(('CL2', 'CL3', 'CL4'))
    plt.tight_layout()
    plt.show()
    
[/code]

[![出力サンプル](https://i.stack.imgur.com/EvYvo.png)](https://i.stack.imgur.com/EvYvo.png)

細かいところですが、pandasの方は、エラーバーが一番うしろに、一方、mayplotの方は、エラーバーとマーカーが前面にあります。  
重なり具合の順番を指定できる方法、もしくは、統一する方法があれば、教えて下さい。  
pandasのplotの方が、プログラム少なく便利です。見栄えの微調整で問題ありか？matplotのplotでは、エラーバー＆マーカーとラインのプログラムが別行なので、その順番を入れ替えてみたが、表示には変化なし。

また、上記、プログラムで、こうした方がいいよとかアドバイスもウェルカムです。

とくに、matplotの方で、１ラインずつ書かせている命令を単純化したいです。  
1000ラインとかあると、とても面倒で書けない。for分で回す？  
あきらめてpandasのdataframe.plotを使う？見栄えの微調整は？  
という問題を今抱えております。  
わがままな質問かもしれませんが、見栄えの美しさを追求しております。  
みなさん、この程度の折れ線グラフを描きたい場合、  
pandasとmatplotどちら派なんでしょう？

また、pandasのplotではできないが、matplotのplotなら  
こんな事ができる！！等のコメントも嬉しいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2018-10-16T09:10:36.117
49348
2018-10-17T11:49:46.517
30391
question
python pandas matplotlib
Pandas.DataFrame.plotとmatplotlib.plot,エラーバー(yerr)表示を微調整したいのだが・・・。


matplotでは重なり具合の順番をzorderで指定できます。zoderの大きい値の方が上になるので、ラインの方にzoderで大きい値を指定すると、エラーバーが後ろになります。

[code]

    ax2.plot(CL1, CL2, "red", lw=1.0, zorder=10)
    ax2.plot(CL1, CL3, "green", lw=1.0, zorder=10)
    ax2.plot(CL1, CL4, "orange", lw=1.0, zorder=10)
    
[/code]

matplotの方で、マーカーを付けて`for`で繰り返し処理をさせるようにすると以下のようなコードになります。

[code]

    fig = plt.figure(figsize=(6,3), dpi=200)
    
    color=["red","green","orange"]
    ax2 = fig.add_subplot(122)
    CL1=df.loc[:,"col1"]
    CL5=df.loc[:,"col5"]
    for i in range(3):
        ax2.plot(CL1, df.iloc[:,i+1],color[i], marker='o', markersize=2, lw=1.0, zorder=10)
        ax2.errorbar(CL1, df.iloc[:,i+1], yerr=CL5, xerr=None, fmt="o", ms=2.0, 
                 elinewidth=1.0, ecolor='blue', capsize=6.0)
    ax2.legend(('CL2', 'CL3', 'CL4'))
    plt.tight_layout()
    plt.show()
    
[/code]

pandasのplotは、matplotを使った簡易版で手軽にグラフが描けるという特徴があります。細かな設定をしたい場合はmatplotを直接使った方がいいと思います。


CC BY-SA 4.0
2018-10-17T01:49:33.103
49367
2018-10-17T11:49:46.517
2018-10-17T11:49:46.517
15171
15171
49348
answer