2016-03-23 17 views
2

Amacım, col= veya row= tarafından bölünerek, deniz kuşağı kullanılarak yapılan bir arsa üzerinde y = 0 üzerinde yatay bir kırmızı çizgi çizmek.Seaborn ile dağılım çizimleri

import numpy as np, seaborn as sns, pandas as pd 
np.random.seed(5) 

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)}) 


sns.lmplot("x", "y", col="z", row="w", data=myData, fit_reg=False) 
plt.plot(np.linspace(-20,120,1000), [0]*1000, 'r-') 
Biz parsellerin dizinin sadece son arsa, kırmızı çizgi ile işaretlenmiş olduğunu görebilirsiniz

: Yardımlarınız için

enter image description here

sayesinde

DÜZENLEME: biz col= ve/veya row= kullanılarak grafiklerin bir dizi oluşturmak durumunda hesaba soruyu yeniden sayılır ve biz çizgi, her arsa üzerinde izlenebilir istiyorum. siz de standart matplotlib fonksiyonlarının tümünü kullanabilir, böylece

cevap

4

http://i.imgur.com/J7Lvt52.png Yani bu kod yığın biz col=, row= ve hue= kullanmak genel durum için çalışır.

import numpy as np, seaborn as sns, pandas as pd 
np.random.seed(5) 

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}) 

myPlot = sns.FacetGrid(col="z", row='w', hue='hueMe', data=myData, size=5) 
myPlot = myPlot.map(plt.scatter, "x", "y").set(xlim=(-20,120) , ylim=(-15,15)) 
myPlot = myPlot.map_dataframe(plt.plot, [-20,120], [0,0], 'r-').add_legend().set_axis_labels("x", "y") 
plt.show() 

enter image description here

yatay çizginin rengi her arsa üzerinde kullanılan son renk olarak dışarı çıktığında neden emin değil, ama şimdilik :) Bu vazgeçmek

1

Seaborn, gerçekten matplotlib için sadece bir arayüzdür. pyplot İthalat ve Seaborn arsa benim için çalışan sonra kırmızı yatay çizgi çizilerek.

import numpy as np, seaborn as sns, pandas as pd 
import matplotlib.pyplt as plt 
np.random.seed(5) 

myData = pd.DataFrame({'x' : np.arange(1, 101), 'y': np.random.normal(0, 4, 100)}) 

sns.lmplot("x", "y", data=myData, line_kws={'xdata': '0,1','ydata': '0,0','color': 'k', 'linestyle':'-', 'linewidth':'5'}, fit_reg=False) 
plt.plot(np.linspace(-20,120,1000), [0]*1000, 'r') 

Benim görüntü hazır -

+1

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) –

3

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!

İlgili konular