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

如何在ggplot中仅绘制变量单一变体的百分比

解决方案

问题核心是你搞反了计算百分比和过滤数据的顺序:如果先过滤出Round再计算占比,每个发音方式(Manner)分组里只剩Round这一类,自然会显示100%;你需要先基于完整数据算出Round在对应Manner中的占比,再过滤出Round的数据绘图。

具体步骤(用dplyr+ggplot2实现)

假设你的原始数据是response_data,包含列:Manner(发音方式)、Shape(形状)、Count(响应计数)(如果是原始响应数据,每个行对应一个参与者的选择,代码会稍有不同)。

  1. 先计算各发音方式下的相对百分比
    基于完整数据,按Manner分组,计算每个Shape的占比:

    library(dplyr)
    library(ggplot2)
    
    # 处理汇总计数数据的情况
    calculated_data <- response_data %>%
      group_by(Manner) %>%
      # 计算每个Shape在对应Manner中的百分比
      mutate(Percentage = Count / sum(Count) * 100) %>%
      ungroup()
    
    # 如果是原始响应数据(每行是一个参与者的选择),用这段代码计算
    # calculated_data <- response_data %>%
    #   group_by(Manner, Shape) %>%
    #   summarise(Count = n(), .groups = "drop") %>%
    #   group_by(Manner) %>%
    #   mutate(Percentage = Count / sum(Count) * 100) %>%
    #   ungroup()
    
  2. 过滤出Round形状的数据
    这一步再筛选出你需要的Round行,此时Percentage是基于原分组的正确占比:

    round_only_data <- calculated_data %>%
      filter(Shape == "Round")
    
  3. 绘制分面柱状图(保留原有结构)
    用过滤后的数据集绘图,就能得到正确的Round占比,且只显示Round的柱形:

    ggplot(round_only_data, aes(x = Manner, y = Percentage)) +
      geom_col(fill = "#619CFF") + # 可自定义颜色
      facet_wrap(~Manner, scales = "free_x") + # 保持原有分面布局
      labs(x = "发音方式", y = "Round形状响应百分比")
    

为什么之前的方法不行?

当你先filter(Shape == "Round")再计算百分比时,group_by(Manner)后每个分组里只有Round这一个类别,sum(Count)就是Round的计数本身,所以Count/sum(Count)结果为1(即100%),这不是你需要的基于原完整分组的相对频率。

内容的提问来源于stack exchange,提问作者thelazyastronut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:39:57