過去說complexheatmap太復(fù)雜,是我太菜了

寫在前面

之前曾抱怨過complexheatmap太復(fù)雜了,現(xiàn)在我想說是我太菜了浮禾。折騰了一圈complexheatmap后,發(fā)現(xiàn)complexheatmap真的是極致全面的一個熱圖包了份汗。

TidyTuesday

如果你想入門R或者python盈电,但是沒有數(shù)據(jù)給你折騰而發(fā)愁。那么我推薦你去看看TidyTueday杯活。點這里

TT

每周二一個新的數(shù)據(jù)包匆帚,覆蓋各種類型。比如今天我們折騰的數(shù)據(jù)就是來自TidyTuesday旁钧。想要獲取數(shù)據(jù)非常簡單吸重,只需要安裝TidyTuesday的包。

install.packages("tidytuesdayR")

首先讀入需要的包歪今。

#Loading necessary packages
library(tidytuesdayR)
library(tidyverse)
library(DataExplorer) # easy way for data exploring

然后

# Import data from tidytuesday
tuesdata <- tidytuesdayR::tt_load('2020-09-01')
# or
tuesdata <- tidytuesdayR::tt_load(2020, week = 36)
--- Compiling #TidyTuesday Information for 2020-09-01 ----
--- There are 5 files available ---
--- Starting Download ---

    Downloading file 1 of 5: `arable_land_pin.csv`
    Downloading file 2 of 5: `cereal_crop_yield_vs_fertilizer_application.csv`
    Downloading file 3 of 5: `cereal_yields_vs_tractor_inputs_in_agriculture.csv`
    Downloading file 4 of 5: `key_crop_yields.csv`
    Downloading file 5 of 5: `land_use_vs_yield_change_in_cereal_production.csv`

--- Download complete ---

當(dāng)然嚎幸,具體請考慮自己的網(wǎng)速。因為數(shù)據(jù)保存在github上……

數(shù)據(jù)可視化

key_crop_yields <- tuesdata$key_crop_yields

key_crop_yields %>%
  filter(Code != ""& Entity != "World") %>% 
  select(-(2)) %>% 
  create_report(
    config = configure_report(
      add_plot_bar = FALSE
    )
  )

這次使用DataExplorer自動生成報告寄猩,當(dāng)然你可以通過函數(shù)查看更具體的內(nèi)容嫉晶。

key_crop_yields %>%
  filter(
    Entity %in% c(
      "Japan",
      "China",
      "United States",
      "Brazil",
      "Indonesia",
      "India",
      "Pakistan",
      "Nigeria",
      "Bangladesh",
      "Russia",
      "Mexico"
    )
  ) %>%
  select(-(2)) %>%
  mutate(Year = as.factor(Year),
         Entity = as.factor(Entity)) %>% plot_boxplot(by = c("Year"))
  

可可的產(chǎn)量很有意思啊。
或者

key_crop_yields %>%
  drop_na() %>% 
  filter(Code != "" & Entity != "World" & Year == 2018) %>%
  select(-(1:3)) %>% 
  plot_correlation(type = "c")

當(dāng)然焦影,也能用ggplot2

key_crop_yields %>%
  filter(
    Entity %in% c(
      "Japan",
      "China",
      "United States",
      "Brazil",
      "Indonesia",
      "India",
      "Pakistan",
      "Nigeria",
      "Bangladesh",
      "Russia",
      "Mexico"
    )
  ) %>%
  ggplot(., aes(x = Year, y = `Wheat (tonnes per hectare)`, color = Entity)) +
  geom_point(size = .1) +
  geom_smooth(method = 'lm') +
  theme_bw()

尼日利亞的小麥產(chǎn)量居然是下降的车遂,聽說他們主糧是一種豆子。中國小麥公頃產(chǎn)增長超級快斯辰,那么中國小麥公頃產(chǎn)達到世界前列了么舶担?一張熱圖告訴你。
注:這里選擇的是人口前11的國家彬呻。

世界小麥公頃產(chǎn)量熱圖

hmmm 看來不是…… 什么你問熱圖怎么做的衣陶?complexheatmap 氨濉!
代碼具體參考kevinblighe/E-MTAB-6141: Data from Lewis, Barnes, Blighe et al., Cell Rep. 2019 Aug 27; 28(9): 2455–2470.e5. (github.com)

#載入包
require(RColorBrewer)
require(ComplexHeatmap)
require(circlize)
require(cluster)
require(countrycode)

然后整理一下數(shù)據(jù)

set.seed(2021)
yield_heatmap <- key_crop_yields %>%
  filter(!is.na(Code)) %>%
  select(Entity, Year, `Wheat (tonnes per hectare)`) %>%
  spread(Year, `Wheat (tonnes per hectare)`) %>% 
  filter(Entity != "World") %>% 
  column_to_rownames(var = "Entity") %>% 
  drop_na()

key_crop_yields %>% 
  filter(str_detect(Entity,"Sudan")) %>% 
  select(Entity, Year, `Wheat (tonnes per hectare)`) %>% 
  drop_na() %>% 
  mutate(Entity = "Sudan") %>% 
  arrange(Year) %>% 
  spread(Year, `Wheat (tonnes per hectare)`) %>% 
  column_to_rownames(var = "Entity") %>% 
  bind_rows(yield_heatmap) -> heat

上面做了兩件事剪况,一個是把數(shù)據(jù)里各種大洲和世界數(shù)據(jù)去掉了教沾,另一個就是把蘇丹數(shù)據(jù)跟前蘇丹的數(shù)據(jù)合并了。
注:這里指的是Entity不是Country译断,防杠還是去掉了一些有爭議的地區(qū)授翻。

然后joint一下地理信息,后來發(fā)現(xiàn)起始直接通過Code就能獲得準(zhǔn)確信息了……以后說吧孙咪。

rownames(heat) %>% data.frame(country = .) -> df
df$Continent <-  countrycode(sourcevar = df[, "country"],
                             origin = "country.name",
                             destination = "continent")

接下來是定義五大洲板塊的色塊注釋堪唐。

ann <- data.frame(Continent = df$Continent,
                  row.names = df$country,
                  stringsAsFactors =  FALSE)
colours <- list(
  Continent = c('Africa' = '#2171B5', 'Asia' = '#6A51A3', 'Europe' = 'red2', 'Americas' = 'green3', 'Oceania' = 'orange')
)

colAnn <- HeatmapAnnotation(
  df = ann,
  which = 'row', # 'col' (samples) or 'row' (gene) annotation?
  col = colours,
  annotation_height = 0.6,
  annotation_width = unit(1, 'cm'),
  gap = unit(1, 'mm'),
  annotation_legend_param = list(
    Continent = list(
      nrow = 5,
      title = 'Continent',
      title_position = 'topcenter',
      legend_direction = 'vertical',
      title_gp = gpar(fontsize = 12, fontface = 'bold'),
      labels_gp = gpar(fontsize = 12, fontface = 'bold'))
  )
)

頂部的箱線圖注釋

pick.col <- brewer.pal(5, 'Greens')
boxplotCol <- HeatmapAnnotation(
    Average = anno_boxplot(
      heat,
      border = FALSE,
      gp = gpar(fill = colorRampPalette(pick.col)(length(1:58))),
      pch = '.',
      size = unit(2, 'mm'),
      axis = TRUE,
      axis_param = list(
        gp = gpar(fontsize = 12),
        side = 'left')),
      annotation_width = unit(c(2.0), 'cm'),
      which = 'col')

然后是頂部線圖的注釋

heat_anno <- HeatmapAnnotation(
    Average = anno_lines(
      apply(heat, 2, mean),
      border = TRUE,
      gp = gpar(col = "red2"),
      size = unit(2, 'mm'),
      axis = TRUE,
      axis_param = list(
        gp = gpar(fontsize = 10),
        side = 'left')),
    Distribution = anno_boxplot(
      heat,
      border = FALSE,
      gp = gpar(fill = colorRampPalette(pick.col)(length(1:58))),
      pch = '.',
      size = unit(2, 'mm'),
      axis = TRUE,
      axis_param = list(
        gp = gpar(fontsize = 12),
        side = 'left')),
      annotation_width = unit(c(2.0), 'cm'),
      which = 'col')

當(dāng)然你也可以換成柱狀圖

barplotCol <- HeatmapAnnotation(
    Average = anno_barplot(
      apply(heat, 2, mean),
      border = TRUE,
      gp = gpar(fill = colorRampPalette(pick.col)(length(1:58))),
      size = unit(2, 'mm'),
      axis = TRUE,
      axis_param = list(
        gp = gpar(fontsize = 12),
        side = 'left')),
      annotation_width = unit(c(2.0), 'cm'),
      which = 'col')

然后開始畫圖熱圖吧
說個題外話,如果你對魔改complexheatmap有興趣翎蹈,強烈建議看看這兒
ComplexHeatmap Complete Reference (jokergoo.github.io)
雖然看的人想喊師傅別念了別念了……

myCol <- colorRampPalette(c('dodgerblue', 'black', 'yellow'))(100) #三色
myBreaks <- seq(1, 8, length.out = 100)  #設(shè)置色彩范圍
pamClusters <- cluster::pam(heat, k = 5) #設(shè)置聚類數(shù)

Heatmap(
  heat,
  name = 'Wheat
  (tonnes per hectare)', 
  col = colorRamp2(myBreaks, myCol), #這個顏色設(shè)定值得學(xué)習(xí)淮菠,做出來很高級
  row_split = factor(pamClusters$clustering, levels = c(5,4,3,1,2)),  #聚類排序,
  cluster_row_slices = FALSE, #不解釋荤堪,自己看manual
  heatmap_legend_param = list( #設(shè)置標(biāo)簽
    color_bar = 'continuous',
    legend_direction = 'vertical',
    legend_width = unit(8, 'cm'),
    legend_height = unit(5.0, 'cm'),
    title_position = 'topcenter',
    title_gp = gpar(fontsize = 12, fontface = 'bold'),
    labels_gp = gpar(fontsize = 12, fontface = 'bold')
  ),
  # row parameters
  cluster_rows = TRUE, #聚類
  show_row_dend = TRUE, #顯示聚類
  row_title = "Cluster",
  row_title_gp = gpar(fontsize = 10,  fontface = 'bold'), #字號合陵,粗體
  row_title_rot = 90, 
  show_row_names = TRUE,
  row_names_gp = gpar(fontsize = 10, fontface = 'bold'),
  row_names_side = 'right',
  row_dend_width = unit(25, 'mm'),
  
  # column parameters
  cluster_columns = FALSE,
  column_title = 'Year',
  column_title_side = 'bottom',
  column_title_gp = gpar(fontsize = 10, fontface = 'bold'),
  column_title_rot = 0,
  show_column_names = TRUE,
  column_names_gp = gpar(fontsize = 10, fontface = 'bold'),
  column_names_max_height = unit(10, 'cm'),
  column_dend_height = unit(25, 'mm'),
  # cluster methods for rows and columns
  clustering_distance_rows = function(m) dist(m),
  row_dend_reorder = T,
  clustering_method_rows = 'ward.D2',
  top_annotation = heat_anno,
  right_annotation = colAnn
) -> heat_map
heat_map

是不是很簡單呢!做完我都不記得那些參數(shù)是干嘛的了……
那么有沒有簡單的辦法呢澄阳!有個低配版拥知,效果嘛……

yield_mean <- apply(heat, 2, mean) %>% data.frame(average = .) %>% mutate(year = rownames(.))

heat %>%
  mutate(country = rownames(.)) %>%
  left_join(., df, by = "country") %>%
  gather(year, yield, -country, -Continent ) %>%
  left_join(., yield_mean, by = "year") %>%
  as.tibble() %>%
  tidyHeatmap::heatmap(country, year, yield,
                       cluster_columns = FALSE,
                       .scale = "none",
                       transform = NULL) %>%
  tidyHeatmap::add_tile(Continent) %>%
  tidyHeatmap::add_bar(average)

怎么說呢,又不是不能用寇荧!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末举庶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揩抡,更是在濱河造成了極大的恐慌户侥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峦嗤,死亡現(xiàn)場離奇詭異蕊唐,居然都是意外死亡,警方通過查閱死者的電腦和手機烁设,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門替梨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來否彩,“玉大人颠毙,你說我怎么就攤上這事∫饶” “怎么了恋谭?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵糠睡,是天一觀的道長。 經(jīng)常有香客問我疚颊,道長狈孔,這世上最難降的妖魔是什么信认? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮均抽,結(jié)果婚禮上嫁赏,老公的妹妹穿的比我還像新娘。我一直安慰自己油挥,他們只是感情好潦蝇,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著深寥,像睡著了一般护蝶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翩迈,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音盔夜,去河邊找鬼负饲。 笑死,一個胖子當(dāng)著我的面吹牛喂链,可吹牛的內(nèi)容都是我干的返十。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼椭微,長吁一口氣:“原來是場噩夢啊……” “哼洞坑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝇率,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤迟杂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后本慕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排拷,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年锅尘,在試婚紗的時候發(fā)現(xiàn)自己被綠了监氢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡藤违,死狀恐怖浪腐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顿乒,我是刑警寧澤议街,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站淆游,受9級特大地震影響傍睹,放射性物質(zhì)發(fā)生泄漏隔盛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一拾稳、第九天 我趴在偏房一處隱蔽的房頂上張望吮炕。 院中可真熱鬧,春花似錦访得、人聲如沸龙亲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳄炉。三九已至,卻和暖如春搜骡,著一層夾襖步出監(jiān)牢的瞬間拂盯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工记靡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谈竿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓摸吠,卻偏偏與公主長得像空凸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寸痢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容