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

R语言使用ggplot绘制出行方式分担率分组柱状图求助

解决方法

核心思路

  • ggplot2 本身优先适配长格式数据,要求每一行对应一个独立观测值(即某路径长度下某出行方式的分担率),你当前使用的宽表格式无法直接映射到aes的参数中,这是原代码运行报错的核心原因
  • 不需要使用count函数,只需将宽表转换为长表后,直接用原始的占比数值作为Y轴参数即可实现需求

完整可运行代码

# 加载所需包,若未安装先运行 install.packages("tidyverse")
library(tidyverse)

# 你提供的示例数据集
ms_gruppen_d <- structure(list(VM = c("Fußverkehr", "Fahrrad", "Motorrad/Moped/Mofa", 
"Privater_pkw", "Gewerb_pkw", "Lkw_bis_3_5_", "Lkw_ab_3_5_", 
"Sattelzug", "ÖPNV"), `Laenge unter 5km` = c(0.218428835651906, 
0.208360071967382, 0, 0.337471470224058, 0.195785602540656, 0.0103830833919553, 
0.0123737357892543, 0, 0.0171972004347874), `Laenge 5 - 10km` = c(0.138928420064367, 
0.140725324716725, 0.00988051174398964, 0.289334484453904, 0.308718256514345, 
0.0356902893023975, 0.00988051174398964, 0.0222528559093808, 
0.044589345550901), `Laenge 10-20km` = c(0.0667063809168976, 
0.172327489225668, 0, 0.271668790053295, 0.346741728107974, 0.0573103622018356, 
0.0292526145926873, 0.0149058863164426, 0.0410867485852005), 
    `Laenge 20-30km` = c(0.0405426428226048, 0.1463357744637, 
    0.0236972749606593, 0.271246395715663, 0.354248166536575, 
    0.0855256681459516, 0.0173953892663395, 0.0432292937973128, 
    0.0177793942911947), `Laenge 30-50km` = c(0.0213163894963155, 
    0.0503758065644924, 0.0159090254544127, 0.178916279908378, 
    0.485985672387571, 0.148087763700495, 0.0378558845704386, 
    0.026693520571143, 0.0348596573467541), `Laenge 50-100km` = c(0.00652604845092996, 
    0.0123285212525124, 0, 0.177307097376991, 0.380919125770432, 
    0.154233838933756, 0.213479807823156, 0.0441531204824327, 
    0.0110524399097905), `Laenge 100-200km` = c(0, 0.00431357399129567, 
    0, 0.087013827371374, 0.173016082279325, 0.203265193001196, 
    0.399659385606215, 0.0655495360275712, 0.0671824017230226
    ), `Laenge 200-300km` = c(0, 0, 0, 0.00953852353026925, 0.147233787704061, 
    0.130598939323796, 0.518334554408677, 0.146338992010429, 
    0.0479552030227669), `Laenge 300km+` = c(0, 0, 0, 0.0333890118493603, 
    0.0876659311982381, 0.0979219742771943, 0.420951006142259, 
    0.297349051156633, 0.062723025376315)), row.names = c(NA, 
-9L), class = "data.frame")

# 第一步:宽表转长表
ms_long <- ms_gruppen_d %>%
  pivot_longer(cols = -VM,  # 除了VM列之外所有列都参与转换
               names_to = "路径长度",  # 存储原列名(路径分组)的新列名
               values_to = "分担率")  # 存储原数值的新列名

# 第二步:绘制分组柱状图
ggplot(ms_long, aes(x = 路径长度, y = 分担率, fill = VM)) +
  geom_col(position = position_dodge(width = 0.9), width = 0.8) +
  scale_y_continuous(labels = scales::percent) +  # Y轴显示百分比格式
  labs(x = "路径长度分组", y = "出行方式分担率", fill = "出行方式") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 旋转X轴标签避免重叠

参数说明

  • position = position_dodge(width = 0.9):实现同一路径长度下不同出行方式的柱子并列展示,若需要堆叠式占比柱状图可改为position = "stack"
  • 如果你需要将出行方式的名称改为中文,可以先对VM列的值做重编码再绘图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:21:03