R-ggplot2-ggplot(数据,aes(x=变量…)和ggplot(数据,aes(x=数据$变量…)之间的差异

R-ggplot2-ggplot(数据,aes(x=变量…)和ggplot(数据,aes(x=数据$变量…)之间的差异,r,plot,ggplot2,R,Plot,Ggplot2,我目前在ggplot2中遇到了一个现象,如果有人能给我一个解释,我将不胜感激 我需要在直方图上绘制一个连续变量,我需要在图上表示两个分类变量。下面的dataframe就是一个很好的例子 library(ggplot2) species <- rep(c('cat', 'dog'), 30) numb <- rep(c(1,2,3,7,8,10), 10) groups <- rep(c('A', 'A', 'B', 'B'), 15) data <- data.fr

我目前在ggplot2中遇到了一个现象,如果有人能给我一个解释,我将不胜感激

我需要在直方图上绘制一个连续变量,我需要在图上表示两个分类变量。下面的dataframe就是一个很好的例子

library(ggplot2)


species <- rep(c('cat', 'dog'), 30)
numb <- rep(c(1,2,3,7,8,10), 10)
groups <- rep(c('A', 'A', 'B', 'B'), 15)

data <- data.frame(species=species, numb=numb, groups=groups)
并绘制了数据\u miss数据集,仍然包括factnumb变量的所有级别

data$factnumb <- as.factor(data$numb)
pm <- ggplot(data_miss, aes(x=factnumb, fill=species)) +
        facet_grid(groups ~ .) +
        geom_bar(aes(y=(..count..)/sum(..count..))) +
        scale_fill_discrete(drop=FALSE) +
        scale_x_discrete(drop=FALSE)+
        scale_y_continuous(labels = scales::percent)
pm在内部使用
aes(data$variable)
永远都不好,也不推荐使用,也不应该使用。有时它仍然有效,但
aes(变量)
始终有效,因此您应该始终使用
aes(变量)

更多说明:
ggplot
使用非标准评估。标准的R函数只能看到全局环境中的对象。如果我的数据名为
mydata
,列名为
col1
,并且我的
mean(col1)
,我会得到一个错误:

mydata = data.frame(col1 = 1:3)
mean(col1)
# Error in mean(col1) : object 'col1' not found
发生此错误的原因是
col1
不在全局环境中。它只是
mydata
数据框的一个列名

aes
函数在后台做额外的工作,除了检查全局环境外,还知道查看层的
数据的列

ggplot(mydata, aes(x = col1)) + geom_bar()
# no error
不过,您不必只在aes中使用列。为了提供灵活性,您可以执行列的函数,甚至是您碰巧在现场定义的其他向量(如果其长度正确):

那么
col1
mydata$col1
之间有什么区别呢?嗯,
col1
是列的名称,
mydata$col1
是实际值
ggplot
将在名为
col1
的数据中查找列,并使用该列
mydata$col1
只是一个向量,它是完整的列。差异很重要,因为
ggplot
经常进行数据操作。无论何时,只要存在facet或聚合函数,ggplot都会将数据分割成碎片并进行处理。为了有效地做到这一点,它需要知道如何识别数据和列名。当你给它
mydata$col1
时,你并没有给它一个列名,你只是给它一个值向量——不管该列中发生了什么,事情都不起作用

因此,只需在
aes()
中使用不带引号的列名,而不使用
data$
,一切都将按预期工作。

在内部使用
aes(data$variable)
永远都不好,也不推荐使用,也不应该使用。有时它仍然有效,但
aes(变量)
始终有效,因此您应该始终使用
aes(变量)

更多说明:
ggplot
使用非标准评估。标准的R函数只能看到全局环境中的对象。如果我的数据名为
mydata
,列名为
col1
,并且我的
mean(col1)
,我会得到一个错误:

mydata = data.frame(col1 = 1:3)
mean(col1)
# Error in mean(col1) : object 'col1' not found
发生此错误的原因是
col1
不在全局环境中。它只是
mydata
数据框的一个列名

aes
函数在后台做额外的工作,除了检查全局环境外,还知道查看层的
数据的列

ggplot(mydata, aes(x = col1)) + geom_bar()
# no error
不过,您不必只在aes中使用列。为了提供灵活性,您可以执行列的函数,甚至是您碰巧在现场定义的其他向量(如果其长度正确):

那么
col1
mydata$col1
之间有什么区别呢?嗯,
col1
是列的名称,
mydata$col1
是实际值
ggplot
将在名为
col1
的数据中查找列,并使用该列
mydata$col1
只是一个向量,它是完整的列。差异很重要,因为
ggplot
经常进行数据操作。无论何时,只要存在facet或聚合函数,ggplot都会将数据分割成碎片并进行处理。为了有效地做到这一点,它需要知道如何识别数据和列名。当你给它
mydata$col1
时,你并没有给它一个列名,你只是给它一个值向量——不管该列中发生了什么,事情都不起作用


因此,只需在
aes()
中使用不带引号的列名,而不使用
data$
,一切都将按预期进行。

非常感谢您花费的时间和精力!非常感谢您的时间和努力!
qm <- ggplot(data_miss, aes(x=factnumb, fill=data_miss$species)) +
        facet_grid(groups ~ .) +
        geom_bar(aes(y=(..count..)/sum(..count..))) +
        scale_x_discrete(drop=FALSE)+
        scale_fill_discrete(drop=FALSE) +
        scale_y_continuous(labels = scales::percent)
mydata = data.frame(col1 = 1:3)
mean(col1)
# Error in mean(col1) : object 'col1' not found
ggplot(mydata, aes(x = col1)) + geom_bar()
# no error
# these work fine too
ggplot(mydata, aes(x = log(col1))) + geom_bar()
ggplot(mydata, aes(x = c(1, 8, 11)) + geom_bar()