r - How to use facet_grid() with geom_histogram() -


i tried using facet_grid() first time. plotted histograms own data, , distribution seemed inaccurate when counted boxes manually on graph. replicated code using mtcars data, , problem seemed persist.

here histogram produced ggplot:

dfrm <- mtcars dfrm$am <- factor(dfrm$am, levels = c(0,1), labels = c("automatic", "manual")) dfrm$vs <- factor(dfrm$vs, levels = c(0,1), labels = c("v-engine", "straight-engine"))  require(ggplot2) ggplot(dfrm, aes(x=dfrm[,"mpg"], fill=dfrm[,"am"], colour=dfrm[,"am"])) + geom_histogram(colour="transparent", position = "identity", alpha=0.2, bins = 10) + facet_grid(. ~ dfrm[,"vs"]) 

when count manually on histogram, count:

  • v-engine, automatic: 14
  • v-engine, manual: 4
  • straight engine, automatic: 5
  • straight engine, manual: 9

this code counts how many of exist in actual data:

require(pastecs) by(data=dfrm$am, indices = dfrm$vs,  table) 

and results are:

  • v-engine, automatic: 12
  • v-engine, manual: 6
  • straight engine, automatic: 7
  • straight engine, manual: 7

am doing wrong? there better way facet, or bug?

i did histograms base package check if results match, , seem accurate when count boxes.

hist(mtcars[which(mtcars[,"am"]==0 & mtcars[,"vs"]==0),"mpg"], xlim=c(10, 35), col=rgb(0.1,0.1,0.1,0.5), breaks=10) hist(mtcars[which(mtcars[,"am"]==1 & mtcars[,"vs"]==0),"mpg"], col=rgb(0.8,0.8,0.8,0.5), breaks=10 ,add=t) hist(mtcars[which(mtcars[,"am"]==0 & mtcars[,"vs"]==1),"mpg"], xlim=c(10, 35), col=rgb(0.1,0.1,0.1,0.5), breaks=10) hist(mtcars[which(mtcars[,"am"]==1 & mtcars[,"vs"]==1),"mpg"], col=rgb(0.8,0.8,0.8,0.5), breaks=10 ,add=t) 

thanks.

===edit===

the answer provided bdemarest solves problem. however, confused syntax ggplot2 prefers, , how put inside function. here going for:

myfunc <- function(varx, dfrm, facet = f){   require(ggplot2)   p = ggplot(dfrm, aes(x=varx, fill=am)) +     geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10)   if(!is.logical(facet)){     p <- p + facet_grid(. ~ facet)   }   return(p) } myfunc("mpg", mtcars, facet = "vs") 

i tried , without quotations, couldn't work.

=== edit2 ===

with of bdemarest in comments, made lot of progress, color fill fails, when ggplot inside function

here, works perfectly:

facet = "vs" p = ggplot(dfrm, aes_string(x="mpg", fill="am")) +   geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10) if(!is.logical(facet)){   p <- p + facet_grid(reformulate(facet, ".")) } p 

however, not:

myfunc <- function(varx, dfrm, facet = false){   require(ggplot2)   p = ggplot(dfrm, aes_string(x=varx, fill="am")) +     geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10)   if(!is.logical(facet)){     p <- p + facet_grid(reformulate(facet, "."))   }   return(p) } myfunc("mpg", mtcars, facet = "vs") 

the problem here groups wont colored accordingly. missing?

not sure caused problem, seems solved cleaning , simplifying ggplot code. in particular, ggplot2 not designed use column selection syntax such dfrm$am or dfrm[, "am"] inside of aes() function (nor in formula expression facet_wrap(. ~ dfrm[, "vs"])). although these types of expressions seem work fine, in general should avoided.

library(ggplot2)  table(dfrm$am, dfrm$vs) #            #             v-engine straight-engine #   automatic       12               7 #   manual           6               7  p = ggplot(dfrm, aes(x=mpg, fill=am)) +     geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10) +     facet_grid(. ~ vs)  ggsave("hist.png", p, height=4, width=6, dpi=150) 

enter image description here


Comments

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -