Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

double dots in a ggplot

Tags:

r

ggplot2

I can not find the documentation for the double dots around density

set.seed(1234) df <- data.frame(cond = factor(rep(c("A","B"), each=200)), rating = c(rnorm(200),rnorm(200, mean=.8))) print(head(df)) print(ggplot(df, aes(x=rating)) +      geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis                    binwidth=.5,                    colour="black", fill="white") +     geom_density(alpha=.2, fill="#FF6666") +     geom_vline(aes(xintercept=mean(rating, na.rm=T)),   # Ignore NA values for mean                color="red", linetype="dashed", size=1)) 

Do you know what operator they represent ?

Edit

I know what it does when used in a geom, I would like to know what it is. For instance, the single dot operator is defined as

> . function (..., .env = parent.frame())  {     structure(as.list(match.call()[-1]), env = .env, class = "quoted") } <environment: namespace:plyr> 

If I redefine density, then ..density.. has a different effect, so it seems XX -> ..XX.. is an operator. I would like to find how it is defined.

like image 722
nicolas Avatar asked Jul 06 '13 12:07

nicolas


1 Answers

Unlike many other languages, in R, the dot is perfectly valid in identifiers. In this case, ..count.. is an identifier. However, there is special code in ggplot2 to detect this pattern, and to strip the dots. It feels unlikely that real code would use identifiers formatted like that, and so this is a neat way to distinguish between defined and calculated aesthetics.

The relevant code is at the end of layer.r:

# Determine if aesthetic is calculated is_calculated_aes <- function(aesthetics) {   match <- "\\.\\.([a-zA-z._]+)\\.\\."   stats <- rep(FALSE, length(aesthetics))   grepl(match, sapply(aesthetics, deparse)) }  # Strip dots from expressions strip_dots <- function(aesthetics) {   match <- "\\.\\.([a-zA-z._]+)\\.\\."   strings <- lapply(aesthetics, deparse)   strings <- lapply(strings, gsub, pattern = match, replacement = "\\1")   lapply(strings, function(x) parse(text = x)[[1]])  } 

It is used further up above in the map_statistic function. If a calculated aesthetic is present, another data frame (one that contains e.g. the count column) is used for the plot.

The single dot . is just another identifier, defined in the plyr package. As you can see, it is a function.

like image 85
krlmlr Avatar answered Sep 22 '22 09:09

krlmlr