我有一個ggplot
圖表,它使用分面和手動顏色分配。我想定義調用之外的變量,以便我不必在scale_colour_manual
和其他區域中進行挖掘,以便更改調用scale_colour_manual
的breaks
或values
中使用的值。R:使用ggplot調用中變量的賦值而不是變量名稱
假設這些是變量。
var1 <- 'series.a'
var1.label <- "Series A result"
var2 <- 'series.b'
var2.label <- "Series B result"
在values
或breaks
我可以使用這樣的事情:
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()
使用變量的值而不是他們的名字?
我已經看過eval
,parse
甚至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))
期望的結果是這種圖像的:
你有沒有考慮過'scale_colour_identity'? –
@ sebastian-c謝謝,我甚至沒有意識到'scale_colour_identity'的存在!它看起來非常方便,我將來可能會使用它。 – SlowLearner