基于citetest数据集创建分db的堆叠柱状图技术问询
解决方案:绘制堆叠柱状图
我来帮你搞定这个堆叠柱状图的问题~先梳理下当前代码的问题,再给出完整的实现方案:
问题分析
你当前的代码存在两个关键问题:
- 变量名不匹配:你使用了
df但你的数据集实际名称是citetest - 数据格式不兼容:你的数据是宽格式(单条记录包含多个堆叠类别值),而
ggplot2绘制堆叠柱状图需要长格式数据(每个堆叠类别单独成一行记录)
完整实现步骤
1. 加载必要的包
我们需要用tidyverse(包含ggplot2和tidyr)来完成数据转换和绘图:
# 若未安装tidyverse,先执行:install.packages("tidyverse") library(tidyverse)
2. 将宽格式数据转换为长格式
使用pivot_longer函数把三个风险数值列转换成类别+数值的长格式:
citetest_long <- citetest %>% pivot_longer( cols = -db, # 排除db列,转换其余所有列 names_to = "risk_category", # 原列名存为类别名 values_to = "count" # 原列值存为计数 )
转换后的长格式数据预览:
head(citetest_long) #> # A tibble: 6 × 3 #> db risk_category count #> <chr> <chr> <dbl> #> 1 db1 risall 248 #> 2 db1 riscross 149 #> 3 db1 risuniq 99 #> 4 db2 risall 134 #> 5 db2 riscross 88 #> 6 db2 risuniq 46
3. 绘制堆叠柱状图
用转换后的长格式数据绘图,每个db对应一个堆叠柱,填充颜色匹配风险类别:
ggplot(citetest_long, aes(x = db, y = count, fill = risk_category)) + geom_bar(stat = "identity", position = "stack") + # position="stack"为默认值,可省略 # 添加图表标签优化可读性 labs( title = "Risk Count Distribution by Database", x = "Database", y = "Total Count", fill = "Risk Type" ) + theme_minimal() # 可选:使用简洁的主题样式
备选:基础R实现数据转换
如果你不想使用tidyverse,可以用基础R的reshape函数完成格式转换:
citetest_long <- reshape( citetest, varying = c("risall", "riscross", "risuniq"), v.names = "count", timevar = "risk_category", times = c("risall", "riscross", "risuniq"), direction = "long" ) # 绘图代码与上述ggplot部分完全一致
这样就能得到符合你需求的堆叠柱状图,每个数据库对应一个柱子,不同颜色代表对应的风险类型数值~
内容的提问来源于stack exchange,提问作者Halfway
相关产品推荐
相关产品推荐

