【问题标题】:Heatmap in R with raw valuesR中带有原始值的热图
【发布时间】:2021-08-13 22:38:16
【问题描述】:

我有这个数据框:

df <- data.frame(PatientID = c("3454","345","5","348","567","79"),
                 clas1 = c(1, 0, 5, NA, NA, 4),
                 clas2 = c(4, 1, 0, 3, 1, 0),
                 clas3 = c(1, NA, 0, 5, 5, 5), stringsAsFactors = F)

我想创建一个热图,x 轴为患者 ID,y 轴为 clas1、clas2 和 clas3。热图中表示的值将是每个“类”的原始值。在这里我贴一张我想要的图

我很抱歉,因为我没有更多可用的颜色来表示这一点,但这只是一个示例,可以使用任何色标。 重要的是我想区分零和 NA,因此理想情况下 NA 有自己的颜色或显示为白色(空)。

我希望这是可以理解的。

不过有什么问题可以问

非常感谢!

【问题讨论】:

  • 我看到你已经选择了一个“选择”的答案,但我添加了另一个答案,展示了几个很好的选择(即恕我直言,比直接使用 ggplot2 代码更好。这就是这些包存在的原因)

标签: r ggplot2 heatmap heatmaply


【解决方案1】:
df <- data.frame(PatientID = c("3454","345","5","348","567","79"),
                 clas1 = c(1, 0, 5, NA, NA, 4),
                 clas2 = c(4, 1, 0, 3, 1, 0),
                 clas3 = c(1, NA, 0, 5, 5, 5), stringsAsFactors = F)
library(tidyverse)
df %>% pivot_longer(!PatientID) %>%
  ggplot(aes(x= PatientID, y = name, fill = value)) +
  geom_tile()

reprex package (v2.0.0) 于 2021-05-25 创建

【讨论】:

  • 谢谢你,Anil,不幸的是这不起作用(它也没有给我任何错误。但它不会产生情节)
  • @Lili,这就是我在 reprex 上展示的原因。这意味着错误在其他地方,而不是在代码中。首先尝试样本数据。
  • 不知道发生了什么,但打开和关闭,现在它可以工作了!精彩的剧情,谢谢!!!
【解决方案2】:

这是一个带有 ``heatmap` 的基本 R 选项

heatmap(t(`row.names<-`(as.matrix(df[-1]), df$PatientID)))

# Which is like
# x <- as.matrix(df[-1]
# row.names(x) <- df$PatientID
# heatmap(t(x))

【讨论】:

  • 谢谢 thomas,与下面的相同... :( 它不会给我错误,但它也不会产生情节。
  • @AnilGoyal 它为矩阵提供行名。我也赞成你的,这是一个很好的情节。
【解决方案3】:

准备数据

我将提供 4 个选项,在所有四个选项中,您需要分配行名并删除 id 列。即:

df <- data.frame(PatientID = c("3454","345","5","348","567","79"),
                 clas1 = c(1, 0, 5, NA, NA, 4),
                 clas2 = c(4, 1, 0, 3, 1, 0),
                 clas3 = c(1, NA, 0, 5, 5, 5), stringsAsFactors = F)
rownames(df) <- df$PatientID
df$PatientID <- NULL
df

输出是:

> df
     clas1 clas2 clas3
3454     1     4     1
345      0     1    NA
5        5     0     0
348     NA     3     5
567     NA     1     5
79       4     0     5

基础 R

使用基础 R(体面的输出):

heatmap(as.matrix(df))

gplots

使用 gplots(有点难看,但要控制的参数更多):

library(gplots)
heatmap.2(as.matrix(df))

热图

使用 heatmaply,您可以为树状图使用更好的默认值(它还以更“最佳”的方式组织它们)。

您可以了解更多关于包here的信息。

静态

带有热图的静态热图(更好的默认值,恕我直言)

library(heatmaply)
ggheatmap(df)

现在有彩色树状图

library(heatmaply)
ggheatmap(df, k_row = 3, k_col = 2)

没有树状图:

library(heatmaply)
ggheatmap(df, dendrogram = F)

互动

带有 heatmaply 的交互式热图(悬停工具提示和缩放功能 - 它是交互式的!):

library(heatmaply)
heatmaply(df)

您可以使用静态 ggheatmap 执行任何操作,也可以使用交互式 heatmaply 版本执行任何操作。

【讨论】:

  • 有这么多选择的好答案!点赞!
  • 嗨,塔尔,一个简单的问题。我该怎么做才能定义色阶范围?我想比较不同的热图,所以我需要从 0:100 开始的所有色阶 - 谢谢!
  • 嘿@Lili - 这取决于您决定使用哪个热图选项。请就此写一个新问题,与您关心的具体实现有关(以及一个简单的自包含示例)。谢谢:)
  • stackoverflow.com/questions/68136213/…。非常感谢!!! :) (基本上我代表百分比,我想比较 2 个不同的热图,其中一个从 0% 到 100%,另一个从 0% 到 60%。所以我希望两者的比例代表颜色从 0 到 100 %
【解决方案4】:

这是另一种选择:

df <- data.frame(PatientID = c("3454","345","5","348","567","79"),
                 clas1 = c(1, 0, 5, NA, NA, 4),
                 clas2 = c(4, 1, 0, 3, 1, 0),
                 clas3 = c(1, NA, 0, 5, 5, 5), stringsAsFactors = F)


# named vector for heatmap
cols <-  c("0" = "white",
           "1" = "green", 
           "2" = "orange", 
           "3" = "yellow", 
           "4" = "pink",
           "5" = "black",
           "99" = "grey")
labels_legend <- c("0" = "0",
                   "1" = "1", 
                   "2" = "2", 
                   "3" = "3", 
                   "4" = "4", 
                   "5" = "5",
                   "99" = "NA")

df1 <- df %>% 
  pivot_longer(
    cols = starts_with("clas"),
    names_to = "names",
    values_to = "values"
  ) %>% 
  mutate(PatientID = factor(PatientID, levels = c("3454", "345", "5", "348", "567", "79")))

ggplot(
  df1, 
  aes(factor(PatientID),  factor(names))) +
  geom_tile(aes(fill= factor(values))) +
  # geom_text(aes(label = values), size = 5, color = "black") + # text in tiles
  scale_fill_manual(
    values = cols, 
    breaks = c("0", "1", "2", "3", "4", "5", "99"),
    labels = labels_legend,
    aesthetics = c("colour", "fill"),
    drop = FALSE
  ) +
  scale_y_discrete(limits=rev) +
  coord_equal() +
  theme(line = element_blank(),
        title = element_blank()) +
  theme(legend.direction = "horizontal", legend.position = "bottom")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多