Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set some xlim and ylim in Seaborn lmplot facetgrid

I'm using sns.lmplot to plot a linear regression, dividing my dataset into two groups with a categorical variable.

For both x and y, I'd like to manually set the lower bound on both plots, but leave the upper bound at the Seaborn default. Here's a simple example:

import pandas as pd import seaborn as sns import numpy as np  n = 200 np.random.seed(2014) base_x = np.random.rand(n) base_y = base_x * 2 errors = np.random.uniform(size=n) y = base_y + errors  df = pd.DataFrame({'X': base_x, 'Y': y, 'Z': ['A','B']*(100)})  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) 

This outputs the following: enter image description here

But in this example, I'd like the xlim and the ylim to be (0,*) . I tried using sns.plt.ylim and sns.plt.xlim but those only affect the right-hand plot. Example:

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

enter image description here

How can I access the xlim and ylim for each plot in the FacetGrid?

like image 889
exp1orer Avatar asked Aug 08 '14 22:08

exp1orer


People also ask

How do you plot multiple graphs in Python seaborn?

In Seaborn, we will plot multiple graphs in a single window in two ways. First with the help of Facetgrid() function and other by implicit with the help of matplotlib. data: Tidy dataframe where each column is a variable and each row is an observation.

How do you set Xticks in seaborn?

set_xticks() and Axes. set_yticks() functions in axes module of matplotlib library are used to Set the ticks with a list of ticks on X-axis and Y-axis respectively. Parameters: ticks: This parameter is the list of x-axis/y-axis tick locations.


2 Answers

The lmplot function returns a FacetGrid instance. This object has a method called set, to which you can pass key=value pairs and they will be set on each Axes object in the grid.

Secondly, you can set only one side of an Axes limit in matplotlib by passing None for the value you want to remain as the default.

Putting these together, we have:

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

enter image description here

Update

  • Positional arguments, sharex and sharey are deprecate beginning in seaborn 0.11
g = sns.lmplot(x='X', y='Y', data=df, col='Z', facet_kws={'sharey': False, 'sharex': False}) g.set(ylim=(0, None)) 
like image 176
mwaskom Avatar answered Sep 19 '22 11:09

mwaskom


You need to get hold of the axes themselves. Probably the cleanest way is to change your last row:

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

Then you can get hold of the axes objects (an array of axes):

axes = lm.axes 

After that you can tweak the axes properties

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

creates:

enter image description here

like image 34
DrV Avatar answered Sep 23 '22 11:09

DrV