分類: R

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))

折線圖

這裡我在 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")

標示區域

Page: 1 2 3 4 5 6 7

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

[開箱] Marttiini MFT G10 芬蘭北歐直刀

本篇是 Marttiini M...

3 年 ago

[開箱] 一般打火棒、鎂塊打火棒

本篇是鎂塊打火棒與一般普通打火...

3 年 ago

[開箱] 瑞典 BAHCO 396-Lap 魚牌軍規摺疊鋸

本篇為瑞典 BAHCO 396...

3 年 ago

[DIY] 野炊水煮蛋、紅豆湯記錄

本篇記錄今年過年期間帶阿玄在家...

3 年 ago

[竹北素食] 善菓堂 SHAN GUO TANG

本篇是我最近去竹北善菓堂用餐時...

3 年 ago

Linux 複製檔案 cp 指令用法教學與範例

本篇介紹如何在 Linux 系...

3 年 ago