2015-02-28 18 views
9

en Keşke iki çizgisinin çizilmesi ve her biri için bir renk grubu belirtilmeden ediyorum buBen birleştirmek nasıl aes() ve aes_string() seçenekleri

library(ggplot2) 
ggplot(mtcars, aes(x=wt)) + ylab("") + 
    geom_line(aes(y=mpg, color="one")) + 
    geom_line(aes(y=qsec, color="two")) + 
    scale_color_manual(name="Val", values=c(one="#105B63",two="#BD4932")) 

enter image description here

gibi bir arsa var diyelim. Şimdi ben

v1<-"mpg" 
v2<-"qsec" 
ggplot(mtcars, aes(x=wt)) + ylab("") + 
    geom_line(aes_string(y=v1, color="one")) + 
    geom_line(aes_string(y=v2, color="two")) + 
    scale_color_manual(name="Val", values=c(one="#105B63",two="#BD4932")) 

çalışırsanız ben hatayı olsun aes_string(). kullanmanız gerekir anlamına gelir karakter değerleri olarak dinamik değişkenler isimleri belirtmek istediğiniz diyelim

Error in eval(expr, envir, enclos) : object 'one' not found 

şimdi aes_string() çalıştığı için Sadece bir literal karakter değeri istediğimde renk değerini ayrıştırır. Ben

ggplot(mtcars, aes(x=wt)) + ylab("") + 
    geom_line(aes_string(y=v1), aes(color="one")) + 
    geom_line(aes_string(y=v2), aes(color="two")) + 
    scale_color_manual(name="Val", values=c(one="#105B63",two="#BD4932")) 

çalışırsanız Ve muhtemelen katman iki estetik yönergelerin nasıl işleneceği bilmediği için

Error: ggplot2 doesn't know how to deal with data of class uneval 

olsun.

aes() ve aes_string() estetiklerini nasıl birleştirebilirim veya aes_string() için basit karakter değerlerini nasıl belirleyebilirim?

cevap

18

aes_string()'da bir karakter değişmez değeri belirtmek istiyorsanız, en kolay şey değeri alıntılamak için shQuote() kullanmak olacaktır. aes_string() aslında parametre değerlerinin her biri üzerinde parse(text=) çalıştığı için örnek

ggplot(mtcars, aes(x=wt)) + ylab("") + 
    geom_line(aes_string(y=v1, color=shQuote("one"))) + 
    geom_line(aes_string(y=v2, color=shQuote("two"))) + 
    scale_color_manual(name="Val", values=c(one="#105B63",two="#BD4932")) 

için bu çalışır. shQuote() işlevi, karakter değerinizin etrafında tırnaklar ekler, böylece değeri ayrıştırdığınızda, bir sembol/ad yerine bir karakter değeri alırsınız.

class(parse(text="a")[[1]]) 
# [1] "name" 
class(parse(text=shQuote("a"))[[1]]) 
# [1] "character" 

Alternatif bu iki aramaları karşılaştırın, sen aes() direktifleri birleştirme düşünebilir. aes() işlevleri gerçekten bir listeyi uneval sınıfına döndürüyor. Bu listeyi birleştirmek/birleştirmek için bir işlev tanımlayabiliriz. Örneğin biz, ayrıca aes_q kullanabilir ve name s içine değişkenler içeriğini açabilirsiniz biz @ MrFlick mükemmel cevap alternatif olarak

ggplot(mtcars, aes(x=wt)) + ylab("") + 
    geom_line(aes_string(y=v1) + aes(color="one")) + 
    geom_line(aes_string(y=v2) + aes(color="two")) + 
    scale_color_manual(name="Val", values=c(one="#105B63",two="#BD4932")) 
+3

Güzel, yaşadığımın farkında bile olmadığım bir problemi çözdünüz;) (+1.5) – BrodieG

8

yapabilirsiniz eklenmesini Şimdi

`+.uneval` <- function(a,b) { 
    `class<-`(modifyList(a,b), "uneval") 
} 

tanımlayabilirsiniz:

ggplot(mtcars, aes(x=wt)) + ylab("") + 
    geom_line(aes_q(y=as.name(v1), color="one")) + 
    geom_line(aes_q(y=as.name(v2), color="two")) + 
    scale_color_manual(name="Val", values=c(one="#105B63",two="#BD4932")) 
İlgili konular