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 製作一張折線圖,比較三個平台的成長趨勢:
-
x 軸:月份(時間軸)
-
y 軸:用戶數
-
折線顏色代表平台類別(使用
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