You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:20:34