【问题标题】:R: how can I use a variable to define scale_colour_manual and key label colours?R:如何使用变量来定义 scale_color_manual 和键标签颜色?
【发布时间】:2012-02-14 19:11:04
【问题描述】:

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

另一方面,如果我在变量中弹出标签并在 geom_line 和 scale_colour_manual 调用中使用该变量,则不会发生任何事情。

如您所见,plot 'p1' 工作正常。 Plot '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)

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我经常这样做,因为我使用了很多“标准化”绘图选项。我确信有一种更优雅的方式来挖掘 proto 对象,但结果是一样的

    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
    

    顺便说一句,您可以将 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
    

    【讨论】:

    • 哈,我有点意识到这种事情是可能的,但没有意识到实际应用的好处。另一个 ggplot 怪癖解决了,另一个答案接受了感谢。
    • setNames(c("red", "blue"), c(var1, var2)) 会更优雅一些。
    • 你会在通话中写下这个吗?喜欢... + setNames?还是会进入 scale_colour_manual(...here...)
    • 遗憾的是,我没有看到关于为什么他的第一种方法不起作用的答案。
    • @MikeWise 这是因为您不能通过在对c()list()data.frame() 的调用中内联定义来动态设置名称。您必须使用setNames()names() &lt;- x。 R 没有偏离模式c/data.frame/list(nameA = obj, nameB = obj, ... )
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多