繁体   English   中英

ggplot中es函数中反引号和引号之间的区别

[英]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 Numberaes ):

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM