我有一个虚拟数据框t。它包含 3 组的某些值的每月测量值。请注意,B 组只有一项测量。
library(dplyr)
library(ggplot2)
t <- tibble(Group = c('A', 'A', 'B', 'C', 'C', 'C'),
Month = c('2024-01-01', '2024-02-01', '2024-01-01', '2024-01-01', '2024-02-01', '2024-03-01'),
Value = c(10, 10, 12, 9, 9, 12))
当我尝试绘制按组划分的月值时......
t %>%
mutate(Month = as.Date(Month, '%Y-%m-%d')) %>%
ggplot(aes(Month, Value)) +
geom_col() +
facet_wrap(~Group)
我得到了一张丑陋的图表。 ggplot 似乎将“月份”列解释为具有每日频率。
但是,当我排除 B 组(唯一具有单一测量值的组)时...
t %>%
filter(Group != 'B') %>%
mutate(Month = as.Date(Month, '%Y-%m-%d')) %>%
ggplot(aes(Month, Value)) +
geom_col() +
facet_wrap(~Group)
图表看起来很棒! ggplot 将“月份”列解释为具有每月频率(确实如此)
一般来说,当多面图表至少有一个面具有单一观察值时,就会发生这种行为。那么 ggplot 无法确定正确的频率并假设整个图表的最小频率。
我尝试切换组名称(也许是顺序导致问题)并使用 lubridate 库将字符串转换为日期。两者都不起作用。我还尝试将“月份”列转换为因子。然后情节看起来很棒,但是失去了日期格式的灵活性。
这是有意的行为吗?有没有办法明确设置日期频率(例如每月)?我有 ggplot2 3.5.1.
在处理具有不同数量观察值的各个方面的日期尺度时,这确实是
ggplot2
中的一个怪癖。 ggplot 尝试确定整个图的最佳时间尺度,但当一个方面只有一个数据点时,它有时会默认以最小单位(每日)而不是预期频率(每月)解释日期。
为了解决这个问题,您可以将 x 轴的间隔明确设置为每月,这有助于 ggplot 在各个方面一致地将日期刻度解释为每月。以下是您可以修改代码以强制每月休息的方法:
library(dplyr)
library(ggplot2)
t <- tibble(
Group = c('A', 'A', 'B', 'C', 'C', 'C'),
Month = c('2024-01-01', '2024-02-01', '2024-01-01', '2024-01-01', '2024-02-01', '2024-03-01'),
Value = c(10, 10, 12, 9, 9, 12)
)
t %>%
mutate(Month = as.Date(Month, '%Y-%m-%d')) %>%
ggplot(aes(Month, Value)) +
geom_col() +
facet_wrap(~Group) +
scale_x_date(date_breaks = "1 month", date_labels = "%Y-%m") # Enforce monthly breaks
这就是它的作用:
scale_x_date(date_breaks = "1 month", date_labels = "%Y-%m")
指定 x 轴应每月显示刻度,无论每个方面内的观察数有多少。这应该为您提供预期的每月频率解释,同时保留日期格式的灵活性。如果这可以解决问题或者您还想探索其他内容,请告诉我!