바이오 대표

[ R 시각화 ] R 언어로 그리는 이쁜 히트맵 (Heatmap) - complexHeatmap 본문

R

[ R 시각화 ] R 언어로 그리는 이쁜 히트맵 (Heatmap) - complexHeatmap

바이오 대표 2023. 8. 4. 07:29

데이터를 시각화 하는 것은 의미 있는 해석을 하기 위해 중요한 단계입니다. 해당 글에서는 R 언어을 이용해서 히트맵을 그리는 다양한 패키지 중 (pheatmap, ggplot, complexheatmap) 중 파라미터들를 이용해서 이쁘게 그릴 수 있는 complexheatmap()에 관하여 알아보겠습니다.  

 

ComplexHeatmap

heatmap을 그릴 때, 필요한 요소는 matrix 입니다. 하지만 좀 더 이쁜 그림을 위해 다음과 같은 요소들을 사용할 수 있습니다.

  1. 필수! matrix (ex. gene vs sample counts)
  2. 선택 color heat_colors colorRamp2
  3. 선택 column annotation colanno HeatmapAnnotation
  4. 선택 row annotation

matrix 예시

# as.matrix(mat) = TMMCPM_Log2
                               sample1         sample2        sample3         sample4        sample5
PF3D7_0304600: CSP            0.000000        1.709882        0.000000        3.767100        3.404102
PF3D7_1401700                 0.000000        4.321385        0.000000        0.000000        2.279087
PF3D7_0310400: PIESP1         6.617115        8.079529        6.273362        7.844357        8.234118
PF3D7_0401600: RIF            6.957386        4.496372        0.000000        5.994415        5.862712
PF3D7_0608100                 0.000000        0.000000        0.000000        0.000000        2.771813
PF3D7_1222300: GRP94         10.072327       10.470409        9.621971       10.036639       10.244119
PF3D7_1448400: HRD3           0.000000        0.000000        0.000000        4.578547        5.612952
...
# 요소 설정 
heat_colors <- circlize::colorRamp2(breaks=c(0,1,3,6,9,12), colors = viridis::turbo(6))
colanno <- data %>%
  select(time_point) %>% # 그룹핑하고 싶은 column 선택 
  HeatmapAnnotation(df = ., which = "column",
                    col = list(time_point=ggpubr::get_palette(c("#EFC000FF", "#868686FF", "#CD534CFF"), 3) %>% 
                                          purrr::set_names(unique(manifest_456$time_point))))

Heatmap(**matrix** = as.matrix(data), 
        **col** = heat_colors,  # colorRamp2 
        **name** = "log2 TPM",
        **top_annotation** = colanno, # HeatmapAnnotation
        **show_column_names** = TRUE,
        **row_title_gp** = gpar(fontsize = 6),
        **column_names_gp** = gpar(fontsize=10),
        **row_names_gp** = gpar(fontsize = 10))

(좌)색 보정 없는 default 플랏. (우)viridis:turbo(6) 값 설정한 플랏. (위 예시 코드 아웃풋)

 

Manifest 예시

sample_id_cat RNA_label infection_status time_point analysis_group
1	sample1	L1Pf4	Infected	Day4	Day4_Heps_Pf+
2	sample2	L2Pf4	Infected	Day4	Day4_Heps_Pf+

 

colorRamp2

해당 기능은 circlize 패키지에 속하며, 연속적인 색을 커스텀해서 만들어내고 싶을 때 사용가능합니다. 위의 예시, circlize::colorRamp2(breaks=c(0,1,3,6,9,12), colors = viridis::turbo(6))에서 사용되는 색은 ‘viridis’ 패키지에서 만든 팔레트중 레인보우칼러텀인 turbo입니다. 이는 color-blind friendly 로, 색약을 갖고있는 사람들도 쉽게 구분을 할 수 있도록 만들어졌습니다. colors = viridis::turbo(6)) 코드는 turbo의 6개 색을 이용해서 연속적인 색을 만들어줍니다. breaks=c(0,1,3,6,9,12) 은 앞에서 정한 6개의 색을 내 데이터의 특정 구역에 적용을 할 수 있도록 하는 파라미터입니다. 예를 들어 내 데이터가 0 에서 15까지의 수치사이에 있다면, 위와 같이 0, 1, 3, 6, 9, 12 일때 변화를 주어 색을 칠하게 합니다. 팔레트 설명  circlize::colorRamp2 로 만든 색을 프린트 해보면, 다음과 같이 함수와 색, 투명도 와 같은 값을 저장합니다.

function (x = NULL, return_rgb = FALSE, max_value = 1)
{
생략
}
<bytecode: 0x55a23656d5a0>
<environment: 0x55a26db9e8f8>
attr(,"breaks")
[1]  0  1  3  6  9 12
attr(,"colors")
[1] "#30123BFF" "#3E9BFEFF" "#46F884FF" "#E1DD37FF" "#F05B12FF"
[6] "#7A0403FF"
attr(,"transparency")
[1] 0
attr(,"space")
[1] "LAB"

만약 만든 팔레트를 시각화 하고싶다면 다음과 같이 실행 할 수 있습니다.

library(circlize)
draw_colorRamp2 <- function(breaks, colors){
    
    # create the color ramp
    color_ramp <- circlize::colorRamp2(breaks, colors)
    
    # number of rectangles to draw
    num_rectangles <- 100 
    
    # generate values ranging from the minimum to the maximum break value
    data_values <- seq(min(breaks), max(breaks), length.out = num_rectangles)
    
    # the width of each rectangle
    rect_width <- 1
    
    # set up the plotting area
    plot(0, 0, xlim = c(0, num_rectangles), ylim = c(0, 1),
         type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n")
    
    # draw rectangles with colors from the color ramp
    for (i in 1:num_rectangles) {
      rect(i - 1, 0, i, 1, col = color_ramp(data_values[i]), border = NA)
    }
    
    # Add color legend
    legend("topright", legend = breaks, fill = colors, title = "Values", cex = 0.8)
}

# exampl_1
breaks <- c(-2, 0, 2)
colors <- c("green", "white", "red")
draw_colorRamp2(breaks=breaks, colors = colors)

# example_2
draw_colorRamp2(breaks=c(0,1,3,6,9,12), colors = viridis::turbo(6))

 

 

 

HeatmapAnnotation

Complexheatmap의 HeatmapAnnotation() 함수를 이용해서 특정 샘플이나 컬럼을 clusering 하고, 레이블을 할 수 있습니다. 아래의 예시에서 위쪽에 노랑, 회색, 빨간색으로 다른 그룹을 표시한 것을 확인 할 수 있습니다. 해당 색의 레이블은 피켜의 오른쪽 레이블을 통해서 확인 할 수 있습니다.

colanno <- matrix %>%
  select(time_point) %>%
  HeatmapAnnotation(df = ., which = "column",
                    col = list(time_point=ggpubr::get_palette(c("#EFC000FF", "#868686FF", "#CD534CFF"), 3) %>% 
                                          purrr::set_names(unique(manifest_456$time_point))))

viridis:turbo(6) 값 설정한 플랏. (위 예시 코드 아웃풋)