私が来たので、これは答えを探して、ここで私が最終的に発見したより一般的な答えです:
map_dataframe
は、ユーザー定義の関数を受け入れる(そしてこの関数にデータフレームを渡します)あなたがファセットグリッドに何かを描くことができるからです。 OPケースの場合:
def plot_hline(y,**kwargs):
data = kwargs.pop("data") #get the data frame from the kwargs
plt.axhline(y=y, c='red',linestyle='dashed',zorder=-1) #zorder places the line underneath the other points
myPlot = sns.FacetGrid(col="z", row='w', hue='hueMe', data=myData, size=5)
myPlot.map(plt.scatter, "x", "y").set(xlim=(-20,120) , ylim=(-15,15))
myPlot.map_dataframe(plot_hline,y=0)
plt.show()
私の問題は、各ファセットに異なる水平線が必要だったので、少し複雑でした。
私の場合を複製するには、 'z'変数に2つのサンプル(aとb)があり、それぞれ観測値 'obs'(これは以下のmyDataに追加しました)を持っているとします。 'hueMe'は、各サンプルのモデル化された値を表します。
myData = pd.DataFrame({'x' : np.arange(1, 101),
'y': np.random.normal(0, 4, 100),
'z' : ['a','b']*50,
'w':np.random.poisson(0.15,100),
'hueMe':['q','w','e','r','t']*20,
'obs':[3,2]*50})
あなたはplot_hline
にデータフレームを渡すときは、axhlineだけy
のために単一の値を取ることができますので、それぞれの「Z」のサンプルのための「OBS」が重複する値をドロップする必要があります。 (私たちの場合、各サンプルには1つの観測値 'obs'がありますが、複数のモデル化された 'hueMe'値があります)。さらに、y
はスカラーでなければなりません(シリーズではありません)ので、値自体を抽出するためにデータフレームにインデックスを付ける必要があります。
def plot_hline(y,z, **kwargs):
data = kwargs.pop("data") #the data passed in through kwargs is a subset of the original data - only the subset for the row and col being plotted. it's a for loop in disguise.
data = data.drop_duplicates([z]) #drop the duplicate rows
yval = data[y].iloc[0] #extract the value for your hline.
plt.axhline(y=yval, c='red',linestyle='dashed',zorder=-1)
myPlot = sns.FacetGrid(col="z", row='w', hue='hueMe', data=myData, size=5)
myPlot.map(plt.scatter, "x", "y").set(xlim=(-20,120) , ylim=(-15,15))
myPlot.map_dataframe(plot_hline,y='obs',z='z')
plt.show()
resulting plot
今seabornはFacetGrid
の各ファセットに、あなたの関数からの出力をマップします。注:axhlineとは異なるプロット関数を使用している場合、系列から値を抽出する必要はない場合があります。
これが誰かを助けることを願っています!
ありがとうございましたTim、それは私たちが1つのプロットを持っている場合に適しています。しかし、 'sns'から' col = 'と' row = 'というパラメータを使ってデータを分割するとどうなりますか? (元の質問の編集をご覧ください) –