R 資料探索與基本繪圖

折線圖(Line Plots)

對於時間序列類型的資料,折線圖是一個最常被使用的圖形,以下是以 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))
r-data-exploration-and-visualization-line-plot-8

折線圖

這裡我在 plot 中多加上了一個 ylim 參數來指定 y 軸的繪圖範圍,如果不指定的話 R 也會自動判斷最佳的範圍。由於我隨後還要再加上另一條線,所以在一開始就要先將繪圖範圍設定成可以容納所有資料的大小,這樣後來再加上新的資料時才不會讓新的資料超出可繪圖的範圍。

若要在同一張圖上畫上多條折線圖,則第二條以後的折線圖可以使用 lines 加上去:

y2 <- y1 + abs(rnorm(100, 3))
lines(x, y2, col = "blue")
r-data-exploration-and-visualization-line-plot-9

折線圖

lattice 系統

lattice 系統的折線圖畫法也跟 base 系統類似,一樣是加上一個 type 參數:

my.df <- data.frame(x, y1, y2)
xyplot(y1 ~ x, my.df, type = "l")
r-data-exploration-and-visualization-line-plot-7

折線圖

若要同時畫上多條線,則可以將所有的資料以公式表示:

xyplot(y1 + y2 ~ x, my.df, type = "l")
r-data-exploration-and-visualization-line-plot-6

折線圖

ggplot2 系統

ggplot2 系統中繪製折線圖的方式跟散佈圖差不多,只是將 geom_plot 換成 geom_line 而已:

ggplot(my.df, aes(x = x, y = y1)) +
  geom_line()
r-data-exploration-and-visualization-line-plot-1

折線圖

如果要在 ggplot 系統上同時畫出兩條線的話,情況會稍微複雜一些,由於在 ggplot 函數中使用 aes 所設定的資料與圖形對應關係會適用於整個圖形中所有的指令,相當於一個全域(global)的對應關係,而在這裡我們需要的是兩條線分別有不同的資料對應,所以我們將 y 軸的資料對應寫在個別的 geom_line 中,而 x 軸的對應則維持不變:

ggplot(my.df, aes(x = x)) +
  geom_line(aes(y = y1)) +
  geom_line(aes(y = y2))
r-data-exploration-and-visualization-line-plot-2

折線圖

另一種做法是將資料用 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()
r-data-exploration-and-visualization-line-plot-3

折線圖

對於這種有兩條線的資料,ggplot 還提供一種 geom_ribbon 函數可以將兩條線中間的區域標示出來:

ggplot(my.df, aes(x = x, ymin = y1, ymax = y2)) +
  geom_ribbon()
r-data-exploration-and-visualization-line-plot-4

標示區域

區域的顏色也可以自訂:

ggplot(my.df, aes(x = x, ymin = y1, ymax = y2)) +
  geom_ribbon(color = "black", fill = "gray")
r-data-exploration-and-visualization-line-plot-5

標示區域

R

2 留言

  1. 123

    這一頁有錯字喔~
    第一段base 與 grid 系統:
    雖然 grid 的彈性很大,但是對於資料量比較大的”圖形”

Leave a Reply