對於時間序列類型的資料,折線圖是一個最常被使用的圖形,以下是以 R 的三種繪圖系統繪製折線圖的方式。
base
系統這裡我們產生一些隨機性的測試資料來示範折線圖的畫法。
set.seed(1) y1 <- cumsum(rnorm(100)) x <- seq_along(y1)
在 base
系統中的折線圖也是使用 plot
函數來繪製,只是加上一個 type
參數:
plot(x, y1, type = "l", ylim = c(-5, 20))
這裡我在 plot
中多加上了一個 ylim
參數來指定 y 軸的繪圖範圍,如果不指定的話 R 也會自動判斷最佳的範圍。由於我隨後還要再加上另一條線,所以在一開始就要先將繪圖範圍設定成可以容納所有資料的大小,這樣後來再加上新的資料時才不會讓新的資料超出可繪圖的範圍。
若要在同一張圖上畫上多條折線圖,則第二條以後的折線圖可以使用 lines
加上去:
y2 <- y1 + abs(rnorm(100, 3)) lines(x, y2, col = "blue")
lattice
系統lattice
系統的折線圖畫法也跟 base
系統類似,一樣是加上一個 type
參數:
my.df <- data.frame(x, y1, y2) xyplot(y1 ~ x, my.df, type = "l")
若要同時畫上多條線,則可以將所有的資料以公式表示:
xyplot(y1 + y2 ~ x, my.df, type = "l")
ggplot2
系統在 ggplot2
系統中繪製折線圖的方式跟散佈圖差不多,只是將 geom_plot
換成 geom_line
而已:
ggplot(my.df, aes(x = x, y = y1)) + geom_line()
如果要在 ggplot
系統上同時畫出兩條線的話,情況會稍微複雜一些,由於在 ggplot
函數中使用 aes
所設定的資料與圖形對應關係會適用於整個圖形中所有的指令,相當於一個全域(global)的對應關係,而在這裡我們需要的是兩條線分別有不同的資料對應,所以我們將 y 軸的資料對應寫在個別的 geom_line
中,而 x 軸的對應則維持不變:
ggplot(my.df, aes(x = x)) + geom_line(aes(y = y1)) + geom_line(aes(y = y2))
另一種做法是將資料用 melt
重新整理過,然後使用 group
的方式繪圖:
library(reshape2) my.df.melt <- melt( my.df, id.vars = "x", measure.vars = c("y1", "y2") ) ggplot(my.df.melt, aes(x = x, y = value, group = variable)) + geom_line()
對於這種有兩條線的資料,ggplot
還提供一種 geom_ribbon
函數可以將兩條線中間的區域標示出來:
ggplot(my.df, aes(x = x, ymin = y1, ymax = y2)) + geom_ribbon()
區域的顏色也可以自訂:
ggplot(my.df, aes(x = x, ymin = y1, ymax = y2)) + geom_ribbon(color = "black", fill = "gray")