我在ggplot2中使用动态列名,但有些名称是表达式。在这种情况下,如何让ggplot2将表达式用作列名?下面是一个例子。
library(ggplot2)
data <- data.frame(c(1,34,3,41,27,4,5,22), c(3,8,7,26,10,20,1,2))
names(data) <- c("name1", "name2")
rndidx <- sample(2)
ggplot(data, aes_string(names(data)[rndidx[1]])) + geom_line(aes_string(y=names(data)[rndidx[2]])) #This works fine
names(data) <- c("name1", "log(1+name2)")
ggplot(data, aes_string(names(data)[rndidx[1]])) + geom_line(aes_string(y=names(data)[rndidx[2]]))
#Error in eval(expr, envir, enclos) : object 'name2' not found
编辑:我不能简单地使用更容易处理的列名的原因是因为绘制数据的函数(即,包含对ggplot的一些调用的绘图函数)接收异构数据,其中列名称随时间而变化时间,有时是表达,有时不是。我不希望生成的绘图扭曲标签中的列名或我想在绘图中使用它们的任何其他位置。
答案 0 :(得分:1)
您可以这样做,但事先重命名变量会更容易。无论如何,这是一种方式,
ggplot(data, aes_string(gsub("\"", "`", deparse(names(data)[rndidx[1]])))) +
geom_line(aes_string(y=gsub("\"", "`", deparse(names(data)[rndidx[2]]))))
你基本上只需找到一种方法来解决parse(text=
评估时发生的aes_string
。