R-ggplot2-ggplot(数据,aes(x=变量…)和ggplot(数据,aes(x=数据$变量…)之间的差异
我目前在ggplot2中遇到了一个现象,如果有人能给我一个解释,我将不胜感激 我需要在直方图上绘制一个连续变量,我需要在图上表示两个分类变量。下面的dataframe就是一个很好的例子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
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()