这是我的初始数据框架。
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
答案 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