使用 R 和 RStudio 绘制的柱状图中缺失的第一个月

编程语言 2026-07-07

问题

数据集错误的条形图我为一月和二月创建了一个条形图,但图表实际显示的是二月和三月。若能提供解决此问题的任何信息,将不胜感激。请查看下面的代码,以及数据集的截图和条形图的错误输出。

library(ggplot2)
library(dplyr)
library(lubridate)

my_group <- read.csv(
  text = "Department,Incidents,Category,Month
Shanghai Terrace,1,OSHA,2026-01-26
Shanghai Terrace,1,Non OSHA,2026-01-26
Housekeeping,1,OSHA,2026-01-26
Shanghai Terrace,1,Non OSHA,2026-01-26
Housekeeping,1,Non OSHA,2026-01-26
In Room Dining,1,Non OSHA,2026-01-26
Culinary/Kitchen/Pastry,1,Non OSHA,2026-01-26
In Room Dining,1,Non OSHA,2025-01-25
Spa,1,Non OSHA,2025-01-25
Stewarding,1,Non OSHA,2025-01-25
In Room Dining,1,Non OSHA,2025-01-25
Culinary/Kitchen/Pastry,1,Non OSHA,2026-02-26
Lobby Restaurant,1,Non OSHA,2026-02-26
Culinary/Kitchen/Pastry,1,Non OSHA,2026-02-26
Housekeeping,1,Non OSHA,2026-02-26
Housekeeping,1,OSHA,2025-02-25
Housekeeping,1,OSHA,2025-02-25
Banquets,1,OSHA,2025-02-25
Housekeeping,1,Non OSHA,2025-02-25
Housekeeping,1,Non OSHA,2025-02-25
")

my_group_sum <- my_group %>% 
  group_by(Month, Category) %>% 
  summarise(Incidents = sum(Incidents))

myColors <- c("OSHA" = "#CB1006", "Non OSHA" = "#1BE4B9")

my_group_sum %>% 
  mutate(
    year = year(Month), 
    month_day = as_date(paste(2030, month(Month), day(Month), sep = "-"))
  ) %>%
  ggplot(aes(x = month_day, y = Incidents, fill = Category)) +
  geom_bar(
    stat = "identity",
    size = 2.5,
    alpha = 1.0,
    position = position_stack(reverse = TRUE)
  ) +
  geom_text(
    aes(label = Incidents, color = Category),
    position = position_stack(reverse = TRUE, vjust = 0.5),
    size = 5,
    fontface = "bold"
  ) +
  scale_color_manual(values = c("OSHA" = "white", "Non OSHA" = "black")) +
  scale_y_continuous(limits = c(0, 15), breaks = seq(0, 15, 1)) +
  scale_x_date(labels = scales::date_format("%b"), breaks = "1 month") +
  scale_fill_manual(values = myColors) +
  facet_wrap( ~ year) +
  theme_bw()

答案 1

如果你从原代码中移除 scale_x_date,条形图的标签将会同时包含数据对应的月份和下一个月。在每个面板中,最左边的条将标注为“Jan 15”和“Feb 01”,最右边的条则是“Feb 15”和“Mar 01”。然后 scales::date_format(已被取代——请使用 label_date)将保留第二个日期,从而导致标签错误。

此外,不要将 scale_x_datelabelsbreaks 一起使用,可以用 date_labelsdate_breaks 来设置日期标签的格式和刻度。

在下面的代码中我不会使用它们。由于只有两个月,我将把 Month 强制转换为因子。

先定义一个自定义主题,包括颜色、旋转的 x 轴标签等。

theme_custom_q79974513 <- function(){ 
  theme_bw() %+replace%
    theme(
      axis.title.y = element_text(size = 20, angle = 90, vjust = 0.5),
      # axis.text = element_text(face = "bold"),
      axis.text.x = element_text(size = 15, angle  = 45, vjust = 0.5),
      plot.background = element_rect(fill = "#add8e6"),
      panel.background = element_rect(fill = "#eceff8"),
      panel.border = element_rect(colour = "#bdbdd3", linewidth = 2.5),
      legend.background = element_rect(fill = "#eceff8")
    )
}

现在绘图。
年份和月份被创建并在一个 dplyr 管道中聚合,然后绘制。

library(ggplot2)
library(dplyr)

myColors <- c("OSHA" = "#CB1006", "Non OSHA" = "#1BE4B9")

my_group %>%
  mutate(
    Month = as.Date(Month),
    Year = format(Month, "%Y"),
    Month = format(Month, "%b") |> factor(levels = month.abb)
  ) %>%
  summarise(Incidents = sum(Incidents), .by = c(Category, Year, Month)) %>%
  ggplot(aes(Month, Incidents, fill = Category)) +
  geom_col(position = position_stack(reverse = TRUE)) +
  geom_text(
    aes(label = Incidents, color = Category), 
    position = position_stack(reverse = TRUE, vjust = 0.5), 
    size = 5, 
    fontface = "bold",
    show.legend = FALSE
  ) +
  scale_fill_manual(values = myColors) +
  scale_color_manual(values = c("OSHA" = "white", "Non OSHA" = "black")) +
  scale_y_continuous(limits = c(0,15), breaks = seq(0,15,1)) +
  xlab(NULL) +
  facet_wrap(~ Year) +
  theme_custom_q79974513()

Created on 2026-07-05 with reprex v2.1.1


测试数据

set.seed(1)
n <- 20L
Incidents <- rep(1, n)
Category <- sample(c("OSHA", "Non OSHA"), n, TRUE) |> factor(levels = c("OSHA", "Non OSHA"))
Month <- sprintf("20%02d-%02d-%02d", 
                 c(rep(26:25, times = c(7, 4)), rep(26:25, times = c(5, 4))),
                 rep(1:2, times = c(11, 9)),
                 c(rep(26:25, times = c(7, 4)), rep(26:25, times = c(5, 4))))
my_group <- data.frame(Incidents, Category, Month)

Created on 2026-07-05 with reprex v2.1.1

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章