如何在ggplot2中筛选前10个起始站点绘制分组柱状图
解决方法:筛选前10站点并绘制会员类型占比柱状图
核心思路
要实现你的需求,得先筛选出总使用次数排名前10的起点站,再基于这些数据绘制按会员类型占比展示的堆叠柱状图,不能直接用全量数据绘图。
完整代码示例
先确保加载tidyverse包(包含数据处理工具dplyr和绘图工具ggplot2):
# 首次使用先安装包 install.packages("tidyverse") library(tidyverse)
步骤1:筛选前10热门站点
# 统计各站点总次数,排序后取前10的站点名称 top10_stations <- all_trips_v2 %>% count(start_station_name, sort = TRUE) %>% slice(1:10) %>% pull(start_station_name) # 过滤原数据集,只保留前10站点的记录,并指定站点排序(避免绘图时乱序) top10_data <- all_trips_v2 %>% filter(start_station_name %in% top10_stations) %>% mutate(start_station_name = fct_relevel(start_station_name, top10_stations))
步骤2:绘制占比堆叠柱状图
ggplot(top10_data, aes(x = start_station_name, fill = member_casual)) + geom_bar(position = "fill") + # 关键:将柱子高度归一为1,展示占比而非计数 labs( title = "前10热门起点站会员类型占比", x = "起点站名称", y = "占比", fill = "会员类型" ) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签,避免重叠
关键细节说明
count(start_station_name, sort=TRUE):快速统计各站点使用次数并降序排序,方便直接取前10。fct_relevel:把站点名称转为因子并指定顺序,确保绘图时x轴按总次数从高到低排列,而非默认的字母顺序。position="fill":这是实现占比展示的核心参数,替代默认的计数统计,让每个站点的柱子高度统一为1,不同会员类型的部分显示相对占比。
原代码问题分析
你之前的代码直接用全量数据集绘图,没有做站点筛选,所以会显示所有站点;同时默认的geom_bar()统计的是分组计数,而非占比,自然不符合预期效果。
内容的提问来源于stack exchange,提问作者Rungchat Amnuay
相关产品推荐
相关产品推荐

