2013-07-06 21 views
18

non riesco a trovare la documentazione per i doppi punti intorno densitàdoppi punti in un ggplot

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)) 

Sapete cosa operatore rappresentano?

Modifica

so cosa vuol fa quando viene utilizzato in un geom, vorrei sapere che cosa è . Per esempio, l'operatore singolo punto è definito come

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

Se ridefinire densità, quindi ..density .. ha un effetto diverso, così sembra XX -> ..XX .. è un operatore. Mi piacerebbe scoprire come è definito.

+0

Vedere la documentazione su stat_bin. – joran

+0

Questo è il segnale per 'ggpolot2' per eseguire il proprio calcolo interno del valore piuttosto che cercare il valore nell'area di lavoro. –

+0

sì, vedo l'effetto. Posso sostituire per .. conto .. per ottenere un istogramma regolare. ma mi chiedo come il linguaggio costruisca ciò che è veramente. se ridefinisco la funzione 'density' che influisce sul disegno, quindi fun x -> ..x .. è un operatore da solo – nicolas

risposta

22

A differenza di molti altri linguaggi, in R, il punto è perfettamente valido negli identificatori. In questo caso, ..count.. è un identificatore. Tuttavia, esiste un codice speciale in ggplot2 per rilevare questo motivo e per rimuovere i punti. Sembra improbabile che il codice reale utilizzi identificatori formattati in questo modo, e quindi questo è un modo pulito per distinguere tra estetica definita e calcolata.

Il codice relativo è a fine 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]]) 
} 

È utilizzato più in alto sopra nella funzione map_statistic. Se è presente un'estetica calcolata, viene utilizzato un altro frame di dati (uno che contiene ad esempio la colonna count) per il grafico.

Il punto singolo . è solo un altro identificatore, definito nel pacchetto plyr. Come puoi vedere, è una funzione.

+0

fantastico. quindi questa è magia magica basata sulla riflessione. buono a sapere come immagino rappresenti un intero pattern in alcune librerie R e fornisce un punto di ingresso documentato in ggplot. – nicolas

+0

@nicolas: non sono sicuro se il termine "riflessione" si applica qui. 'ggplot2' sta semplicemente guardando i dati e intraprende azioni diverse se i dati sono formattati in un certo modo. – krlmlr

+1

bene il legame non è statico, e viene calcolato al volo, in base ad alcuni attributi.può essere che non è riflessione, ma sembra vicino ad esso. – nicolas