2016-05-24 27 views
6

Czasami przy użyciu ggplota, korzystam z ramek danych, w których nazwy zmiennych odpowiadają estetyce, której chcę użyć. Co prowadzi do kodu takiego:Użyj domyślnie tej samej estetyki z ggplot w R?

rect <- data.frame(xmin=1,xmax=10,ymin=1,ymax=10) 
ggplot(rect, aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax))+geom_rect() 

Czuje się trochę WET.

Czy istnieje sposób na uniknięcie tego powtórzenia?

+0

'ggplot (rect aes_string (Xmin = "Xmin", Xmax = "Xmax", Ymin = "Ymin", Ymax = "ymax")) + geom_rect() 'To może zmniejszyć OCZYWIŚCIE, ale wydaje mi się, że trochę poprawiam. –

Odpowiedz

15

aes_auto(), ale jest przestarzała widocznie. Alternatywnie

aes_all(names(rect)) 
+1

Miłe znalezisko. Nie miał pojęcia, że ​​istnieje. – MrFlick

+2

Nice ggarchaeology @baptiste! – hrbrmstr

5

Jeśli tak naprawdę sprowadza się wiele, można utworzyć własną funkcję pomocnika

aes_self <- function(...) { 
    dots <- as.list(substitute(...())) 
    names <- sapply(dots, paste) 
    do.call("aes", setNames(dots, names)) 
} 

ggplot(rect, aes_self(xmin, xmax, ymin, ymax))+geom_rect() 

I dodam jeszcze jedno, aby łatwiej mieszać stałe estetykę, jak również. Tutaj możesz użyć "." do reprezentowania kolumny o tej samej nazwie jako parametr:

aes_dotself <- function(...) { 
    dots <- as.list(substitute(...())) 
    self <- sapply(dots, function(x) x==as.name(".")) 
    if(any(self)) { 
     dots[self] <- sapply(names(dots[self]), as.name) 
    } 
    do.call("aes", dots) 
} 

rect <- data.frame(xmin=1,xmax=10,ymin=1,ymax=10, type="type1") 
ggplot(rect, aes_dotself(xmin=.,xmax=.,ymin=.,ymax=., fill=type))+geom_rect() 
6

UPDATE: Patrz odpowiedź @ Baptysta. To jest 75% funkcjonalności (teraz przestarzałej) aes_auto().

Jeszcze bardziej skrót-ale- data.frame -specyficznych alternatywą dla #spiffy rozwiązania przez @MrFlick:

#' Generate ggplot2 aesthetic mappings from data.frame columns 
#' 
#' Use this like you would \code{aes()} or \code{aes_string()} but 
#' pass in the \code{data.frame} you want to use for the mapping. 
#' By default this will use all the column names from the input 
#' \code{data.frame} so use column selections if you don't want 
#' to map them all. 
#' 
#' @param df data.frame 
aes_from_df <- function(df) { 

    mapping <- setNames(as.list(colnames(df)), colnames(df)) 
    mapping <- lapply(mapping, function(x) { 
    if (is.character(x)) parse(text = x)[[1]] else x 
    }) 
    structure(ggplot2:::rename_aes(mapping), class="uneval") 

} 

rect <- data.frame(xmin=1, xmax=10, ymin=1, ymax=10) 

ggplot(rect, aes_from_df(rect)) + geom_rect() 
Powiązane problemy