如何在R的ggplot2中绘制交互类型计数堆叠条形图?
问题解决:ggplot堆叠条形图统计交互频次报错处理
问题描述
数据集包含Friend1、Friend2两个朋友字段,以及Interaction交互类型字段,所有字段均为因子类型,想要用堆叠条形图展示两位朋友间不同交互类型的频次,运行代码后出现报错:Error in UseMethod("count") : no applicable method for 'count' applied to an object of class "character"。
用户尝试的代码:
Friend1 <- c("A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B") Friend2 <- c("1","1","2","2","1","1","2","2","1","1","2","2","1","1","2","2") Interaction <- c("O","X","D","D","D","X","X","D/R","O","X","D","D","D","X","X","D/R") df <- data.frame(Friend1, Friend2, Interaction) df$Friend1 <- as.factor(as.character(df$Friend1)) df$Friend2 <- as.factor(as.character(df$Friend2)) df$Interaction <- as.factor(as.character(df$Interaction)) ggplot(df, aes(fill=Interaction, y=count(Interaction), x=Friend2)) + geom_bar(position="fill", stat="identity", color = "white") + theme_classic() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_rect(colour = "black", size=1)) + theme(strip.background = element_blank()) + facet_grid(.~Friend1)
解决方案
报错核心原因:ggplot的美学映射(aes())中不能直接调用count()函数,该函数属于dplyr工具包,无法在aes内直接生效。提供两种可行解决方式:
方法1:让ggplot自动统计频次
直接去掉y=count(Interaction),利用geom_bar默认的stat="count"参数自动统计频次,无需手动计算。代码修改如下:
library(ggplot2) Friend1 <- c("A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B") Friend2 <- c("1","1","2","2","1","1","2","2","1","1","2","2","1","1","2","2") Interaction <- c("O","X","D","D","D","X","X","D/R","O","X","D","D","D","X","X","D/R") df <- data.frame(Friend1, Friend2, Interaction) # 批量转换所有列为因子,简化代码 df[] <- lapply(df, factor) ggplot(df, aes(x=Friend2, fill=Interaction)) + geom_bar(position="fill", color = "white") + # 默认stat="count",自动统计频次 theme_classic() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_rect(colour = "black", size=1), strip.background = element_blank()) + facet_grid(.~Friend1)
方法2:手动统计频次后再绘图
如果需要更灵活的统计逻辑,可先用dplyr分组计数,再传入ggplot使用stat="identity"绘图:
library(ggplot2) library(dplyr) Friend1 <- c("A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B") Friend2 <- c("1","1","2","2","1","1","2","2","1","1","2","2","1","1","2","2") Interaction <- c("O","X","D","D","D","X","X","D/R","O","X","D","D","D","X","X","D/R") df <- data.frame(Friend1, Friend2, Interaction) df[] <- lapply(df, factor) # 按Friend1、Friend2、Interaction分组统计频次 count_df <- df %>% group_by(Friend1, Friend2, Interaction) %>% summarise(count = n(), .groups = "drop") ggplot(count_df, aes(x=Friend2, y=count, fill=Interaction)) + geom_bar(position="fill", stat="identity", color = "white") + theme_classic() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_rect(colour = "black", size=1), strip.background = element_blank()) + facet_grid(.~Friend1)
额外说明
position="fill"会将每个条形高度标准化为1,展示各交互类型的占比;若需展示实际频次,将其改为position="stack"即可。- 批量转换列类型的
df[] <- lapply(df, factor)写法,比逐个列转换更简洁高效。
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

