【问题标题】:label y axis with a different column in ggplot2在 ggplot2 中用不同的列标记 y 轴
【发布时间】:2020-12-09 10:15:23
【问题描述】:

使用 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 轴标签。我想使用“Year”——它只会在左侧垂直轴上产生两个标签(2018 和 2019)

我咨询过similar topics,但没有成功。我尝试使用注释,在 scale_y_discrete 中指定“年份”和辅助轴,但未能达到预期的结果。我将不胜感激有关如何实现这一目标的任何说明

【问题讨论】:

  • 您只想要 4 个图块,还是想要原样并只更改 y 刻度标签?

标签: r ggplot2 tidyverse multiple-columns yaxis


【解决方案1】:

您可以为秤提供明确的中断和标签,或者提供一个函数来获得您想要的结果。下面的代码中的每个示例。我假设你想给一月贴上标签。

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 月 9 日创建

【讨论】:

    【解决方案2】:

    你可以试试

    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())
    

    【讨论】:

    • 这是一种很好的可视化方式 - teunbrand 有我正在寻找的答案,但感谢您的回复
    猜你喜欢
    • 2020-04-25
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多