overlapping y-scales in facet (scale=“free”)

坚强是说给别人听的谎言 提交于 2019-12-11 10:11:13

问题


I've been learning ggplot in the last few weeks. Generally, I'm getting things done (slowly though), but now I'm stuck. I created the following facetted plot: http://dl.dropbox.com/u/7752237/example_bad_y_scales.pdf

Faceting is done by

pl <- pl + facet_wrap(~sci_name,ncol=1,scale="free")

The Problem: Numbers on the y-scale don't look good, especially the scales that go from 0-70 (numbers overlapping). I'd like the somehow change the number of breaks on the y-scale (to let's say just 1 or 2 breaks). Does anybody maybe have an idea how to do that? Any help would be very much appreciated. :)

PS: I didn't include a minimal example because I think it wouldn't help much to solve that specific problem.

Edit after Kohskes answer:

Hi Kohske, Wow, that was a really fast answer, thanks! However, I think it doesn't work well with facetted plots. Look at

p <- ggplot(mtcars, aes(wt, mpg))
p <- p + geom_point()
p <- p + facet_wrap(~gear,ncol=1,scale="free")

On the y-scale, it gives 3 breaks in the middle plot and 8 breaks in the lower plot… not very consistent (but at least not overlapping as in my example).

p2 <- p + scale_y_continuous(breaks=c(15,30),minor_breaks=c(10,20,25))

isn't really good neither: two major ticks on lower plots, only one in middle and upper plot. When having scales with bigger differences than in mtcars, the result would be even less satisfying. Any other ideas? ;)

Edit after Kohskes edit:

Hi, I can't see how to implement this. Searching for ggplot and input_break on google yielded only 10 results, none of them did help. I tried

p <- ggplot(mtcars, aes(wt, mpg))
p <- p + geom_point()
p <- p + facet_wrap(~gear,ncol=1,scale="free")
p$input_breaks<-function(., range) {
    pretty(range, n=3)
}
print(p)

However, I can't see any effects in the graph (tried for n=1, 3, 15). Could you describe how to implement this on the mtcars example? Thanks!


回答1:


p <- ggplot(mtcars, aes(wt, mpg)) p <- p + geom_point()

dev.new(height=1)
print(p)
dev.new(height=1)
p <- p + scale_y_continuous(breaks=c(15,30),minor_breaks=c(10,20,25))
print(p)

the trick is scale_y_continuous and you can specify the breaks and minor breaks in it.

edited:

probably you cannot specify the breaks separately for each facet. one workaround is to control the prettiness of the breaks by:

Trans$input_breaks<-function(., range) {
    pretty(range, n=3)
}
print(p)

changing the "n=3" yields different prettiness.

edited again:

here is full example:

library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))+geom_point()
Trans$input_breaks<-function(., range) {
    pretty(range, n=100)
}
print(p)

in this case, probably you can see a hundred of ticks. by changing n=100, you can custom it.

note that this has side-effect. all plots after this has same number of ticks, and also x and y axis have the same number of ticks.



来源:https://stackoverflow.com/questions/3445540/overlapping-y-scales-in-facet-scale-free

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!