ggplot aes_string不适用于空格

时间:2018-08-02 16:47:02

标签: r ggplot2

不起作用:

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()

出什么问题了?

3 个答案:

答案 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()时。