Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

forcing ggplot2 y-axis label to be of integer only, and give proper breaks [duplicate]

Tags:

r

ggplot2

I am drawing barchart for discrete data and ggplot by default adjust the y-axis for me, but gives me y-axis label with breaks at 0.5 interval which I don't like it. I tried scale_y_discrete but y-axis breaks is given for every discrete value, which is not good also.

Can I force the y-axis break to be composed of integer only, and give proper breaks for each of the facet?

Sample script is as below:

set.seed(1)
chart.data <- data.frame(x=rep(LETTERS[1:10],3),
                         y=c(sample(0:10,10,replace=TRUE),
                             sample(0:100,10,replace=TRUE),
                             sample(0:1000,10,replace=TRUE)),
                         group=sort(rep(1:3,10)))
chart <- ggplot(data=chart.data,aes(x=x,y=y))
chart <- chart + geom_bar(stat="identity")
chart <- chart + scale_y_discrete()
chart <- chart + facet_wrap(facets=~group,nrow=1,scale="free_y")

Update #1

Since the post is being considered as possible duplicate, the script is refined to show a more complicated scenario.

like image 700
lokheart Avatar asked Oct 22 '13 07:10

lokheart


2 Answers

First, as your y data are continuous you should use scale_y_continuous(). In this function you can add argument breaks= pretty_breaks() (add library scales to use function pretty_breaks()). If you don't provide any number inside pretty_breaks() then in this case you will get integer numbers on y axis. You can set number of breaks to display, for example, pretty_breaks(4) but for the first facet where you have range 0-10 it will still display only integer values and the number of breaks will be larger to get "nice" numbers.

library(scales)
ggplot(data=chart.data,aes(x=x,y=y)) + 
  geom_bar(stat="identity") +  
  facet_wrap(facets=~group,nrow=1,scale="free_y")+
  scale_y_continuous(breaks= pretty_breaks())
like image 79
Didzis Elferts Avatar answered Nov 07 '22 08:11

Didzis Elferts


You can also direclty specify the breaks in a function. Below are a few examples of how you could do this. Also look at the breaks argument in ?discrete_scale.

chart + scale_y_discrete(breaks=function(n) c(0, floor(max(n)/2), max(n)))    
chart + scale_y_discrete(breaks=function(n) n[floor(length(n)/5)*1:5+1])
chart + scale_y_discrete(breaks=function(n) 10^(ceiling(log10(max(n)))-1)*2*0:5)
like image 5
shadow Avatar answered Nov 07 '22 08:11

shadow