2013-07-06 22 views
18

nie mogę znaleźć w dokumentacji podwójnych kropek wokół gęstościpodwójne kropki w 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)) 

Czy wiesz, co oni reprezentują operator?

Edit

wiem co to ma użyte w GEOM, chciałbym wiedzieć, co to jest. Na przykład, pojedyncza kropka jest zdefiniowana jako

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

Jeśli ponownie zdefiniować gęstość, następnie ..density .. ma różny wpływ, jak się wydaje XX -> .. jest ..XX operator. Chciałbym dowiedzieć się, jak to jest zdefiniowane.

+0

Zobacz dokumentację na stronie stat_bin. – joran

+0

To jest sygnał, że 'ggpolot2' wykonuje własne wewnętrzne obliczenia wartości, zamiast szukać wartości w obszarze roboczym. –

+0

Tak, widzę efekt. Mogę zastąpić przez ... licznik, żeby uzyskać regularny histogram. ale zastanawiam się, jak język konstruuje to, co jest naprawdę. jeśli na nowo zdefiniuję funkcję "gęstość", która wpływa na rysunek, więc zabawa x -> ..x .. jest operatorem na własną odpowiedzialność – nicolas

Odpowiedz

22

W przeciwieństwie do wielu innych języków, w R kropka jest całkowicie poprawna w identyfikatorach. W tym przypadku ..count.. jest identyfikatorem. Istnieje jednak specjalny kod w ggplot2 w celu wykrycia tego wzoru i usunięcia kropek. Wydaje się mało prawdopodobne, aby prawdziwy kod korzystał z tak sformatowanych identyfikatorów, a więc jest to dobry sposób na rozróżnienie między zdefiniowaną i wyliczoną estetyką.

Odpowiedni kod znajduje się na końcu 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]]) 
} 

Służy dalej do góry w funkcji map_statistic. Jeżeli obliczona estetyka jest obecna, inna karta danych (taka, która zawiera np. Kolumnę count) jest używana do wykresu.

Pojedyncza kropka . to kolejny identyfikator zdefiniowany w pakiecie plyr. Jak widać, jest to funkcja.

+0

niesamowite. więc to jest magia oparta na refleksji. dobrze wiedzieć, ponieważ wyobrażam sobie, że reprezentuje on cały wzór w niektórych bibliotekach RL i dostarcza jeden udokumentowany punkt wejścia w ggplot. – nicolas

+0

@nicolas: Nie jestem pewien, czy ma tu zastosowanie określenie "odbicie". 'ggplot2' to po prostu przeglądanie danych i podejmowanie różnych działań, jeśli dane są sformatowane w określony sposób. – krlmlr

+1

well powiązanie nie jest statyczne i jest obliczane w locie, na podstawie jakiegoś atrybutu.może to nie jest odbicie, ale wygląda na zbliżone. – nicolas