[英]Difference between backticks and quotes in aes function in ggplot
好吧,这有点奇怪。 我正在回答有关geom_histogram
的初学者的问题,并且OP发布了一个使用反引号的示例。 他忽略了添加数据,因此我进行了整理,然后找到了答案,甚至没有注意到倒叙。 但是发布的另一个答案(实际上更优雅)没有反引号。 它并没有真正起作用,但是与反引号一起使用时效果要好得多。
但是现在我很困惑。 我完全不知道为什么应该有所不同。 就连ggplot列表几乎相同,据我ggplot$mapping
,只有ggplot$mapping
元素有所不同(好吧,这是一个大问题)。 我已经在Google上搜索了一下,但是看不到发生了什么。
所以这是代码:
这 (在aes
Log Number
附近引用):
#Generate some data
lon <- log(rnorm(1000, exp(6)))
state <- sample(c("c", "l", "t"), 1000, replace = T)
d <- data.frame(lon, state)
names(d) <- c("Log Number", "state")
# Plot it
gpsq <- ggplot(d, aes(x = 'Log Number', fill = state)) + geom_histogram()
print(gpsq)
产生这个 :
但这种 (反引号周围的Log Number
在aes
):
#Generate some data
lon <- log(rnorm(1000, exp(6)))
state <- sample(c("c", "l", "t"), 1000, replace = T)
d <- data.frame(lon, state)
names(d) <- c("Log Number", "state")
# Plot it
gpsq <- ggplot(d, aes(x = `Log Number`, fill = state)) + geom_histogram()
print(gpsq)
更正确地产生此:
反斜杠是在R中表示非标准变量名称的标准方法。引号用于指示字符串。 例:
`bad name` = 1
`bad name`
# [1] 1
这不适用于引号。
"bad name" = 1
"bad name"
# [1] "bad name"
通常,您不应该使用这些奇怪的非标准名称。 但是,如果需要的话,这就是这样做的方式。 你几乎可以做任何事情,
`really-bad^name+violating*all()/[kinds] <- of == rules&!|` = 1
# works just fine
但这并不意味着你应该 。
关于ggplot
,如果您做了
ggplot(mtcars, aes(x = wt, y = 1)) + geom_point()
您会期望所有y值都为1。这是对的!
用引号引起来的字符串是一样的:
ggplot(mtcars, aes(x = wt, y = "mpg")) + geom_point()
除了代替上面的y = 1
情况下的数字外,您给了它一个字符-对于离散的y比例(仅一个值),该字符被隐式转换为一个因数(仅一个级别)。 是否存在名为"mpg"
的列都没有关系,因为您刚刚向aes()
传递了一个值。 ggplot
不会在第一个示例中查找名为mpg
的列,就不会在mpg
中查找名为1
的列。
随着反勾,你给ggplot
东西[R识别为一个对象名称 ,而不是就像一个值1
或"some string"
。 因此, ggplot
确实会寻找具有该名称的列。
# both of these work
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
ggplot(mtcars, aes(x = wt, y = `mpg`)) + geom_point()
虽然反滴答标记确实有效 ,并且通常在aes()
设置常量也有效,但不建议二者都使用。 设置常量的首选方法是在aes()
外部设置常量 。 这是确保所有内容在更复杂的图中都能正常工作的唯一方法。 特别是,如果您尝试在aes()
内做一些奇怪的事情(尤其是转换),则方面通常会出错或无法产生预期的结果。
# better than above, set a constant outside of `aes()`
# Here I set y as a constant which is a bit unusual
ggplot(mtcars, aes(x = wt)) + geom_point(y = 1)
# aesthetics that are more commonly set to constants are
# size, color, fill, etc.
对于非标准的列名, aes_string()
可以很好地工作,然后期望将美学映射引用为列名。 如果正在编写创建ggplots且需要将列名作为参数的函数,这也是做事情的好方法。
ggplot(mtcars, aes_string(x = "wt", y = "mpg")) + geom_point()
# or, in a variable
my_y_column = "mpg"
ggplot(mtcars, aes_string(x = "wt", y = my_y_column)) + geom_point()
还有一个很好的例子,感谢@TheTime,它开始变得面目全非:
最终, ggplot
需要评估所有内容,这将通过eval
完成。 考虑以下:
a <- 1
eval(parse(text="a"))
# [1] 1
eval(parse(text='"a"'))
# [1] "a"
eval(parse(text="`a`"))
# [1] 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.