Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to control ylim for a faceted plot with different scales in ggplot2?

Tags:

In the following example, how do I set separate ylims for each of my facets?

qplot(x, value,  data=df, geom=c("smooth")) + facet_grid(variable ~ ., scale="free_y") 

In each of the facets, the y-axis takes a different range of values and I would like to different ylims for each of the facets.

The defaults ylims are too long for the trend that I want to see.

like image 273
signalseeker Avatar asked Nov 05 '10 14:11

signalseeker


People also ask

Can you Facet_wrap by two variables?

facet_wrap() with two variables Compute the counts for the plot so we have two variables to use in faceting: marvel_count <- count(marvel, year, align, gender) glimpse(marvel_count) ## Observations: 155 ## Variables: 4 ## $ year <dbl> 1939, 1939, 1940, 1940, 1940, 1941, 1941, 1943, 1944, 19...

How do I change the Y axis scale in ggplot2?

Use scale_xx() functions It is also possible to use the functions scale_x_continuous() and scale_y_continuous() to change x and y axis limits, respectively.

How do I increase space between facets in ggplot2?

To increase the space between facets in a facetted plot created by using ggplot2 in R, we can use theme function with panel. spacing argument.

How do I change the Y axis scale in R?

To change the axis scales on a plot in base R Language, we can use the xlim() and ylim() functions. The xlim() and ylim() functions are convenience functions that set the limit of the x-axis and y-axis respectively.


2 Answers

This was brought up on the ggplot2 mailing list a short while ago. What you are asking for is currently not possible but I think it is in progress.

like image 101
fideli Avatar answered Oct 14 '22 16:10

fideli


As far as I know this has not been implemented in ggplot2, yet. However a workaround - that will give you ylims that exceed what ggplot provides automatically - is to add "artificial data". To reduce the ylims simply remove the data you don't want plot (see at the and for an example).

Here is an example:

Let's just set up some dummy data that you want to plot

df <- data.frame(x=rep(seq(1,2,.1),4),f1=factor(rep(c("a","b"),each=22)),f2=factor(rep(c("x","y"),22))) df <- within(df,y <- x^2) 

Which we could plot using line graphs

p <- ggplot(df,aes(x,y))+geom_line()+facet_grid(f1~f2,scales="free_y") print(p) 

Assume we want to let y start at -10 in first row and 0 in the second row, so we add a point at (0,-10) to the upper left plot and at (0,0) ot the lower left plot:

ylim <- data.frame(x=rep(0,2),y=c(-10,0),f1=factor(c("a","b")),f2=factor(c("x","y"))) dfy <- rbind(df,ylim) 

Now by limiting the x-scale between 1 and 2 those added points are not plotted (a warning is given):

p <- ggplot(dfy,aes(x,y))+geom_line()+facet_grid(f1~f2,scales="free_y")+xlim(c(1,2)) print(p) 

Same would work for extending the margin above by adding points with higher y values at x values that lie outside the range of xlim.

This will not work if you want to reduce the ylim, in which case subsetting your data would be a solution, for example to limit the upper row between -10 and 1.5 you could use:

p <- ggplot(dfy,aes(x,y))+geom_line(subset=.(y < 1.5 | f1 != "a"))+facet_grid(f1~f2,scales="free_y")+xlim(c(1,2)) print(p) 
like image 20
float Avatar answered Oct 14 '22 16:10

float