R语言ggplot绘制数据框激活特征按class分组的柱状图
ggplot实现方案
核心逻辑是先通过长宽转换整合特征列,过滤非激活状态的样本后,用分面批量出图,避免重复代码,同时保证视觉尺度统一方便对比差异。
完整实现代码
首先加载依赖包(已加载可跳过):
library(tidyverse)
数据处理与绘图代码:
df %>% # 将f1、f2两个特征列从宽格式转为长格式,统一存储特征名、特征取值 pivot_longer( cols = c(f1, f2), names_to = "feature_name", values_to = "feature_value" ) %>% # 仅保留特征值为1(激活状态)的记录 filter(feature_value == 1) %>% # 将class转为因子类型,避免坐标轴按连续值显示多余刻度 mutate(class = as.factor(class)) %>% ggplot(aes(x = class, fill = class)) + # 绘制计数柱状图 geom_bar(width = 0.6) + # 按特征名分面,每个特征单独展示一个子图,固定坐标轴尺度方便对比 facet_wrap(~feature_name, nrow = 1, scales = "fixed") + # 在柱子顶部添加具体计数标签,无需估算高度 geom_text( stat = "count", aes(label = after_stat(count)), vjust = -0.3, size = 3.5 ) + # 调整图表标注 labs( title = "特征激活状态下的类别分布对比", x = "类别取值(class)", y = "激活样本数", fill = "类别" ) + # 用简洁的黑白主题 theme_bw()
方案说明
- 用
pivot_longer做长宽转换后不需要为f1、f2分别写重复绘图逻辑,后续新增特征时只需要在cols参数中追加列名即可,扩展性强 - 提前过滤特征值为0的记录,完全匹配仅统计激活状态的需求
- 固定分面坐标轴尺度,可以直接横向对比两个特征的类别分布差异:示例数据中f1激活时共2条样本,class0、class1各占1条;f2激活时共4条样本,class0、class1各占2条,两个特征激活时都没有呈现明显的类别偏向
- 柱子顶部的计数标签可以直接读取具体样本量,判断差异更精准
如果需要单独绘制某一个特征的分布图,不需要做长宽转换,直接过滤对应特征即可,以f1为例:
df %>% filter(f1 == 1) %>% mutate(class = as.factor(class)) %>% ggplot(aes(x = class, fill = class)) + geom_bar(width = 0.6) + geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.3) + labs(title = "f1激活状态下的类别分布", x = "类别", y = "样本量") + theme_bw()
内容的提问来源于stack exchange,提问作者mAI
相关产品推荐
相关产品推荐

