資料點的符號、顏色與大小

在畫圖時最常見的需求就是依據不同的資料,指定資料點的符號、顏色與大小,以下介紹一些基本的使用方式。

資料點符號

plot 預設會使用圓圈來標示資料點,我們可以透過 pch 參數來使用不同的資料點符號,可用的符號如下:

r-basic-plotting-tools-pch-1

假設要將符號設定為實心的圓點(編號 16),可以執行:

plot(x = Veg$BARESOIL, y = Veg$R,
  xlab = "Exposed soil",
  ylab = "Species richness", main = "Scatter plot",
  xlim = c(0, 45), ylim = c(4, 19), pch = 16)

vegetation 的資料是從 8 個斷面(transect)中所蒐集到的,如果我們想在圖形上區分出不同斷面的資料分佈,我們可以將 pch 直接指定為斷面的編號,這樣就可以用不同的符號表示不同的斷面,首先先檢查一下斷面的實際資料:

Veg$Transect

輸出為

 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3
[20] 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5
[39] 6 6 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8
[58] 8

由於斷面的資料剛好是從 18 的數字,而這些數字也都有對應到 pch 的符號,所以可以不需要做額外的轉換,直接就可以指定給 pch

plot(x = Veg$BARESOIL, y = Veg$R,
  xlab = "Exposed soil", ylab = "Species richness",
  main = "Scatter plot", xlim = c(0, 45),
  ylim = c(4, 19), pch = Veg$Transect)

畫出的圖形為

r-basic-plotting-tools-scatterplot-3

這種用資料的數值來指定 pch 的方式有一些地方要注意:

  • 如果 Veg$Transect 的數值是從 0 開始編號的話(012、⋯⋯),就不能直接將 Veg$Transect 指定給 pch,否則所有編號為 0 的資料會畫不出來。
  • 如果 Veg$Transect 的資料長度跟 Veg$BARESOILVeg$R 不同的話,會造成畫出來的資料點符號錯誤。假設 Veg$Transect 的資料長度,R 會在資料長度不夠時,自動重複使用 Veg$Transect 的資料,而在我們這個例子中,所有變數的資料長度都相同,所以沒有這樣的問題。
  • pch 只能接受整數的資料,如果指定為 factor 的話,會出現錯誤。

如果我們需要依照資料的年份來指定資料點符號的話,步驟就會比較複雜,因為一般的年份(例如 1967)沒有剛好對應的 pch 數值,所以還要另外在建立一個數值向量來指定資料點符號。

假設我們要將資料依據年份(Veg$Time)來區分,把 1974 年以前的資料跟 1974 年以後的資料分開,分別用編號 116 的符號來表示資料點,則操作步驟如下:

Veg$Time2 <- Veg$Time
Veg$Time2 [Veg$Time <= 1974] <- 1
Veg$Time2 [Veg$Time > 1974] <- 16
Veg$Time2

輸出為

 [1]  1  1  1  1 16 16 16  1  1  1  1 16 16
[14] 16  1  1  1  1 16 16 16 16  1  1  1  1
[27] 16 16 16 16  1  1  1  1 16 16 16 16  1
[40]  1  1  1 16 16 16 16  1  1  1 16 16 16
[53]  1  1  1 16 16 16

這裡先建立一個 Veg$Time 向量,其內容就是每一筆資料所對應的 pch 值,接著就可以使用這個向量來指定資料點的符號:

plot(x = Veg$BARESOIL, y = Veg$R,
  xlab = "Exposed soil",
  ylab = "Species richness", main = "Scatter plot",
  xlim = c(0, 45), ylim = c(4, 19),
  pch = Veg$Time2)

畫出來的圖形為

r-basic-plotting-tools-scatterplot-4

關於 pch 的詳細說明,可以參考 points 線上手冊:

?points