Seaborn lmplot facetgrid'de biraz xlim ve ylim nasıl ayarlanır


87

Veri kümemi kategorik bir değişkenle iki gruba bölerek doğrusal bir regresyonu çizmek için Seaborn'un lmplot'unu kullanıyorum.

Hem x hem de y için, her iki grafikte de alt sınırı manuel olarak ayarlamak istiyorum , ancak üst sınırı Seaborn varsayılanında bırakmak istiyorum. İşte basit bir örnek:

import pandas as pd
import seaborn as sns
import random

n = 200
random.seed(2014)
base_x = [random.random() for i in range(n)]
base_y = [2*i for i in base_x]
errors = [random.uniform(0,1) for i in range(n)]
y = [i+j for i,j in zip(base_y,errors)]

df = pd.DataFrame({'X': base_x,
                   'Y': y,
                   'Z': ['A','B']*(n/2)})

mask_for_b = df.Z == 'B'
df.loc[mask_for_b,['X','Y']] = df.loc[mask_for_b,] *2

sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

Bu, aşağıdakileri verir: görüntü açıklamasını buraya girin

Ancak bu örnekte, xlim ve ylim'in (0, *) olmasını istiyorum. Sns.plt.ylim ve sns.plt.xlim kullanmayı denedim ama bunlar sadece sağ taraftaki arsayı etkiliyor. Misal:

sns.plt.ylim(0,)
sns.plt.xlim(0,)

görüntü açıklamasını buraya girin

FacetGrid'deki her grafik için xlim ve ylim'e nasıl erişebilirim?


4
Bu arada, numpy.randommodüle aşina olursanız, rastgele veriler oluşturmak için kendinize çok zaman kazandırabilirsiniz (bu, yapılacak çok yararlı bir şey olabilir!). Örneğin, alabilir base_xve base_ybirlikte base_x = np.random.rand(n); base_y = base_x * 2. yDaha sonra değişken benzer vectorized operasyonları ile oluşturulabilir.
mwaskom

Yanıtlar:


146

lmplotİşlev bir döner FacetGridörneği. Bu nesnenin, setgeçebileceğiniz bir yöntemi vardır.key=value çiftleri ve bunlar ızgaradaki her Axes nesnesine ayarlanır.

İkinci olarak, matplotlib'de bir Axes limitinin sadece bir tarafını Nonevarsayılan olarak kalmasını istediğiniz değeri geçerek belirleyebilirsiniz.

Bunları bir araya getirdiğimizde:

g = sns.lmplot('X', 'Y', df, col='Z', sharex=False, sharey=False)
g.set(ylim=(0, None))

görüntü açıklamasını buraya girin


4
Whoa, bu kolay. Dokümanlara bakıldığında, g.sether alt planı değiştiriyor gibi görünüyor . G.axes, her birini ayrı ayrı ayarlamak için önerilen yönteme yaklaşıyor mu?
exp1orer

6
Evet, bazı özelliklerin bir (veya daha fazla, ancak hepsi değil) g.axesyönüne ayarlamak istiyorsanız , DrV'nin önerdiği gibi diziyi kullanmalısınız .
mwaskom

1
Kabul edilen cevap bu olmalıdır. 5 yıl sonra ve hala çalışıyor ve kabul edilen cevaptan daha verimli.
bbennett36

81

Eksenleri bizzat tutmanız gerekir. Muhtemelen en temiz yol, son satırınızı değiştirmektir:

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

Daha sonra eksen nesnelerini (bir eksen dizisi) elde edebilirsiniz:

axes = lm.axes

Bundan sonra eksen özelliklerini değiştirebilirsiniz.

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)

oluşturur:

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.