

画像のようにedgecolorが色分けされてしまうですが、stripplotと同じように色わけするにはどうすればいいでしょうか？

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

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    import random
    
    %matplotlib inline
    
    df = pd.DataFrame({ 'E' :pd.Categorical(['A', 'A','A','A','B', 'B','B','B','A', 'A','A','A','B', 'B','B','B']),
                            'F' :pd.Categorical([ 'C','C','C','C', 'C','C','C','C','D','D','D','D','D','D','D','D']),
                            'G' : random.sample(range(30), k=16)})
    
    sns.set_style('ticks')
    sns.set_context('poster', rc={'axes.titlesize':10, 'axes.labelsize':10, 'xtick.labelsize':10})
    plt.subplot()
    plt.rcParams['figure.figsize']=[15, 15]
    clrs=['b', 'y']
    
    ax=sns.barplot(x="F", y="G", hue="E", data=df, errwidth=2, capsize=0.15, errcolor='k', dodge=True, facecolor=(1, 1, 1, 0),
                   linewidth=4,edgecolor=clrs)
    sns.stripplot(x="F", y="G", hue="E", data=df, palette=clrs, linewidth=0, dodge=True, size=15)
    
    ax.set_ylim([0, 10])
    
    from matplotlib import ticker
    ax.yaxis.set_major_locator(ticker.MultipleLocator(1)) 
    sns.despine()
    ax.legend(loc="lower left", bbox_to_anchor=(0., 1., 1.0, 0.05), mode="expand", ncol=3)
    
    columncounts = [30,30,30,30,30,30,30,30,30,30]
    def normaliseCounts(widths,maxwidth):
        widths = np.array(widths)/float(maxwidth)
        return widths
    widthbars = normaliseCounts(columncounts,90)
    for bar,newwidth in zip(ax.patches,widthbars):
        x = bar.get_x()
        width = bar.get_width()
        centre = x+width/2.
    
        bar.set_x(centre-newwidth/2.)
        bar.set_width(newwidth)
    
[/code]


CC BY-SA 4.0
2020-11-11T09:07:47.857
71870
2020-11-12T14:46:16.107
2020-11-12T06:54:17.113
42686
42686
question
python
seabornで棒グラフを描きたいのですが、edgecolorをpeletteで色分けするにはどうしたらいいでしょうか？


どうも`palette`と`edgecolor`は色の割り当て順番の考え方が別々となっているようで、1つの`barplot`や`stripplot`の中で`palette`と`edgecolor`の両方に同じカラーのリストを指定しても同じ色にはならないようです。

何かテクニックがあれば実現出来るのかもしれませんが、それよりは簡単に思い付く代替案にしてみました。

それぞれソースの変更行と表示結果を載せます。  
あとY軸の範囲とか少し数字を変更しています。

  1. `barplot`と`stripplot`の両方の`palette`を同じにする  
ただしそうすると`barplot`のバーと`stripplot`の丸が同じ領域にある場合に区別が付かなくなるので、`stripplot`の丸に別の`edgecolor`を指定する

a. `barplot`の`edgecolor`は有りのままとする

[code]

    ax=sns.barplot(x="F", y="G", hue="E", data=df, palette=clrs, errwidth=2, capsize=0.15, errcolor='k', dodge=True, linewidth=2, edgecolor=clrs)
    sns.stripplot(x="F", y="G", hue="E", data=df, palette=clrs, linewidth=1, dodge=True, size=10, edgecolor='r')
    
[/code]

[![](https://i.stack.imgur.com/44JAO.jpg)](https://i.stack.imgur.com/44JAO.jpg)

b. `barplot`の`edgecolor`を無しとする

[code]

    ax=sns.barplot(x="F", y="G", hue="E", data=df, palette=clrs, errwidth=2, capsize=0.15, errcolor='k', dodge=True)
    sns.stripplot(x="F", y="G", hue="E", data=df, palette=clrs, linewidth=1, dodge=True, size=10, edgecolor='r')
    
[/code]

[![](https://i.stack.imgur.com/3w2Hy.jpg)](https://i.stack.imgur.com/3w2Hy.jpg)

  2. `stripplot`の`edgecolor`を表示することとし、`barplot`と`stripplot`の両方の`edgecolor`を同じにする

[code]

    ax=sns.barplot(x="F", y="G", hue="E", data=df, errwidth=2, capsize=0.15, errcolor='k', dodge=True, facecolor=(1, 1, 1, 0), linewidth=2, edgecolor=clrs)
    sns.stripplot(x="F", y="G", hue="E", data=df, palette=clrs, linewidth=2, dodge=True, size=10, facecolor=(1, 1, 1, 0), edgecolor=clrs)
    
[/code]

[![](https://i.stack.imgur.com/x8qo7.jpg)](https://i.stack.imgur.com/x8qo7.jpg)


CC BY-SA 4.0
2020-11-12T14:28:34.370
71899
2020-11-12T14:46:16.107
2020-11-12T14:46:16.107
26370
26370
71870
answer