不起作用:
mydat <- data.frame(`Col 1`=1:5, `Col 2`=1:5, check.names=F)
xcol <- "Col 1"
ycol <- "Col 2"
ggplot(data=mydat, aes_string(x=xcol, y=ycol)) + geom_point()
作品:
mydat <- data.frame(`A`=1:5, `B`=1:5)
xcol <- "A"
ycol <- "B"
ggplot(data=mydat, aes_string(x=xcol, y=ycol)) + geom_point()
工作。
mydat <- data.frame(`Col 1`=1:5, `Col 2`=1:5, check.names=F)
ggplot(data=mydat, aes(x=`Col 1`, y=`Col 2`)) + geom_point()
出什么问题了?
答案 0 :(得分:3)
传递给aes_string
的值是parse()
-d。这是因为您可以传递aes_string(x="log(price)")
之类的内容,而不传递一个列名,而是一个表达式。因此,它会将您的字符串当作一个表达式对待,并且在解析它时会找到空格,这是一个无效的表达式。您可以通过将列名称括在引号中来“解决”此问题。例如,这有效
mydat <- data.frame(`Col 1`=1:5, `Col 2`=1:5, check.names=F)
xcol <- "Col 1"
ycol <- "Col 2"
ggplot(data=mydat, aes_string(x=shQuote(xcol), y=shQuote(ycol))) + geom_point()
我们只使用shQuote()
来对值加上双引号。您还可以像在其他示例中一样在字符串中嵌入单个刻度线
mydat <- data.frame(`Col 1`=1:5, `Col 2`=1:5, check.names=F)
xcol <- "`Col 1`"
ycol <- "`Col 2`"
ggplot(data=mydat, aes_string(x=xcol, y=ycol)) + geom_point()
但是,解决此问题的最佳方法是不使用不是有效变量名的列名。
答案 1 :(得分:2)
这是一种tidyeval方法,这是tidyverse
开发人员正在朝contract迈进的方法。 Tidyeval刚开始时比较棘手,但是很漂亮in place of aes_
or aes_string
。
well documented不是ggplot
特有的,但是它在我的书签工具栏上,因为它非常方便。
在这种情况下,您想编写一个函数来处理绘图。此函数以一个数据框和两个裸列名称作为参数。然后,您用enquo
将列名转换为等价名,然后!!
取消引用它们以在aes
中使用。
library(ggplot2)
mydat <- data.frame(`Col 1`=1:5, `Col 2`=1:5, check.names=F)
pts <- function(data, xcol, ycol) {
x_var <- enquo(xcol)
y_var <- enquo(ycol)
ggplot(data, aes(x = !!x_var, y = !!y_var)) +
geom_point()
}
pts(mydat, `Col 1`, `Col 2`)
但是也像@MrFlick所说的那样,尽一切可能只使用有效的列名,因为为什么不呢?
答案 2 :(得分:0)
对于仍然可能引起关注的人,如果列名恰好包含空格或一些数学符号(例如>
,<
或=
),一种简单的解决方法是用as.name()
传递给aes_string()
时。