R語言(5)

資料視覺化

簡單的圖表帶給資料分析者的資訊量,比任何其他工具都還要多

-- John Tukey

圖表的三要素

1. 簡單(Simple)

讓使用者一看就懂不需要思考太久,不要讓圖表變成一張「謎語」

 

2. 好用(Useful)

圖表不只是看起來好看而已,它應該能幫助使用者快速抓到資訊、甚至可以重複使用來比較不同資料

 

3. 忠實(Truthful)

圖表必須呈現資料的真實面貌,不能誤導觀者

日本製

台灣製

ggplot2

 ggplot(data) +
   geom_xxx(mapping = aes(x = ..., y = ...)) +
   其他圖層...

1. ggplot(data = 資料)

這是圖表的起點,告訴 ggplot 你要用哪一筆資料。

 

2. aes(...) 是 aesthetics 的縮寫 (圖形美學屬性)

指定的是「要把哪個變數放到 x 軸、y 軸?要不要根據變數來分顏色?」

3. geom_XXX() 是幾何圖層

這邊是告訴 R:「我們想畫什麼樣的圖?」

這個 + 不是加法,而是「把這層圖表加上去」的意思。

 

 

 

 

 

4. 其他圖層:labs()theme()facet_wrap() 等

這些語法幫助你加上標題、調整主題樣式、依分類變數分圖等等功能。

畫長條圖 ​​geom_bar()
畫散佈圖 geom_point()
畫折線圖 geom_line()
畫盒鬚圖 geom_boxplot()
 ggplot(data) +
   geom_xxx(mapping = aes(x = ..., y = ...)) +
   其他圖層...

舉個栗子

sales <- read.csv("例子1.csv")

ggplot(sales) +
  geom_point(aes(x = 食物銷量, y = 飲料銷量, size = 1)) +
  labs(
    title = "食物與飲料銷售量(含異常值)",
    x = "食物銷量",
    y = "飲料銷量"
  ) +
  theme_minimal()
sales <- read.csv("例子1.csv")

ggplot(sales) +
  geom_point(aes(x = 食物銷量, y = 飲料銷量, size = 1)) +
  labs(
    title = "食物與飲料銷售量(含異常值)",
    x = "食物銷量",
    y = "飲料銷量"
  ) +
  theme_minimal()

 什麼是「aesthetic」?

「aesthetic(美學特性)」是圖表中視覺表現的元素,例如:

  • 點的位置(x, y

  • 顏色(color / fill

  • 形狀(shape

  • 大小(size

屬性名稱 說明 適合的變數類型 效果
x、y 座標軸 數值或類別 點的位置
color 顏色線條、點、邊框 類別 / 數值 區分群組
fill 填滿顏色(如長條、箱型圖) 類別 補色、分類辨識
size 大小 數值 呈現量值多寡
shape 點的形狀 類別 區分類別(最多6~8種)
alpha 透明度 數值 消除重疊;高透明 = 淺色
ggplot(sales) +
  geom_point(aes(
    x = 食物銷量,
    y = 飲料銷量,
    color = 食物名稱,
    size = 飲料銷量
  )) +
  labs(title = "銷量與飲料關聯性") +
  theme_minimal()

aes

舉個栗子

sales <- read.csv("例子1.csv")

ggplot(sales) +
  geom_point(aes(x = 食物銷量, y = 飲料銷量, size = 1)) +
  labs(
    title = "食物與飲料銷售量(含異常值)",
    x = "食物銷量",
    y = "飲料銷量"
  ) +
  theme_minimal()

labs : ggplot2 中用來設定圖表標籤的函數例 : 設定圖表的座標軸標籤與標題

  • x 軸標籤顯示為「食物銷量」

  • y 軸標籤顯示為「飲料銷量」

  • 圖表標題是「食物與飲料銷售量相關性」

theme_minimal():套用簡潔風格

labs() 可以設定哪些內容?

參數名稱 說明
title 主標題(圖表上方的大標題)
subtitle 副標題(主標題下方的小字)
caption 圖表右下角的註解或資料來源說明
x x 軸標籤
y y 軸標籤
color、fill、shape 圖例(legend)中變數的說明文字
library(tibble)
data <- tibble(
  年齡 = c(58, 25, 19, 65, 35, 33, 32, 26, 65, 24, 61, 65,
         52, 23, 55, 45, 20, 19, 23, 31, 32, 50, 56, 19, 53,
         30, 63, 59, 62, 52),
  性別 = c("女", "男", "女", "女", "男", "男", "女", "女", "女", "男",
         "男", "女", "男", "男", "女", "男", "女", "女", "女", "男",
         "女", "男", "女", "男", "女", "女", "男", "男", "男", "男"),
  支出 = c(2224, 788, 125, 1567, 736, 725, 510, 430, 1693, 1179, 1267,
         1659, 1749, 292, 1563, 913, 764, 230, 500, 718, 681, 1652, 900, 
         639, 1343, 1123, 1438, 1275, 2036, 1022)
)

ggplot(data, aes(x = 年齡, y = 支出, color = 性別)) +
  geom_point() +
  labs(
    title = "年齡與支出之關係",
    subtitle = "依性別區分",
    x = "年齡(歲)",
    y = "每月支出(元)",
    color = "性別",
    caption = "資料來源:顧客問卷"
  )

ggplot2 的 圖形組成架構 —— 從最底層的資料(Data),一路往上建構到主題(Theme)

程式從上到下寫

練習

library(tibble)
DrinkSales <- tibble(
  飲料名稱 = c("奶茶", "綠茶", "紅茶", "美式", "拿鐵", "摩卡", "柳橙汁", "蘋果汁", "葡萄柚汁"),
  類別 = c("茶類", "茶類", "茶類", "咖啡", "咖啡", "咖啡", "果汁", "果汁", "果汁"),
  銷售量 = c(140, 120, 110, 210, 180, 160, 90, 80, 70)
)

你有一份早餐店的飲料銷售資料 DrinkSales,包含下列欄位:

請你使用 ggplot2呈現各類別中每種飲料的總銷售量並區分飲料類別的顏色

  • 使用長條圖畫出飲料名稱對應的總銷售量

  • x 軸為「飲料名稱」,y 軸為「銷售量」

  • 進行上色(讓不同類別顏色不同)

  • 使用 labs() 補上適當的標題與軸標籤

答案

library(ggplot2)

# 載入資料
DrinkSales <- read.csv("練習1.csv")

# 畫圖
ggplot(DrinkSales) +
  geom_col(aes(x = 飲料名稱, y = 銷售量, fill = 類別)) +
  labs(
    title = "不同類別飲料的銷售量比較",
    x = "飲料名稱",
    y = "總銷售量",
    fill = "飲料類別"
  ) +
  theme_minimal()

練習2

PlatformUsers <- tibble(
  平台 = rep(c("Instagram", "TikTok", "Threads"), each = 3),
  月份 = rep(as.Date(c("2024-01-01", "2024-02-01", "2024-03-01")), 3),
  用戶數 = c(2500000, 2600000, 2750000, 
             1800000, 2000000, 2200000, 
              900000, 1000000, 1100000)

你是一位資料分析師,正在比較不同社群平台的用戶數成長情形。你擁有 2024 年 1 月到 3 月的用戶數資料,如下:

請使用 ggplot2 製作一張折線圖,比較三個平台的成長趨勢:

  1. x 軸:月份(時間軸)

  2. y 軸:用戶數

  3. 折線顏色代表平台類別(使用 color = 平台

  scale_x_date(date_labels = "%b", date_breaks = "1 month")

這是 ggplot2 的座標縮放函數之一,適用於 x 軸是日期類型(Date)的情況。這裡我們使用它來調整時間軸的標籤格式與顯示頻率。

 

🔹                  這個參數控制「時間軸上要顯示什麼樣的文字」。

  • 會讓 x 軸上顯示:Jan、Feb、Mar(而不是 2024-01-01 這種完整日期)


 

 

 

 

 

🔹 

這個參數控制「時間軸上每隔多久顯示一個刻度」。

  • "1 month" 表示每個月顯示一次標籤

  • 你也可以設定:"2 weeks"(每兩週)、"1 year"(每年)

%Y 年份 如 2024
%m  數字月份 如 01、02
%d  日期 如 01、15
%b 月份的英文縮寫 如Jan Feb
date_labels = "%b"
date_breaks = "1 month"

答案

PlatformUsers <- tibble(
  平台 = rep(c("Instagram", "TikTok", "Threads"), each = 3),
  月份 = rep(as.Date(c("2024-01-01", "2024-02-01", "2024-03-01")), 3),
  用戶數 = c(2500000, 2600000, 2750000, 
             1800000, 2000000, 2200000, 
              900000, 1000000, 1100000)
)

ggplot(PlatformUsers) +
  geom_line(aes(x = 月份, y = 用戶數, color = 平台, group = 平台), linewidth = 1.2) +
  labs(
    title = "社群平台每月用戶成長趨勢",
    x = "月份",
    y = "用戶數"
  ) +
  scale_x_date(date_labels = "%b", date_breaks = "1 month") +
  theme_minimal()

再~舉個栗子

sales <- read.csv("例子2.csv")
ggplot(data = sales) +
  geom_bar(
    aes(x = 日別, y = 食物銷量, fill = 日別),
    stat = 'identity'
  ) +
  geom_line(
    aes(x = 日別, y = 食物銷量, group = 食物名, color = 食物名)
  ) +
  facet_wrap(~食物名) +
  labs(
    x = '日別',
    y = '飲料銷量',
    title = '食物與日別銷售圖'
  ) +
  theme(text = element_text(family = "LiHei Pro"))

長條圖+折線圖

再~舉個栗子

sales <- read.csv("例子2.csv")
ggplot(data = sales) +
  geom_bar(
    aes(x = 日別, y = 食物銷量, fill = 日別),
    stat = 'identity'
  ) +
  geom_line(
    aes(x = 日別, y = 食物銷量, group = 食物名, color = 食物名)
  ) +
  facet_wrap(~食物名) +
  labs(
    x = '日別',
    y = '飲料銷量',
    title = '食物與日別銷售圖'
  ) +
  theme(text = element_text(family = "LiHei Pro"))

-stat 控制幾何圖層的統計行為

geom_bar() 預設會做統計加總(例如「有幾筆資料」)但在這裡我們要呈現的是我們自己的數值(銷售量)

"identity":直接使用原始 y 值(例如金額、數量)

"count":計算每個類別有幾筆(預設值)

-分面圖(Faceting)

功能:根據某個變數(這裡是「食物名」),將資料分組後畫成多個小圖表,每個「小圖」就是一個「食物類別」的圖,所有圖使用相同的座標比例,便於比較

 

✅ 適用時機:

  • 當你有多個類別需要「橫向比較」時(例如:地區、年級、產品類別)想避免一張圖過於擁擠

facet_wrap(~食物名) +

多維資訊進階

-> 單一資訊呈現:

以基本的散佈圖為例,通常會呈現兩個變數的關係

  • X 軸:銷售量

  • Y 軸:價格

  • 資訊量有限,但適合看趨勢或基本相關性

-> 增加視覺元素(過渡說明):

圖中箭頭與「加入空間、顏色、大小、文字等要素」說明了視覺變數的擴充性

空間 : 以 X/Y 軸平均值劃分區域 

顏色 : 表示利潤分類

大小 : 表示銷售額或銷售量多寡 

文字 : 標註產品名稱 

🎯 多維資訊視覺化延伸:五種進階維度

維度類型 範例 對應 ggplot2 語法 功能說明
形狀 圓形、三角形、十字等 aes(shape = 類別) 適合分類變數、避免色盲誤讀
透明度  半透明 vs. 不透明 aes(alpha = 數值) 適合表現「信心水準」、「重要程度」等
分面  小圖表分區呈現 facet_wrap(~變數) 同時比較多組資料(如不同年份)
動畫  時間動畫 (滑動年齡) frame = 年份 (在 plotly 中) 動態顯示變化趨勢
交互操作 Hover、點擊、選取 plotly::ggplotly() 或 plot_ly() 使用者可自己探索資料細節

互動式資料視覺化

plotly

什麼是 Plotly?

Plotly 是一個可以在 R 或 Python 中使用的互動式資料視覺化工具套件

  • 它不僅支援靜態圖,也可以讓你:

    • 滑鼠移到圖上看到數值(hover tooltip)

    • 點擊圖例篩選分類

    • 放大、縮小、平移

  • 在 R 中使用的是 plotly 套件,能夠直接把 ggplot2 的圖「轉成互動版本」

✅ 為什麼要學 Plotly?

ggplot2 plotly
美學語法簡潔、邏輯清晰 互動功能強、可網頁嵌入
適合製作出版或報告圖表 適合展示在網站、報表、儀表板
無法互動(點、滑、篩選) 可互動點選、拖曳、hover 顯示

R語言(5)

By phoebe tsai

R語言(5)

  • 113