如何使用ggplot2的layer()而非geom_histogram()绘制直方图并解决报错?
使用layer()替代geom_histogram()绘制直方图的错误分析与解决
问题重现
你尝试用layer()替代geom_histogram()绘制直方图时遇到报错,代码及错误信息如下:
df <-data.frame( sex <- rep(c("M","F"), each =50), height <- round(c(rnorm(50, mean = 5.5, sd = .5), rnorm(50, mean = 4.8, sd = .8)),1) ) df library(ggplot2) p <- ggplot() p+ layer(data = df, geom = "histogram", mapping = aes(x=height, fill = sex)) p+ layer(data = df, geom = "histogram", mapping = aes(x=height, fill = sex), stat = "count") p+ layer(data = df, geom = "histogram", mapping = aes(x=height, fill = sex), stat = "count", position = "identity")
报错信息:
>>> p+ layer(data = df, geom = "histogram", mapping = aes(x=height, fill = sex)) Error: ! Can't create layer without a stat. Run `rlang::last_trace()` to see where the error occurred. > p+ layer(data = df, geom = "histogram", mapping = aes(x=height, fill = sex), stat = "count") Error: ! Can't create layer without a position. Run `rlang::last_trace()` to see where the error occurred. > p+ layer(data = df, geom = "histogram", mapping = aes(x=height, fill = sex), stat = "count", position = "identity") Error: ! Can't find geom called "histogram" Run `rlang::last_trace()` to see where the error occurred.
错误原因
- 数据框创建错误:在
data.frame()内部使用<-赋值会导致列名异常(实际列名会变成X.sex....和X.height....),后续aes(x=height)会找不到对应列。 - geom参数错误:ggplot2中不存在名为
"histogram"的geom,geom_histogram()是封装好的组合函数,底层实际调用的是geom="bar"配合stat="bin"——stat_bin负责将连续数据分箱计数,geom_bar负责绘制柱状图形。 - stat参数错误:直方图需要用
stat="bin"而非stat="count",count是针对离散数据的计数统计,不符合直方图的连续数据分箱需求。
正确实现代码
步骤1:修正数据框创建
df <- data.frame( sex = rep(c("M","F"), each =50), height = round(c(rnorm(50, mean = 5.5, sd = .5), rnorm(50, mean = 4.8, sd = .8)),1) )
步骤2:用layer()绘制直方图
library(ggplot2) p <- ggplot() # 基础版本:堆叠直方图 p + layer( data = df, geom = "bar", # 直方图底层用bar geom stat = "bin", # 用bin统计分箱 mapping = aes(x=height, fill=sex), position = "stack" # 堆叠显示不同性别,可选"identity"(重叠)或"dodge"(并列) ) # 可选:指定分箱宽度与透明度 p + layer( data = df, geom = "bar", stat = "bin", mapping = aes(x=height, fill=sex), position = "identity", params = list(binwidth = 0.2, alpha = 0.7) )
说明
geom_histogram()本质是layer(geom = "bar", stat = "bin", position = "stack", ...)的语法糖,直接用layer()时需要明确指定这几个核心参数。若需要并列直方图,可将position设为"dodge";重叠显示则用"identity"并搭配alpha参数调整透明度。
内容的提问来源于stack exchange,提问作者user11254108
相关产品推荐
相关产品推荐

