在 ggplot2 中用不同的列标记 y 轴

label y axis with a different column in ggplot2

我想使用 ggplot2 创建一个图,其中一个变量作为我的 y 轴,但另一个变量用于 y 轴标签

获取此示例数据:

df <- data_frame(
  YearMonth = c("2018-01", "2018-01", "2018-02", "2018-02", "2018-03", "2018-03", "2018-04", "2018-04", "2018-05", "2018-05", "2018-06", "2018-06", "2019-01", "2019-01", "2019-02", "2019-02", "2019-03", "2019-03", "2019-04", "2019-04", "2019-05", "2019-05", "2019-06", "2019-06"),
  Year = c("2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019"),
  Day = c("1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"),
  Total = c(11, 43, 12, 81, 90, 74, 8, 3, 7, 14, 50, 99, 67, 45, 31, 23, 46, 53, 4, 90, 34, 46, 98, 2),
)

我可以创建一个平铺图,y 轴为“年-月”,x 轴为“日”,“填充”值为“总计”

library(ggplot2)

df %>% 
  ggplot(aes(x = Day,
             y = YearMonth)) + 
  geom_tile(aes(fill = Total),
            colour = "white",
            size = 0.2,
            na.rm = FALSE) + 
  coord_equal(ratio = 1) + 
  scale_fill_gradient2(low = "#F1EDDE", 
                       high = "#C72B26", 
                       midpoint = 10) 

产生以下结果:

但是,我不想将“年-月”作为我的 y 轴标签。我想使用“年”——它只会在左侧垂直轴上产生两个标签(2018 和 2019)

我咨询过 但没有成功。我曾尝试使用注释,在 scale_y_discrete 中指定“年份”,以及辅助轴,但未能获得预期的结果。我将不胜感激任何关于如何实现这一目标的指导

您可以为刻度提供明确的分隔符和标签,或者提供一个函数来获得您想要的结果。以下代码中的每个示例。我假设您想标记一月。

library(tidyverse)
#> Warning: package 'tibble' was built under R version 4.0.3
#> Warning: package 'tidyr' was built under R version 4.0.3
#> Warning: package 'dplyr' was built under R version 4.0.3

df <- data.frame(
  YearMonth = c("2018-01", "2018-01", "2018-02", "2018-02", "2018-03", "2018-03", "2018-04", "2018-04", "2018-05", "2018-05", "2018-06", "2018-06", "2019-01", "2019-01", "2019-02", "2019-02", "2019-03", "2019-03", "2019-04", "2019-04", "2019-05", "2019-05", "2019-06", "2019-06"),
  Year = c("2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019"),
  Day = c("1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"),
  Total = c(11, 43, 12, 81, 90, 74, 8, 3, 7, 14, 50, 99, 67, 45, 31, 23, 46, 53, 4, 90, 34, 46, 98, 2)
)

df %>% 
  ggplot(aes(x = Day,
             y = YearMonth)) + 
  geom_tile(aes(fill = Total),
            colour = "white",
            size = 0.2,
            na.rm = FALSE) + 
  coord_equal(ratio = 1) + 
  scale_fill_gradient2(low = "#F1EDDE", 
                       high = "#C72B26", 
                       midpoint = 10) +
  scale_y_discrete(
    breaks = c("2018-01", "2019-01"),
    labels = c("2018", "2019")
  )


df %>% 
  ggplot(aes(x = Day,
             y = YearMonth)) + 
  geom_tile(aes(fill = Total),
            colour = "white",
            size = 0.2,
            na.rm = FALSE) + 
  coord_equal(ratio = 1) + 
  scale_fill_gradient2(low = "#F1EDDE", 
                       high = "#C72B26", 
                       midpoint = 10) +
  scale_y_discrete(
    breaks = function(x) { x[grepl("-01$", x)] },
    labels = function(x) {data.table::tstrsplit(x, "-")[[1]]}
  )

reprex package (v0.3.0)

于 2020-12-09 创建

你可以试试

df %>% 
  mutate(YearMonth = str_split(YearMonth, "-") %>% map_chr(2) %>% as.numeric) %>%
  mutate(Year = factor(Year, levels = rev(unique(as.numeric(Year))))) %>% 
  ggplot(aes(x = Day,
             y = YearMonth)) + 
  geom_tile(aes(fill = Total),
            colour = "white",
            size = 0.2,
            na.rm = FALSE) + 
  scale_fill_gradient2(low = "#F1EDDE", 
                       high = "#C72B26", 
                       midpoint = 10) +
  coord_equal() +
  facet_wrap(~Year,ncol=1, strip.position = "left") +
  ylab("") +
  theme_bw(base_size = 16) + 
  theme(axis.text.y = element_blank(), 
        axis.ticks.y = element_blank())