• 跳至主要導覽
  • 跳至主要內容
  • 跳至主要資訊欄
Office 指南

Office 指南

辦公室工作實用教學

  • Excel
  • Word
  • PowerPoint
  • Windows
  • PowerShell
  • R

R 使用 ggrepel 避免 ggplot2 圖形文字標示重疊教學

介紹如何使用 ggrepel 套件自動排版 ggplot2 圖形中的文字標示,避免文字互相重疊。

傳統 ggplot2 文字標示

ggplot2 是目前主流的 R 繪圖套件,在繪製 XY 散佈圖的時候,若要在圖形中的座標點上標示文字,可以使用 geom_text 這一種圖層功能,並配合 hjust 與 vjust 參數來微調文字的位置,不過當資料點非常密集的時候,就很容易產生文字重的狀況。

library(ggplot2)
# 一般 ggplot2 圖形
ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) +
  geom_point(color = 'red') +
  geom_text(hjust = 0, vjust = 0)
一般 ggplot2 圖形
一般 ggplot2 圖形

ggrepel 套件

ggrepel 是一個專門用來解決文字標示重疊問題的套件,它會自動在圖形中尋找適當的空間來放入標示文字,讓整張圖形變得非常精緻且容易閱讀,解決了資料點過於密集造成的文字重疊問題。

若要使用 ggrepel 套件,可從官方的 CRAN 套件庫安裝,並且載入之:

# 安裝 ggrepel 套件
install.packages("ggrepel")

# 載入 ggrepel 套件
library(ggrepel)

ggrepel 所提供的 geom_text_repel 圖層功能跟傳統的 geom_text 類似,不過它會自動將文字放在適當的位置上,避免重疊:

# 以 ggrepel 標示文字
ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) +
  geom_point(color = 'red') +
  geom_text_repel()
以 ggrepel 標示文字
以 ggrepel 標示文字

上面這張圖雖然文字沒有重疊,但是由於資料點太密集了,所以有些地方會不太容易看清楚哪一個點對應那一行文字,這時候可以將文字的間距拉開一點,並加上所有標註的連線,這樣會讓資料標注更清楚。

# 加上所有標註連線
ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) +
  geom_point(color = 'red') +
  geom_text_repel(min.segment.length = 0, box.padding = 0.5)
加上所有標註連線
加上所有標註連線

方框文字標示

除了 geom_text_repel 之外,還有另外一種 geom_label_repel 標注圖層,它會以有方框的文字來標示資料:

# 方框文字標示
ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) +
  geom_point(color = 'red') +
  geom_label_repel(min.segment.length = 0, box.padding = 0.5)
方框文字標示
方框文字標示

geom_label_repel 的方框也可以根據資料上色,表現分組的資訊:

# 以文字方框顏色區隔群組資訊
ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) +
  geom_point(color = 'red') +
  geom_label_repel(aes(fill = factor(cyl)), min.segment.length = 0, box.padding = 0.5)
以文字方框顏色區隔群組資訊
以文字方框顏色區隔群組資訊

對齊標示文字

ggrepel 預設會自動將文字放置在適當的位置,而我們也可以自訂一些排版條件,讓文字依照自動的規則對齊,讓圖形看起來更整齊:

# 對齊標示文字
dat <- subset(mtcars, wt > 2.75 & wt < 3.45)
dat$car <- rownames(dat)
ggplot(dat, aes(wt, mpg, label = car)) +
  geom_text_repel(
    data          = subset(dat, wt > 3),
    nudge_x       = 3.5 - subset(dat, wt > 3)$wt,
    segment.size  = 0.2,
    segment.color = "grey50",
    direction     = "y",
    hjust         = 0
  ) +
  geom_text_repel(
    data          = subset(dat, wt < 3),
    nudge_x       = 2.7 - subset(dat, wt < 3)$wt,
    segment.size  = 0.2,
    segment.color = "grey50",
    direction     = "y",
    hjust         = 1
  ) +
  scale_x_continuous(
    breaks = c(2.5, 2.75, 3, 3.25, 3.5),
    limits = c(2.4, 3.8)
  ) +
  geom_point(color = "red")
對齊標示文字
對齊標示文字

標示數學公式

ggrepel 也可以將數學公式或符號直接標是在圖形中:

# 標示數學公式
d <- data.frame(
  x    = c(1, 2, 2, 1.75, 1.25),
  y    = c(1, 3, 1, 2.65, 1.25),
  math = c(
    NA,
    "integral(f(x) * dx, a, b)",
    NA,
    "lim(f(x), x %->% 0)",
    NA
  )
)
ggplot(d, aes(x, y, label = math)) +
  geom_point() +
  geom_label_repel(
    parse       = TRUE, # Parse mathematical expressions.
    size        = 6,
    box.padding = 2
  )
標示數學公式
標示數學公式

關於 ggrepel 的更多使用方式,可以參考 ggrepel 的官方網站。

分類:R

讀者互動方式

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

主要資訊欄

搜尋

近期文章

  • C++ 語言使用 Crypto++ 實作 RSA 數位簽章教學與範例
  • C++ 語言使用 Crypto++ 實作 RSA-OAEP 搭配 SHA256 加密教學與範例
  • C++ 語言使用 Crypto++ 實作 AES 加密、解密、認證加密教學與範例
  • C++ 語言使用 Crypto++ 實作 MD5、SHA1、SHA2、BLAKE2 雜湊教學與範例
  • Ubuntu Linux 安裝、使用 Crypto++ 加密函式庫教學與範例
  • C 語言使用 OpenSSL 實作橢圓曲線 ECDH 金鑰交換教學與範例
  • Python 以 eciespy 實作 ECC 非對稱式加密方法教學與範例
  • C 語言使用 OpenSSL 實作 PBKDF2 教學與範例

推薦網站

  • Udemy 線上教學課程
  • Coursera 線上教學課程

關注本站

  • 電子郵件
  • Facebook

公益

  • 家扶基金會
  • 台灣世界展望會
  • Yahoo 奇摩公益
  • igiving 公益網
  • 兒福聯盟

Copyright © 2021 · Office Guide