Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot geom_errorbar width when faceting (and scale="free")

Tags:

plot

r

ggplot2

I'm trying to create a faceted plot using ggplot and geom_errorbar. However, each different facet may have have vastly different x ranges, and so the width of the error bar isn't looking "good". Here's a MWE:

library(ggplot2)
test <- data.frame( group=rep(c(1,2,3),each=10), ymin=rnorm(30), ymax=rnorm(30))
test$x <- rnorm(30) * (1+(test$group==1)*20)
ggplot( test, aes(x=x, ymin=ymin, ymax=ymax) ) +
  geom_errorbar(width=5) + facet_wrap( ~ group, scale="free_x" )
ggplot( test, aes(x=x, ymin=ymin, ymax=ymax) ) +
  geom_errorbar(width=.2) + facet_wrap( ~ group, scale="free_x" )

In the first plot, the error bars for group 1 look great, but 2 and 3 are far too wide. In the second plot, the error bars are way too small for group 1. Is there an easy way to fix this? I'm thinking I might just have to use width=0, but I'd like to avoid that.

First Plot

Second Plot

like image 486
random_forest_fanatic Avatar asked Jan 24 '13 16:01

random_forest_fanatic


1 Answers

Workaround for this problem would be to add to your data frame new column wd that contains width of the errorbars for each level.

test <- data.frame( group=rep(c(1,2,3),each=10), ymin=rnorm(30), ymax=rnorm(30))
test$x <- rnorm(30) * (1+(test$group==1)*20)
test$wd<-rep(c(10,0.5,0.5),each=10)

Then use this new column to set width= in geom_errorbar(). It should be set inside the aes() call.

ggplot( test, aes(x=x, ymin=ymin, ymax=ymax) ) +
  geom_errorbar(aes(width=wd)) + facet_wrap( ~ group, scale="free_x" )

enter image description here

like image 118
Didzis Elferts Avatar answered Oct 14 '22 20:10

Didzis Elferts