我想在使用两个 geom_line 图和 scale_colour_manual 的 ggplot 图表中使用一个变量作为图例键标签。如果我明确使用字符串来定义图例键标签,则一切正常,就像第 6.4.4 节一样。在 hadley 的书中,第 109 页。

另一方面,如果我在变量中弹出标签并在 geom_line 和 scale_colour_manual 调用中使用该变量,则没有任何反应。

如您所见,情节 'p1' 工作得很好。绘图 'p2' 没有显示两条线图,尽管它确实显示了正确的键标签。下面给出了用于生成这两个图的代码。(此请求的背景是我想将图例键标签传递给包装函数。)
问:为什么下面 p2 中使用的方法不起作用?如何使用变量来定义键标签并将它们链接到键标签中的正确颜色?
require(ggplot2)
require(lubridate)
set.seed(12345)
# create dummy time series data
monthsback <- 60
startdate <- as.Date(paste(year(now()),month(now()),"1",sep="-")) - months(monthsback)
x <- data.frame(mydate=seq(as.Date(startdate), by="month", length.out=monthsback),
myval1=runif(monthsback, min=600, max=800),
myval2=runif(monthsback, min=400, max=600))
var1 <- "foo-var"
var2 <- "bar-var"
p1 <- ggplot(x, aes( mydate, myval1)) +
geom_line( aes( x = mydate, y = myval1, colour = "foo"), size = 0.5) +
geom_line( aes( x = mydate, y = myval2, colour = "bar"), size = 0.5) +
scale_colour_manual("Legend", values = c("foo" = "red", "bar" = "blue"))
print (p1)
p2 <- ggplot(x, aes( mydate, myval1)) +
geom_line( aes( x = mydate, y = myval1, colour = var1), size = 0.5) +
geom_line( aes( x = mydate, y = myval2, colour = var2), size = 0.5) +
scale_colour_manual("Legend", values = c(var1 = "red", var2 = "blue"))
#print (p2)
Run Code Online (Sandbox Code Playgroud)
我经常这样做,因为我使用了很多“标准化”绘图选项。我确信有一种更优雅的方式来深入研究 proto 对象,但结果是一样的,看看str(tmp)你会更好地理解映射的内容:
tmp <- scale_colour_manual("Legend", values = c(var1 = "red", var2 = "blue"))
# str(tmp)
names(tmp$values) <- c(var1,var2)
p2 <- ggplot(x, aes( mydate, myval1)) +
geom_line( aes( x = mydate, y = myval1, colour = var1), size = 0.5) +
geom_line( aes( x = mydate, y = myval2, colour = var2), size = 0.5) + tmp
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可以将 ggplot + ggplot 元素保存到列表中,然后以编程方式编辑列表项(有点像我上面所做的那样)。
例如:
z <- list(geom_line( aes( x = mydate, y = myval1, colour = var1), size = 0.5),
geom_line( aes( x = mydate, y = myval2, colour = var2), size = 0.5),
tmp)
ggplot(x, aes( mydate, myval1)) + z
Run Code Online (Sandbox Code Playgroud)