Heatmap được định nghĩa là 1 hình thức biểu thị thông tin dưới dạng ma trận, nhằm trình bày giá trị của một đại lượng cùng thang đo cho mỗi trường hợp tổ hợp giữa 2 biến số phân nhóm (hàng x cột), trong đó giá trị của đại lượng cần khảo sát được chuyển thành thang đo màu.

Heatmap rất hữu dụng cho các nghiên cứu y học về Gene, Protein hoặc Biomarker. Một cách tổng quát, bạn nên dùng heatmap khi có quá nhiều biến định lượng, và muốn đưa ra một bức tranh toàn cảnh về dữ liệu nghiên cứu, gây một ấn tượng ngay lập tức lên độc giả về tính tương phản giữa các phân nhóm mà không đi vào chi tiết về bản chất, thang đo, đơn vị… của từng biến số độc lập.

library(tidyverse)
library(foreign)

my_theme <- function(base_size = 10, base_family = "sans"){
  theme_minimal(base_size = base_size, base_family = base_family) +
    theme(
      axis.text = element_text(size = 10),
      axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 0.5),
      axis.title = element_text(size = 12),
      panel.grid.major = element_line(color = "grey"),
      panel.grid.minor = element_blank(),
      panel.background = element_rect(fill = "#faefff"),
      strip.background = element_rect(fill = "#400156", color = "#400156", size =0.5),
      strip.text = element_text(face = "bold", size = 10, color = "white"),
      legend.position = "bottom",
      legend.justification = "center",
      legend.background = element_blank(),
      panel.border = element_rect(color = "grey30", fill = NA, size = 0.5)
    )
}
theme_set(my_theme())

df=read.spss("decisiontree.sav",use.value.labels = TRUE,to.data.frame = TRUE)%>%as_tibble()

Để minh họa, ta sẽ dùng 1 bộ số liệu về đặc tính của 4 biomarker của tình trạng nhiễm trùng trong bệnh viêm phổi. Thí dụ này lấy trong Case study số 46 dự án MLM.

Để tối ưu hóa hiệu ứng của đồ thị heatmap, tất cả biến số trong matrix cần được chuẩn hóa về thang đo bằng hàm scale( ).

dfscale<-df[,-5]%>%as.matrix()%>%scale()%>%as_tibble()%>%mutate(.,Class=df$xrayseverity,Id=row.names(.))

Package viridis cung cấp một số thang đo màu dựng sẵn rất tiện lợi cho heatmap. Bạn cũng có thể tự phối màu cho heatmap của chính mình nếu có thời gian.

library(viridis)

Để đơn giản, chúng ta chỉ trích ra 50 bệnh nhân xếp loại viêm phổi nặng nhất, để biểu thị rõ hơn sự tương phản giữa các biomarker

Cách 1: Sử dụng ggplot2

Ta có thể chia các giải pháp trong R thành 2 loại : Đồ thị đơn giản hoặc đồ thị có tương tác. Giải pháp tối ưu cho heatmap đơn giản là dùng hàm geom_tile() trong ggplot2 : Dữ liệu cần được chuyển sang dạng « Long » bằng hàm gather( ).

dfscale%>%.[c(101:150),]%>%gather(CRP:ESR,key="Marker",value="Value")%>%ggplot(aes(y=reorder(Id,Value),x=reorder(Marker,Value),fill=Value))+geom_tile(color="black",show.legend=T)+theme(axis.text.y=element_blank())+scale_x_discrete("Markers")+scale_y_discrete("Patient's Id")+scale_fill_viridis(option="D",begin=0,end=1)

Cách 2: Package ggfortify

Ngoài ra, ggfortify là 1 giải pháp cho những người … lười biếng. Nó tạo ra 1 object ggplot2, nên bạn có thể yên tâm về tính tương thích của đồ thị khi tô màu…

library(ggfortify)

dfscale%>%.[c(101:150),c(1:4)]%>%as.matrix()%>%autoplot()+scale_fill_viridis(option="D",begin=0,end=1)

Cách 3: Package mới xuất hiện gần đây là superheat

library(superheat)

dfscale%>%.[c(101:150),c(1:4)]%>%superheat(
  left.label.size = 0.2,
  bottom.label.size = 0.2,
  bottom.label.text.angle = 45,
  bottom.label.text.alignment = "right",
  bottom.label.col = "white",
  row.dendrogram = T,
  grid.vline.col = "white",
  grid.hline.col = "white"
)

Nếu bạn muốn vẽ heatmap có tương tác, sau đây là 3 giải pháp khác :

Cách 4: Package heatmaply

Heatmaply không chỉ vẽ heatmap mà còn thực hiện 1 hierarchical Cluster analysis trên dữ liệu và trình bày kết quả trên cùng đồ thị.

library(heatmaply)

dfscale%>%.[c(101:150),c(1:4)]%>%heatmaply()

Cách 5: Packae highcharter

Package highcharter sử dụng input là 1 matrix, nên bắt buộc người dùng chuyển dạng dataframe thành 1 matrix với hàm as.matrix().Đây là 1 package khá mạnh để tạo ra đồ thị tương tác trên HTML:

library(highcharter)

dfscale%>%.[c(101:150),c(1:4)]%>%as.matrix()%>%hchart()%>%hc_colorAxis(stops = color_stops(colors = viridis::viridis(50)))

Cách 6: Package d3heatmap

library(d3heatmap)

dfscale%>%.[c(101:150),c(1:4)]%>%d3heatmap(dendrogram = "none",
          color = viridis::viridis(50))

Đây là cách làm thủ công mà tác giả ưa thích :

dfscale%>%gather(CRP:ESR,key="Marker",value="Value")%>%ggplot(aes(x=reorder(Id,Value),y=reorder(Marker,Value),fill=Value))+geom_tile(color="black",show.legend=T)+facet_wrap(~Class,ncol=1,shrink=T,scale="free")+theme(axis.text.x=element_blank())+scale_y_discrete("Markers")+scale_x_discrete("Patient's Id")+scale_fill_viridis(option="D",begin=0,end=1)