2017-09-29 6 views
0

ボックスプロットと平均の両方を1つの図にプロットしたいと思います。これまでのところ、私のプロットはこれらのコード行を使用して次のようになります。Python:1つのプロットで海賊のポイントプロットとボックスプロットがx軸上に移動しました

sns.swarmplot(x="stimulus", y="data", data=spi_num.astype(np.float), edgecolor="black", linewidth=.9) 
sns.boxplot(x="stimulus", y="data", data=spi_num.astype(np.float), saturation=1) 
sns.pointplot(x="stimulus", y="data", data=spi_num.astype(np.float), linestyles='', scale=1, color='k', errwidth=1.5, capsize=0.2, markers='x') 
sns.pointplot(x="stimulus", y="data", data=spi_num.astype(np.float), linestyles='--', scale=0.4, color='k', errwidth=0, capsize=0) 
plt.ylabel("number of spikes") 
plt.title("Median Number of Spikes"); 

enter image description here

私は、エラーバーはと重ならないように、少し右に私の平均「はx」のマーカーをシフトしたいと思いますボックスプロットからのウィスカー。どのようにそれを行うにはどのようなアイデア?ボーナスの質問:このプロットに「x:mean、o:data values」という言葉をエレガントに表現する凡例を挿入するにはどうすればよいですか?


プロット上のポイントをシフトさせるために、私のデータフレーム

trial_vec = np.tile(np.arange(16)+1, 10)  
stimulus_vec = np.repeat([-2., -1.75, -1., -0.75, -0.5, 0.5, 1., 1.25, 1.75, 2.5 ], 16)     
data_vec  = np.random.randint(0, 16, size=160) 
spi_num  = pd.DataFrame({'trial': trial_vec, 'stimulus': stimulus_vec, 'data': data_vec}).astype('object') 

答えて

1

を構築し、1変換を使用することができます。この場合はScaledTranslationが便利です。残念なことに、seabornはトランスフォームを直接使用することはできず、プロットされたオブジェクトにアクセスすることはできません。したがって、プロットされたオブジェクト(この場合はPathCollection)を軸から取得する必要があります。オフセットされるプロットが軸axの最初のプロットの場合、単にax.collections[0]で取得することができます。次に変換を.set_transformで設定することができます。

fig, ax = plt.subplots() 
sns.pointplot(... , ax=ax) 
#produce transform with 5 points offset in x direction 
offset = transforms.ScaledTranslation(5/72., 0, ax.figure.dpi_scale_trans) 
trans = ax.collections[0].get_transform() 
ax.collections[0].set_transform(trans + offset) 

完全なコード:だけでなくlineplotをシフトする

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


trial_vec = np.tile(np.arange(16)+1, 10)  
stimulus_vec = np.repeat([-2., -1.75, -1., -0.75, -0.5, 0.5, 1., 1.25, 1.75, 2.5 ], 16) 
data_vec  = np.random.randint(0, 16, size=160) 
spi_num  = pd.DataFrame({'trial': trial_vec, 
          'stimulus': stimulus_vec, 'data': data_vec}) 

fig, ax = plt.subplots() 

sns.pointplot(x="stimulus", y="data", data=spi_num, linestyles='', scale=1, 
       color='k', errwidth=1.5, capsize=0.2, markers='x', ax=ax) 
#produce transform with 5 points offset in x direction 
offset = transforms.ScaledTranslation(5/72., 0, ax.figure.dpi_scale_trans) 
trans = ax.collections[0].get_transform() 
ax.collections[0].set_transform(trans + offset) 

sns.swarmplot(x="stimulus", y="data", data=spi_num, edgecolor="black", linewidth=.9, ax=ax) 
sns.boxplot(x="stimulus", y="data", data=spi_num, saturation=1, ax=ax) 
sns.pointplot(x="stimulus", y="data", data=spi_num, linestyles='--', scale=0.4, 
       color='k', errwidth=0, capsize=0, ax=ax) 
plt.ylabel("number of spikes") 
plt.title("Median Number of Spikes"); 

plt.show() 

enter image description here

は、あなたがその散布ポイント(ax.collections[1])と、上記のように、すべての行に対して同じことを行う必要があるだろうプロット(ax.lines

sns.pointplot(x="stimulus", y="data", data=spi_num, linestyles='--', scale=0.4, 
       color='k', errwidth=0, capsize=0, ax=ax, gid="Nm") 
# shift points of connecting line: 
trans = ax.collections[1].get_transform() 
ax.collections[1].set_transform(trans + offset) 
# shift everything else: 
for line in ax.lines: 
    trans = line.get_transform() 
    line.set_transform(trans + offset) 
+0

あなたはプロですanks!私は後でそれを試みます。 –

+0

点線を 'x'でどのようにシフトするのですか?そしてエラーバーも?今のところ私のマーカだけがシフトされていますが、それは奇妙に見えます。 –

+0

どこに問題がありますか?何か試しましたか? – ImportanceOfBeingErnest

関連する問題