2013-01-22 161 views
0

我有一個ggplot圖表,它使用分面和手動顏色分配。我想定義調用之外的變量,以便我不必在scale_colour_manual和其他區域中進行挖掘,以便更改調用scale_colour_manualbreaksvalues中使用的值。R:使用ggplot調用中變量的賦值而不是變量名稱

假設這些是變量。

var1 <- 'series.a' 
var1.label <- "Series A result" 
var2 <- 'series.b' 
var2.label <- "Series B result" 

valuesbreaks我可以使用這樣的事情:

c('Series A result' = alpha("blue", 0.5),'Series B result' = alpha("red",0.5)) 

這繪製精細,因爲上面的代碼會產生以下結果:

Series A result Series B result 
    "#0000FF80"  "#FF000080" 

鑑於這樣的代碼:

c(var1.label = alpha("blue", 0.5), var2.label = alpha("red",0.5)) 

沒有繪製,因爲它產生這一點,其中的元素的名稱不匹配,我們正在使用的顏色,即「A系列結果」和「B系列結果」的價值觀:

var1.label var2.label 
"#0000FF80" "#FF000080" 

所以問題似乎是:我怎麼能得到c()使用變量的值而不是他們的名字?

我已經看過evalparse甚至force,但他們似乎沒有做我想做的事。我懷疑這是一個非常簡單的R,但它並不是我碰到的問題。示例代碼如果需要的話。

require(ggplot2) 
require(reshape) 
require(scales) 

# Create data 
set.seed(78910) 
mydf <- data.frame(
        mydate = seq(as.Date('2013-01-01'), 
         as.Date('2013-01-10'), by = 'day'), 
        series.a = runif(10, 100, 200), 
        series.b = runif(10, 2000, 3000)) 
tail(mydf) 
mymelt <- melt(mydf, id.var = 'mydate') 

# Define user variables 
var1 <- 'series.a' 
var1.label <- "Series A result" 
var2 <- 'series.b' 
var2.label <- "Series B result" 

# Which makes creating labels for the faceting easier 
mymelt$label.col <- ifelse(mymelt$variable == var1, var1.label, var2.label) 
tail(mymelt) 

# Plots without problems 
ggplot(mymelt, aes(y = value, x = mydate)) + 
    geom_line(aes(colour = label.col)) + 
    scale_colour_manual("", 
         breaks = c('Series A result','Series B result'), 
         values = c('Series A result' = alpha("blue", 0.5), 
         'Series B result' = alpha("red",0.5))) + 
    facet_wrap(~ label.col, ncol = 1, scale = "free_y") 

# Does not plot 
ggplot(mymelt, aes(y = value, x = mydate)) + 
    geom_line(aes(colour = label.col)) + 
    scale_colour_manual("", 
         breaks = c(var1.label, var2.label), 
         values = c(var1.label = alpha("blue", 0.5), 
         var2.label = alpha("red",0.5))) + 
    facet_wrap(~ label.col, ncol = 1, scale = "free_y") 

# Not plotting because names in second case are not correct 
c('Series A result' = alpha("blue", 0.5),'Series B result' = alpha("red",0.5)) 
c(var1.label = alpha("blue", 0.5), var2.label = alpha("red",0.5)) 

期望的結果是這種圖像的:

screenshot

+1

你有沒有考慮過'scale_colour_identity'? –

+0

@ sebastian-c謝謝,我甚至沒有意識到'scale_colour_identity'的存在!它看起來非常方便,我將來可能會使用它。 – SlowLearner

回答

2
v <- c(alpha("blue", 0.5), alpha("red",0.5)) 
names(v) <- c(var1.label, var2.label) 

> v 
## Series A result Series B result 
##  "#0000FF80"  "#FF000080" 

然後在代碼中使用values = v

+0

謝謝,我希望能夠在ggplot調用本身做些事情,但事先調整它,這樣做肯定能解決問題。 – SlowLearner

相關問題