使用aes_string从动态列更改geom_point的颜色

时间:2016-12-21 13:55:02

标签: r ggplot2 shiny

这是我的初始数据框架。

data.df

x y z label
2 3 4   1
1 2 3   2
2 4 3   3

要制作ggplot,只有1列(标签)时才有效:

    g <- ggplot(data.df) + 
       geom_point(data = data.df, aes(x= x, y= y, 
       color = ifelse(( label == 2), "a", "b")+
       scale_colour_manual(values= c("a" = "blue", "b" = "green"))

    return g 

单击名为“merge”的按钮时,会动态添加新列:

x y z label label2
2 3 4   1     1
1 2 3   2     2
2 4 3   3     2

现在在ggplot中我需要访问LAST列而不是label列(可能是label2,label3 ......)并更新ggplot。

我尝试了两种方式。

  g <- ggplot(data.df) + 
       geom_point(data = data.df, aes(x= x, y= y, 
       color = ifelse(( data.df[, ncol(data.df)] == 2, "a", "b")+
       scale_colour_manual(values= c("a" = "blue", "b" = "green"))


  return g 

如使用data.df [,ncol(data.df)]时所示,我收到错误:

  

错误:美学必须是长度1或与数据(40)相同:x,y,颜色

我感觉可以用aes_string代替aes:

 label <- paste("label", counter , sep="")

 g <- ggplot(data.df) + 
       geom_point(data = data.df, aes_string(x= "x", y= "y", 
       color = ifelse((label == 2), a, b))) +
       scale_colour_manual(values= c("a" = "blue", "b" = "green"))

我收到了这个错误:

Error in ifelse((label == 2), a, b))),  : object a not found

1 个答案:

答案 0 :(得分:0)

我的意见是在进入ggplot2函数之前进行标准评估,以允许动态功能。

以下利用Standard evaluation versions of dplyr functions.它在数据框中创建一个动态名为formatCol的列,并在其上建立色标。

data.df <- data.frame(x = c(2, 1, 2),
                      y = c(3, 2, 4),
                      z = c(4, 3, 3),
                      label = c(1, 2, 3),
                      label2 = c(1, 2, 2))

library(ggplot2)
library(dplyr)
library(lazyeval)

formatCol <- names(data.df)[ncol(data.df)]
formula <- interp(~ifelse((label == 2), "a", "b"), label = as.name(formatCol))

plot.df <- data.df %>% mutate_(formatCol = formula)

  g <- ggplot(plot.df, aes(x= x, y= y)) + 
      geom_point( aes(color = formatCol))+
        scale_colour_manual(values= c("a" = "blue", "b" = "green"))

g