通过 geom_tile ggplot R 的热图 - 正确组织每月因子的 y 轴水平

Posted

技术标签:

【中文标题】通过 geom_tile ggplot R 的热图 - 正确组织每月因子的 y 轴水平【英文标题】:Heatmap via geom_tile ggplot R - Organize y axis levels of monthly factor correctly 【发布时间】:2021-09-17 14:57:13 【问题描述】:

我正在尝试制作日期热图。我将其转换为示例,您可以复制/粘贴到 R 中查看。

除了 x 轴上的月份不按顺序外,第一次尝试绘制的情节正常。我尝试通过添加级别来订购它们。在下一个图中,顺序是正确的,但数据没有移动。相同的数据显示在 2009 年 2 月和 2009 年 8 月。2009 年 8 月是正确的,但是当我尝试修复水平时,数据没有移动。如何让 X 轴按顺序标注,同时数据正确?

library(tidyverse)

year_data <- c("2009", rep("2010",7), rep("2011",10),rep("2012",10))

month_data <- c("Aug", "Aug", "Feb", "Jan", "Jul", "May", "Nov", "Oct", "Aug",
                "Dec", "Jan", "Jul", "Jun", "Mar", "May", "Nov", "Oct", "Sep",
                "Apr", "Aug", "Feb", "Jan", "Jul", "Jun", "Mar", "May", "Oct", "Sep")

number_data <- c(3, 12, 6, 3, 15, 6, 9, 6, 30, 24, 3, 24, 12, 12, 6, 39, 33, 39, 
                 33, 51, 45, 54, 42, 30, 36, 45, 15, 36)

reprex_data <- data.frame(year_data, month_data, number_data) %>% 
  as_tibble() %>% 
  rename("year" = 1,
         "month" = 2,
         "n" = 3) %>% 
  mutate(month = as.factor(month))

# This plot works, but y axis is out of order

reprex_data %>%
  ggplot(aes(year, month)) +
  geom_tile(aes(fill = n)) +
  scale_fill_gradient(low = "#d8e1cf", high = "#438484") +
  theme_bw() +
  theme(panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(colour = "black")) +
  labs(title = "Plot before attempting to fix levels")

# Attempt to reorganize them. While it works, the data that should be Aug, 2009 is plotted as Feb, 2009
levels(reprex_data$month) <- (month.abb)

reprex_data %>%
  ggplot(aes(year, month)) +
  geom_tile(aes(fill = n)) +
  scale_fill_gradient(low = "#d8e1cf", high = "#438484") +
  theme_bw() +
  theme(panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(colour = "black")) +
  labs(title = "Plot after attempting to fix levels")

【问题讨论】:

【参考方案1】:

你可以试试-

library(tidyverse)

reprex_data <- data.frame(year_data, month_data, number_data) %>% 
  as_tibble() %>% 
  rename("year" = 1,
         "month" = 2,
         "n" = 3) %>%
  mutate(month = factor(month, month.abb))

然后使用绘图代码-

reprex_data %>%
  ggplot(aes(year, month)) +
  geom_tile(aes(fill = n)) +
  scale_fill_gradient(low = "#d8e1cf", high = "#438484") +
  theme_bw() +
  theme(panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(colour = "black")) +
  labs(title = "Fixed Plot")

【讨论】:

以上是关于通过 geom_tile ggplot R 的热图 - 正确组织每月因子的 y 轴水平的主要内容,如果未能解决你的问题,请参考以下文章

在 r ggplot 的热图中裁剪地理边界

R 数据可视化 —— 聚类热图 pheatmap

在R中创建连续热图

向 ggplot geom_tile 添加多个图例

R:基于组的颜色的热图,灰色的 NA 值和包含的字符

geom_tile 热图中的瓦片长度不正确