Seaborn lmplot facetgrid में कुछ xlim और ylim कैसे सेट करें


85

मैं सीरमॉर्न के lmplot का उपयोग एक रेखीय प्रतिगमन की साजिश रचने के लिए कर रहा हूं, अपने डेटासेट को दो समूहों में एक श्रेणीगत चर के साथ विभाजित कर रहा हूं।

एक्स और वाई दोनों के लिए, मैं दोनों भूखंडों पर मैन्युअल रूप से निचली बाउंड सेट करना चाहता हूं , लेकिन सीबोर्न डिफ़ॉल्ट पर ऊपरी बाउंड को छोड़ दें । यहाँ एक सरल उदाहरण है:

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)

यह निम्न आउटपुट देता है: यहां छवि विवरण दर्ज करें

लेकिन इस उदाहरण में, मैं xlim और ylim होना चाहता हूं (0, *)। मैंने sns.plt.ylim और sns.plt.xlim का उपयोग करने की कोशिश की, लेकिन वे केवल दाहिने हाथ की साजिश को प्रभावित करते हैं। उदाहरण:

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

यहां छवि विवरण दर्ज करें

मैं FacetGrid में प्रत्येक प्लॉट के लिए xlim और ylim का उपयोग कैसे कर सकता हूं?


4
वैसे, यदि आप खुद को numpy.randomमॉड्यूल से परिचित करते हैं, तो आप अपने आप को यादृच्छिक डेटा उत्पन्न करने में बहुत समय बचा सकते हैं (जो कि बहुत उपयोगी चीज हो सकती है!)। उदाहरण के लिए, आप प्राप्त कर सकते हैं base_xऔर base_yसाथ base_x = np.random.rand(n); base_y = base_x * 2। तब yचर समान रूप से वेक्टरकृत संचालन के साथ उत्पन्न हो सकता है।
mwaskom

जवाबों:


143

lmplotसमारोह एक रिटर्न FacetGridउदाहरण। इस ऑब्जेक्ट में एक विधि है set, जिसे आप key=valueजोड़े पास कर सकते हैं और वे ग्रिड में प्रत्येक एक्सिस ऑब्जेक्ट पर सेट हो जाएंगे।

दूसरे, आप Noneजिस मान के लिए डिफ़ॉल्ट रहना चाहते हैं, उसके लिए matplotlib में केवल एक्सिस सीमा का एक पक्ष निर्धारित कर सकते हैं ।

इन्हें एक साथ रखना, हमारे पास है:

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

यहां छवि विवरण दर्ज करें


4
वाह, यह आसान है। डॉक्स में देखते हुए, यह g.setहर सबप्लॉट में बदलाव लगता है । क्या g.axes उनमें से प्रत्येक को अलग से सेट करने के लिए अनुशंसित तरीके से संपर्क कर रहा है?
exp1orer

6
हां, यदि आप कुछ गुणों को एक (या अधिक, लेकिन सभी नहीं) पर सेट करना चाहते हैं तो आपको g.axesसरणी का उपयोग करना चाहिए , जैसा कि DrV बताता है।
mwaskom

1
यह स्वीकृत उत्तर होना चाहिए। 5 साल बाद और यह अभी भी काम करता है और स्वीकृत उत्तर की तुलना में अधिक कुशल है।
bbennett36

81

आपको स्वयं कुल्हाड़ियों को पकड़ना होगा। संभवत: सबसे साफ तरीका अपनी अंतिम पंक्ति को बदलना है:

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

तब आप कुल्हाड़ियों की वस्तुओं (कुल्हाड़ियों की एक सरणी) को पकड़ सकते हैं:

axes = lm.axes

उसके बाद आप कुल्हाड़ियों के गुणों को मोड़ सकते हैं

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

बनाता है:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.