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

基于ggplot绘制按分类变量分面的水平比例条形图求助

解决分面水平比例条形图的绘制问题

我来帮你搞定这个绘图问题!首先你的虚拟数据集读取代码存在格式错误——CSV文本里没有用换行分隔每行记录,导致read.csv无法正确解析数据,这是后续绘图出错的根源之一。接下来我们一步步完成你要的分面水平比例条形图:

1. 正确创建虚拟数据集

先修正数据集的读取代码,用换行分隔每行记录,让read.csv能正确识别每一条数据:

testdf <- read.csv(text = "ONE,TWO
0.01,cat1
0.01,cat1
0.06,cat1
0.06,cat1
0.011,cat1
0.011,cat1
0.011,cat1
0.016,cat1
0.016,cat1
0.01,cat2
0.06,cat2
0.06,cat2
0.06,cat2
0.011,cat2
0.011,cat2
0.011,cat2
0.012,cat2
0.012,cat2")

2. 绘制分面水平比例条形图

这里提供两种实现方式,你可以根据需求选择:

方式一:先预处理数据(灵活性更高)

用dplyr先计算每个TWO分类下,不同ONE值的占比,再基于汇总后的数据绘图:

library(dplyr)
library(ggplot2)

# 计算每个分类组内的比例
df_summary <- testdf %>%
  group_by(TWO, ONE) %>%
  tally() %>%  # 统计每个ONE-TWO组合的计数
  mutate(prop = n / sum(n))  # 计算当前TWO分组内的比例

# 绘制水平比例条形图+分面
ggplot(df_summary, aes(x = prop, y = factor(ONE))) +
  geom_bar(stat = "identity", fill = "#4682B4") +  # 水平条形图,x为比例,y为ONE的取值
  facet_wrap(~ TWO, ncol = 1) +  # 按TWO分面,单列展示
  scale_x_continuous(labels = scales::percent_format()) +  # 将x轴转为百分比格式
  labs(x = "占比", y = "ONE的取值", title = "按TWO分类的水平比例条形图") +
  theme_minimal()

方式二:直接用ggplot统计函数(更简洁)

不需要提前预处理数据,让ggplot自动在每个分面内计算比例:

library(ggplot2)

ggplot(testdf, aes(x = factor(ONE), y = stat(prop), group = TWO)) +
  geom_bar(fill = "#4682B4") +
  coord_flip() +  # 翻转坐标轴,将条形转为水平方向
  facet_wrap(~ TWO) +  # 按TWO分面
  scale_y_continuous(labels = scales::percent_format()) +  # 将y轴转为百分比格式
  labs(y = "占比", x = "ONE的取值", title = "按TWO分类的水平比例条形图") +
  theme_minimal()

关键注意点

  • 你原来的代码开头ggplot(testdf, aes(x=TWO...方向有误:水平条形图通常需要把类别变量放在y轴,比例数值放在x轴(或者用coord_flip()翻转坐标轴)。
  • 必须确保在每个分面内独立计算比例:要么预处理时按TWO分组计算,要么在ggplot的aes里指定group=TWO,让统计函数按分面分组计算比例。

内容的提问来源于stack exchange,提问作者Thijs van den Burg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:41