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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:52:48