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

我为一月和二月创建了一个条形图,但图表实际显示的是二月和三月。若能提供解决此问题的任何信息,将不胜感激。请查看下面的代码,以及数据集的截图和条形图的错误输出。
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_date 与 labels 和 breaks 一起使用,可以用 date_labels 和 date_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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。