R

R 以 ggplot2 繪製熱圖 Heat Maps 教學與範例

介紹如何在 R 中使用 ggplot2 套件繪製熱圖(heat maps)。

繪製熱圖

若要使用 ggplot 繪製熱圖,可以使用 geom_tile 這個幾何圖案,以下是一個簡單的範例。

library(reshape2)
library(ggplot2)

# 準備原始資料
x <- data.frame(scale(mtcars))
x$car <- rownames(mtcars)

# 將資料表轉為長型表格
x.melt <- melt(x, id.vars = "car")

# 使用 ggplot 繪製熱圖
ggplot(x.melt, aes(x = car, y = variable, fill = value)) +
  geom_tile(colour = "white", size = 0.25) + # 繪製熱圖
  scale_y_discrete(expand = c(0,0)) +        # 移除多餘空白
  scale_x_discrete(expand = c(0,0)) +        # 移除多餘空白
  coord_fixed() +                            # 設定 X 與 Y 軸等比例
  scale_fill_gradientn(colours = terrain.colors(10)) + # 設定色盤
  theme(
    legend.text = element_text(face="bold"), # 說明文字用粗體
    axis.ticks = element_line(size=0.5),     # 座標軸上的刻度寬度
    plot.background = element_blank(),       # 移除背景
    panel.border = element_blank(),          # 移除邊框
    axis.text.x = element_text(
      angle = 90, vjust = 0.5, hjust = 1)    # X 軸文字轉向
  )
熱圖

階層式分群排序

通常將原始資料直接以 geom_tile 所畫出來的圖會顯得比較雜亂,看不出群聚的資訊,這時候可以考慮先以 hclust 產生階層式分群資訊,重新排列各變數的順序後,再繪製熱圖,會比較容易凸顯出分群的資訊。

# 準備原始資料
x <- data.frame(scale(mtcars))
order.car <- hclust(dist(x))$order    # 以階層式分群,產生車種排列順序
order.var <- hclust(dist(t(x)))$order # 以階層式分群,產生各變數排列順序
x$car <- factor(rownames(mtcars), levels = rownames(mtcars)[order])

# 將資料表轉為長型表格
x.melt <- melt(x, id.vars = "car")
x.melt$variable <- factor(x.melt$variable, levels = levels(x.melt$variable)[order.var])

# 使用 ggplot 繪製熱圖
ggplot(x.melt, aes(x = car, y = variable, fill = value)) +
  geom_tile(colour = "white", size = 0.25) + # 繪製熱圖
  scale_y_discrete(expand = c(0,0)) +        # 移除多餘空白
  scale_x_discrete(expand = c(0,0)) +        # 移除多餘空白
  coord_fixed() +                            # 設定 X 與 Y 軸等比例
  scale_fill_gradientn(colours = terrain.colors(10)) + # 設定色盤
  theme(
    legend.text = element_text(face="bold"), # 說明文字用粗體
    axis.ticks = element_line(size=0.5),     # 座標軸上的刻度寬度
    plot.background = element_blank(),       # 移除背景
    panel.border = element_blank(),          # 移除邊框
    axis.text.x = element_text(
      angle = 90, vjust = 0.5, hjust = 1)    # X 軸文字轉向
  )
熱圖

調整顏色

我們可以透過 scale_fill_gradientn 調整色盤,例如使用 RColorBrewer 套件所提供的色盤:

# 載入 RColorBrewer
library(RColorBrewer)

# ggplot 指令 ...
  scale_fill_gradientn(colours = brewer.pal(7, "YlGnBu")) + # 設定色盤
# ggplot 指令 ...

使用 YlGnBu 色盤所呈現出來的結果會像這樣:

YlGnBu 色盤

自訂資料分組

當資料分布不平均的時候,可以自訂資料分組,搭配適合的配色來表現資料。

# 準備原始資料
x <- data.frame(mtcars)
order.car <- hclust(dist(x))$order    # 以階層式分群,產生車種排列順序
order.var <- hclust(dist(t(x)))$order # 以階層式分群,產生各變數排列順序
x$car <- factor(rownames(mtcars), levels = rownames(mtcars)[order])

# 將資料表轉為長型表格
x.melt <- melt(x, id.vars = "car")
x.melt$variable <- factor(x.melt$variable, levels = levels(x.melt$variable)[order.var])

# 自訂資料分組
x.melt$group <- cut(x.melt$value,
                    breaks = c(-1, 0, 1, 3, 5, 10, 50, 100, max(x.melt$value, na.rm = T)),
                    labels = c("0", "0-1", "1-3", "3-5", "5-10", "10-50", "50-100", ">100"))

# 使用 ggplot 繪製熱圖
ggplot(x.melt, aes(x = car, y = variable, fill = group)) +
  geom_tile(colour = "white", size = 0.25) + # 繪製熱圖
  scale_y_discrete(expand = c(0,0)) +        # 移除多餘空白
  scale_x_discrete(expand = c(0,0)) +        # 移除多餘空白
  coord_fixed() +                            # 設定 X 與 Y 軸等比例
  scale_fill_brewer(palette = "BrBG") +      # 設定色盤
  theme(
    legend.text = element_text(face = "bold"), # 說明文字用粗體
    axis.ticks = element_line(size=0.5),     # 座標軸上的刻度寬度
    plot.background = element_blank(),       # 移除背景
    panel.border = element_blank(),          # 移除邊框
    axis.text.x = element_text(
      angle = 90, vjust = 0.5, hjust = 1)    # X 軸文字轉向
  )
自訂資料分組

參考資料

Share
Published by
Office Guide
Tags: ggplot2

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

10 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

10 個月 ago