2017-06-28 25 views
3

は、私がこのように生成されたパンダDataFrame持っていると仮定して:seaborn箱ひげ図のx軸の数字ではなく、ラベル

df = pd.DataFrame(columns=['x_value', 'y_value']) 
for x in [1.0, 3.0, 9.0]: 
    for _ in range(1000): 
     df = df.append({'x_value':x, 'y_value':np.random.random()}, ignore_index=True) 

結果はこのようなものになりますにseabornを使用して

In: df.head() 
Out: 
    x_value y_value 
0 1.0 0.616052 
1 3.0 1.406715 
2 9.0 8.774720 
3 1.0 0.810729 
4 3.0 1.309627 

をボックスプロットを生成すると、次の結果が得られます。

[In] sns.boxplot(x='x_value', y='y_value', data=df) 
[Out] 

enter image description here

私が望むのは、x軸の値がラベルではなく数字として扱われるような間隔のボックスプロットを生成することです。

これは可能ですか? ボックスプロットでこれを行うことができない場合、データのばらつきに関する情報を伝えるために間違ったタイプのグラフを見ていますか?

+0

そして、はい、私はhttps://stackoverflow.com/questions/36369291/x-axis-is-not-correctly-spaced-in-seaborn([この]を見ていました/ 36371454#36371454)の問題を理解するのに役立ちましたが、解決策を見つけることはできませんでした。 – MPa

答えて

1

@mwaskomは、私の最初の答えの中で、order引数を使用すると、ボックス間に空のボックス位置を作成することができます。

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 
import numpy as np 

x = np.random.choice([1,3,9], size=1001) 
y = np.random.rand(1001)*(4+np.log(x)) 
df = pd.DataFrame({"x":x, "y":y}) 

sns.boxplot(x='x', y='y', data=df, order=range(1,10)) 

plt.show() 

enter image description here

軸は、それが1刻みで0から始まり、そして唯一のラベルは、これが異なることが示唆することを意味し、この場合には、まだカテゴリであることに注意してください。質問の場合、これは問題ではありませんが、問題が発生した場合にはそれを認識する必要があります。他の定量プロットを同じグラフにプロットします。 は、バーの位置が整数の場合にのみ有効です

もう1つのより一般的な解決策は、代わりにmatplotlib.pyplot.boxplotを使用することです。このソリューションは、各「色相」カテゴリに対して同じ数の値を持つかどうかによって異なります。それらの一般的なケースでは、ループ内の値ごとに1つのボックスプロットをプロットします。軸は真にスケールされ、非整数も問題ありません。

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 
import numpy as np 


x = np.random.choice([1,3,9], size=1001) 
y = np.random.rand(1001)*(4+np.log(x)) 
df = pd.DataFrame({"x":x, "y":y}) 

u = df.x.unique() 
color=plt.cm.spectral(np.linspace(.1,.8, len(u))) 
for c, (name, group) in zip(color,df.groupby("x")): 
    bp = plt.boxplot(group.y.values, positions=[name], widths=0.8, patch_artist=True) 
    bp['boxes'][0].set_facecolor(c) 


plt.xticks(u,u) 
plt.autoscale() 
plt.show() 

enter image description here

+0

数値が整数であれば、海底では 'order'を使って特定の位置に置くことができます。 – mwaskom

+0

@mwaskomあなたが意味するものの例を挙げることができますか?または、sns.boxplotを使用して解決できる場合は、独自の答えを追加してください。私はそれが本当に多くの人々のために興味があると思うので、解決策があればコメントに隠されていない方がいいかもしれません。私が理解しているように、 'order'は単に[1,3,9]の代わりに[3,1,9]のような順序を設定しますか? – ImportanceOfBeingErnest

+1

'order = range(1、10)'を実行します。後にダニを弄ばなければならないかもしれません。 – mwaskom

関連する問題