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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:17:17