ben geldiğinden beri Bu yanıtın karşısına çıkan bir cevap, daha sonra keşfettiğim daha genel bir cevaptır:
map_dataframe
ayrıca kullanıcı tanımlı bir işlevi kabul edecektir (ve veri çerçevesini bu işleve iletir) çünkü facetgrid üzerine bir şey çizebilirsin. OP durumda: Her faset farklı yatay bir çizgi istedim çünkü
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()
Benim sorunum biraz daha karmaşık oldu.
, benim durumda çoğaltma 'Z' değişkeni iki numune olduğunu varsayalım için (a ve b) ve (aşağıda MyData ilave ettik) gözlemlenen bir değeri 'atıl' her biri. 'hueMe' her örnek için modellenmiş değerleri temsil eder. Eğer
plot_hline
veri çerçevesini geçtiği zaman
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})
, sen axhline sadece y
için tek bir değer alabilir çünkü, her bir 'Z' örnek için 'atıl' yinelenen değerleri düşmesi gerekir. (Bu durumda hatırlamak her örnek 1 gözlenen değer 'gözlenen' ancak birden modellenen 'hueMe' değerleri vardır). ayrıca, y
(yerine bir dizi yerine) bir skaler olmalıdır böylece değerini kendisi ayıklamak için veri çerçevesinin içine endeksi gerekir.
resulting plot
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()
Şimdi Seaborn
FacetGrid
her faset üzerine işlevinden çıkış eşler.Axhline'dan farklı bir çizim işlevi kullanıyorsanız, mutlaka diziden değeri çıkarmanız gerekmeyebilir.
Bu birinin işe yaramasını umarız!
Teşekkürler Tim, tek bir arsa olduğunda durum için işe yarar - harika. Ama ya veriyi “col” ve “sss” den “sns” parametrelerini kullanarak ayırırsak? (lütfen orijinal soruya yapılan düzenlemeye bakın) –