介紹如何在 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
色盤所呈現出來的結果會像這樣:
自訂資料分組
當資料分布不平均的時候,可以自訂資料分組,搭配適合的配色來表現資料。
# 準備原始資料 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 軸文字轉向 )