如何为同一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
相关产品推荐
相关产品推荐

