R语言ggplot2绘制条形图数值与数据集不符问题求助
问题:条形图Y轴数值与数据集不符
我使用Kaggle的《Public transport data in France》数据集绘制条形图时,Y轴显示的数值和数据集实际情况不符。代码曾正常运行,但刷新RStudio后出现此问题。我尝试仅保留绘图所需的两列,问题依旧。
复现代码
library(dplyr) library(ggplot2) Trains <- read_csv("Trains.csv") Trains2 <- Trains %>% group_by(`Departure station`) %>% mutate(`Departure station`, Departure = `Departure station`, `Number of late trains at departure`, Retard_total = sum(`Number of late trains at departure`, na.rm = TRUE)) %>% distinct() plot1 <- Trains2 %>% ggplot(aes(x = Departure, y = Retard_total, fill = Retard_total)) + geom_col() + theme(plot.title = element_text(hjust = 0.5)) + theme(axis.text=element_text(size=8), axis.title=element_text(size=8), plot.title = element_text(size=10)) + scale_fill_gradient(low = "pink", high = "red") + labs(x = "Gare de départ", y = "Nombre de trains en retard", title = "Gares les plus touchées par les retards au départ") plot1 top10 <- plot1 + scale_x_discrete(limits=c("PARIS MONTPARNASSE","PARIS LYON", "LYON PART DIEU", "PARIS EST", "MARSEILLE ST CHARLES", "PARIS NORD", "LILLE", "BORDEAUX ST JEAN", "RENNES","STRASBOURG")) top10
问题截图

问题原因与解决方法
核心问题
你的代码用mutate结合sum计算总晚点数时,mutate会给分组内的每一行都添加相同的求和值,后续的distinct()无法保证彻底去重(如果组内其他列有差异,会保留多行)。而geom_col()默认会对同一x轴标签下的所有y值求和,最终导致Y轴数值被错误放大。
修复代码
把mutate替换为summarise(分组聚合专用函数,直接生成每个车站一行的汇总数据),同时简化冗余代码:
library(dplyr) library(ggplot2) Trains <- read_csv("Trains.csv") # 按出发车站分组,直接汇总总晚点列车数 Trains2 <- Trains %>% group_by(`Departure station`) %>% summarise( Retard_total = sum(`Number of late trains at departure`, na.rm = TRUE) ) %>% rename(Departure = `Departure station`) # 重命名列方便绘图 plot1 <- Trains2 %>% ggplot(aes(x = Departure, y = Retard_total, fill = Retard_total)) + geom_col() + theme(plot.title = element_text(hjust = 0.5), axis.text=element_text(size=8), axis.title=element_text(size=8), plot.title = element_text(size=10)) + scale_fill_gradient(low = "pink", high = "red") + labs(x = "Gare de départ", y = "Nombre de trains en retard", title = "Gares les plus touchées par les retards au départ") plot1 top10 <- plot1 + scale_x_discrete(limits=c("PARIS MONTPARNASSE","PARIS LYON", "LYON PART DIEU", "PARIS EST", "MARSEILLE ST CHARLES", "PARIS NORD", "LILLE", "BORDEAUX ST JEAN", "RENNES","STRASBOURG")) top10
额外说明
- 原代码中
mutate里单独写的Departure station和Number of late trains at departure是无效语句,mutate只识别新列=表达式的格式,多余列名会被忽略。 summarise是分组聚合的正确工具,确保每个分组仅返回一行汇总数据,从根源避免绘图时的重复值叠加问题。
内容的提问来源于stack exchange,提问作者nf143
相关产品推荐
相关产品推荐

