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

如何为同一DataFrame中的3个向量绘制百分比变化图?

问题1:修复DataFrame构造错误

你原代码的as.double()用法错误,该函数仅会处理第一个输入参数,后续参数会被直接忽略,因此每列都只重复第一个值。正确写法是把同组的多个数值放到c()中再传入类型转换函数,修复后的代码如下:

# 提前安装并加载所需依赖包
library(tidyverse)

# 正确构造各向量
crime_vec = c('STRONGARM - NO WEAPON', '$500 AND UNDER', 'ABUSE/NEGLECT: CARE FACILITY', 'AGG CRIM')
change15to16vec = as.double(c(825, -1.56, -66.67, -19.13))
change16to17vec = as.double(c(8.11, .96, 50, 4.84))
change17to18vec = as.double(c(-57.50, 1.29, 83.33, 28.72))
df = data.frame(crime_vec, change15to16vec, change16to17vec, change17to18vec)
问题2:绘制错位(dodged)横向条形图

ggplot2的分组合并条形图要求数据为长格式,你当前的宽表(每类年份变化单独占一列)无法直接映射分组参数,需要先把宽表转为长表,把三类年份变化转为同一列的分组变量,对应的百分比转为单独的值列,绘图代码如下:

# 宽表转长表
df_long <- df %>% 
  pivot_longer(cols = starts_with("change"),
               names_to = "year_range",
               values_to = "pct_change")

# 绘制dodged横向条形图
ggplot(df_long, aes(x = pct_change, y = crime_vec, fill = year_range)) +
  geom_col(position = position_dodge2(preserve = "single"), width = 0.7) +
  labs(x = "案发数量同比变化百分比", y = "犯罪类型", fill = "对比年份区间") +
  theme_minimal()

如果需要调整条形间距,修改position_dodge2中的padding参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:21:03