ggplot2 将每月数据可视化为每日数据

问题描述 投票:0回答:1

我有一个虚拟数据框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.

r ggplot2
1个回答
0
投票

在处理具有不同数量观察值的各个方面的日期尺度时,这确实是

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 轴应每月显示刻度,无论每个方面内的观察数有多少。

这应该为您提供预期的每月频率解释,同时保留日期格式的灵活性。如果这可以解决问题或者您还想探索其他内容,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.