迷你課程:R語言-10~繪圖

Quick look

R 提供了強大的繪圖功能,透過不同的函數和參數設定,我們可以靈活控制圖形輸出。本篇教學將從最基本的圖形設備(Graphics Device)、基礎繪圖函數、圖形參數(Graphical Parameters),到 高級繪圖技巧(如座標軸自訂、圖形裝飾),帶你全面掌握 R 的繪圖機制。

R 的圖形設備(Graphics Device)

在 R 中,所有的圖形繪製都需要在圖形設備(Graphics Device)上完成。當我們執行繪圖函數(如 plot()),R 會自動開啟一個圖形設備,然後在其上繪製圖形。

開啟圖形設備

不同的作業系統有不同的 預設圖形設備:

  • Windows: windows()
  • Mac: quartz()
  • Linux: X11()
  • pdf()
  • postscript()
  • bitmap()
  • pictex()
  • svg()
  • png()
  • jpeg()
  • bmp()
  • tiff()

此外,我們可以直接使用 dev.new() 來開啟通用的預設圖形設備,也就是會根據你的作業系統,自動選擇適當的圖形設備

dev.new(width = 7, height = 7, xpos = 1000, ypos = 200)  # 指定視窗大小與位置

列出目前的圖形設備

dev.list()  # 顯示所有已開啟的圖形設備

關閉圖形設備

dev.off()  # 關閉當前的圖形設備 如果接連開了三個,每執行一次關一個

關閉所有圖形設備

類似 RStudio 右上角的「清除圖形」。

graphics.off()  

預設

可以用.options()來預設圖形設備參數

quartz.options(xpos=1000, ypos=500)
quartz()
quartz.options(reset = TRUE)

儲存繪圖

R 允許我們將圖形儲存為不同的格式,例如:

pdf("plot1.pdf", width = 7, height = 7)  # 儲存為 PDF 這種稱為隱形graphic device
plot(rnorm(10), rnorm(10))
dev.off()  # 關閉設備並存檔

plot() 或hist()在執行時,會找尋當前有沒有graphic device,如果有就畫在上面,如果沒有,就新增一個,畫在上面。

jpeg("plot1.jpeg", width = 700, height = 700)  # 儲存為 JPEG
plot(rnorm(10), rnorm(10))
dev.off()

plot() 函數的基本用法

plot() 是 R 最基礎的繪圖函數,可用來繪製散佈圖(scatter plot)

plot(rnorm(10), rnorm(10))  # 繪製 10 個隨機點

我們可以透過 type 參數設定不同類型的圖:

plot(x1, x2, type = "l")  # 折線圖(line)
plot(x1, x2, type = "b")  # 點+線(both)
plot(x1, x2, type = "o")  # 點在線上(overlap)
plot(x1, x2, type = "n")  # 不畫點,只設置坐標軸(no plotting)

例如,今天有一個函式:

circle_points <-function(n=12, noise=0.2){
      theta <- 2*pi*seq(0,1,length.out=n+1)[-1]
      x1 <- cos(theta) + noise*rnorm(n)
      x2 <- sin(theta) + noise*rnorm(n)
      return(list(x1=x1, x2=x2))
}
circ <- circle_points()
x1 <-circ$x1
x2 <-circ$x2

plot(x1,x2) #default type='p' 表示points
plot(x1,x2, type='l')
plot(x1,x2, type='b')

Fig1
圖一
Fig2
圖二
Fig3
圖三

調整 X 軸與 Y 軸範圍: xlim and ylim

plot(x1, x2, xlim = c(-2,2), ylim = c(-2,2))

更改軸標題: xlab and ylab

plot(x1, x2, xlab = "水平位置 (cm)", ylab = "垂直位置 (cm)")

points() 和 lines() 函數

當我們已經繪製了圖形時,可以用 points()lines()增加更多的點或線

plot(x1, x2, xlim = c(-1.5,1.5), ylim = c(-1.5,1.5))
points(circ$x1, circ$x2, pch = 2)  # 添加三角形點
lines(c(x1, x1[1]), c(x2, x2[1]), col = "magenta")  # 畫出封閉的圓形線

Fig4
圖四

text() 與 mtext() 標註

在圖中添加文字

plot(x1, x2, xlim = c(-1.5,1.5), ylim = c(-1.5,1.5))
text(x1, x2 - 0.3, LETTERS[1:12])  # 加入標記 A~L

Fig5
圖五

在圖的邊界加上標題

plot(x1, x2, xlim = c(-1.5,1.5), ylim = c(-1.5,1.5))
mtext("Important", side = 3, line = 0) # 下左上右->1,2,3,4
mtext("Important", side = 3, line = 1.5, font = 2, cex = 1.5)

Fig6
圖六

其他參數還包括,polygon、rect、segments、abline、arrows,有興趣可以再去看。

自訂座標軸(axis)

plot(x1, x2, axes = FALSE)  # 隱藏座標軸
#隱藏後用axis()重新定義
axis(1, at = -1:1, labels = c("左", "中", "右"))  # 自訂 X 軸標籤
axis(2, at = seq(-1,1,by=0.1))  # Y 軸細刻度
box()  # 添加邊框

有時候,定義了axis後再加入邊框會有部份重疊的狀況,此時可以調整axis的線粗度為0,保持標記即可:

axis(1,lwd=0,lwd.ticks=1)
axis(2,lwd=0,lwd.ticks=1)

par() 設定全局繪圖參數

par(col = "gray", col.axis = "magenta", pch = 4, mar = c(6,6,1,1))
par(mfrow=c(2,2)) #會繪製2 x 2的圖
plot(x1, x2)  # 使用灰色點和洋紅色座標軸

如果以dev.off()將plots關閉,再重繪,系統會忘記par()的設定,因此只適用於當前的graphic device。


練習:使用 Hershey 字體繪製時鐘

以下範例繪製了一個時鐘,並使用 Hershey 字體為時鐘標記數字。

設定畫布

par(mar = c(0,0,0,0))
plotsize <- 1.5
plot(0, type = "n", xlim = plotsize * c(-1,1), ylim = plotsize * c(-1,1), axes = FALSE, ann = FALSE)

添加 1~12 的數字

circ <- circle_points(n = 12, noise = 0)
x1 <- circ$x1
x2 <- circ$x2
nums <- c(2,1, 12:3)
text(x1, x2, nums, cex = 3.0, vfont = c("serif", "bold"))

繪製指針

points(0,0, pch = 16, cex = 4)
arrows(0, 0, 0.7*cos(2*pi*5/12), 0.7*sin(2*pi*5/12), lwd = 8)  # 時針
arrows(0, 0, 0.85*cos(2*pi*1/12), 0.85*sin(2*pi*1/12), lwd = 4)  # 分針

添加公司名稱

text(0, 0.5, "WatchCo", vfont = c("serif", "plain"), cex = 1.75)

添加邊框

rect(-1.25, -1.25, 1.25, 1.25, border = 2, lwd = 12)

課程小結

本次課程介紹了如何在 R 環境中開啟與關閉圖形裝置。雖然各作業系統使用的指令略有不同,但基本概念相通。

透過 plot() 函數,我們可以靈活繪製基礎圖形;搭配 par() 函數設定全域圖形參數,可套用於後續所有圖形操作。此外,lines() 和 points() 等函數能在現有圖層上疊加線條與資料點,增強視覺表達。

掌握這些基本繪圖技巧,能有效地將各類資料轉化為清晰直觀的視覺化成果。

Yang-Hong Dai 戴揚紘
Yang-Hong Dai 戴揚紘
主治醫師

我的研究興趣為結合數據分析來探討各種癌症生物學。

comments powered by Disqus