R: R 基础绘图
最后更新:2026-08-26
这一课开始 R 教程的"图形篇"——数据可视化。R 有两套绘图系统:基础 R(
plot/line/bar)和 ggplot2(ggplot + geom_)。这一课先学基础 R 绘图——简单快速,适合临时查看数据。
读完这一课你就能用 R 画 6 种基础图表:散点、折线、柱状、饼图、直方图、箱线。
1. 你将学到
- R 基础绘图系统(graphics 包)
- 6 种核心图表:plot/line/bar/pie/hist/boxplot
- par() 图形参数(颜色、字体、布局)
- layout() 多图布局
- 与 ggplot2 的差异(何时用哪个)
- 实战:销售数据多图报告
2. 一个销售可视化的故事
(1) 痛点:表格不够直观
Bob给manager展示 4 季度销售数据:
地区 Q1 Q2 Q3 Q4
北京 1000 1200 1100 1500
上海 1500 1800 1700 2000
广州 800 900 1000 1200
manager看了一眼说:"数字我不看,给我图"。
(2) R 的解法
# 1. 一行画折线图(4 城市季度趋势)
plot(sales, type = "b", col = rainbow(4), main = "季度销售趋势")
# 2. 一行画柱状图(4 城市总销售)
barplot(rowSums(sales[, -1]), main = "总销售对比", col = "skyblue")
# 3. 一行画饼图(占比)
pie(rowSums(sales[, -1]), labels = rownames(sales))
3 行代码 → 3 张图。基础 R 绘图就是这么快。
3. R 的两套绘图系统
(1) 对比
| 特性 | 基础 R(graphics) | ggplot2 |
|---|---|---|
| 速度 | 极快(10 行) | 较慢(几十行) |
| 易学性 | ✅ 简单 | ❌ 学习曲线陡 |
| 默认美观 | ❌ 简陋 | ✅ 出版级 |
| 灵活性 | ⚠️ 有限 | ✅ 极灵活 |
| 适合场景 | 快速看数据 | 发表/报告 |
| 底层语法 | "画在画布上" | Grammar of Graphics |
(2) 何时用哪个?
graph TB
A[想画图] --> B{场景}
B -->|快速看数据| C[基础 R plot]
B -->|发表/报告| D[ggplot2]
B -->|教学演示| E[两者都行]
style A fill:#fff3cd
style C fill:#d4edda
style D fill:#cce5ff
4. plot():万能图(散点图为主)
(1) 基础散点图
# 两列数据画散点图
x <- 1:10
y <- x ^ 2
plot(x, y)
(2) 常用参数
plot(x, y,
type = "p", # 图形类型
main = "标题",
xlab = "X 轴",
ylab = "Y 轴",
col = "blue", # 颜色
pch = 19, # 点形状(0-25)
cex = 1.5, # 点大小
xlim = c(0, 12), # X 轴范围
ylim = c(0, 110)) # Y 轴范围
(3) 6 种 type 类型
| type | 含义 | 用途 |
|---|---|---|
"p" |
点(默认) | 散点图 |
"l" |
线 | 折线图 |
"b" |
点 + 线 | 趋势图 |
"o" |
点穿过线 | 时间序列 |
"h" |
垂直线 | 柱状(线版) |
"s" |
阶梯 | 阶梯图 |
# 同一组数据的 6 种画法
x <- 1:5
y <- c(2, 4, 3, 5, 4)
par(mfrow = c(2, 3)) # 2 行 3 列布局
for (t in c("p", "l", "b", "o", "h", "s")) {
plot(x, y, type = t, main = paste("type =", t))
}
5. 6 种核心图表
(1) 散点图 plot()
# 4 城市散点图
x <- c(1, 2, 3, 4)
y <- c(1000, 1500, 800, 1200)
plot(x, y,
main = "城市销售散点图",
xlab = "城市编号",
ylab = "销售额",
col = "blue",
pch = 19)
(2) 折线图 plot(type = "l")
# 季度趋势图
quarters <- c("Q1", "Q2", "Q3", "Q4")
sales <- c(1000, 1200, 1100, 1500)
plot(quarters, sales,
type = "b", # 点 + 线
main = "Q1-Q4 销售趋势",
xlab = "季度",
ylab = "销售额",
col = "darkblue",
lwd = 2, # 线宽
pch = 19)
(3) 柱状图 barplot()
# 4 城市销售柱状图
sales_data <- c(北京 = 4800, 上海 = 7000, 广州 = 3900, 深圳 = 4500)
barplot(sales_data,
main = "各城市总销售",
xlab = "城市",
ylab = "销售额",
col = c("red", "blue", "green", "orange"),
border = "white",
horiz = FALSE) # TRUE 横向
(4) 饼图 pie()
# 销售占比饼图
sales_data <- c(北京 = 4800, 上海 = 7000, 广州 = 3900, 深圳 = 4500)
pie(sales_data,
main = "销售占比",
col = rainbow(4),
labels = paste0(names(sales_data), "\n", sales_data))
geom_bar() 替代 pie()。
(5) 直方图 hist()
# 1000 个随机数的分布
data <- rnorm(1000, mean = 100, sd = 15)
hist(data,
main = "正态分布",
xlab = "值",
ylab = "频次",
col = "lightblue",
border = "white",
breaks = 30) # 分 30 个区间
(6) 箱线图 boxplot()
# 4 班考试成绩分布
scores <- list(
1班 = c(85, 90, 78, 92, 88, 76, 95, 80),
2班 = c(72, 80, 85, 78, 90, 88, 82, 75),
3班 = c(95, 88, 92, 90, 85, 78, 80, 88),
4班 = c(60, 65, 70, 75, 80, 85, 90, 95)
)
boxplot(scores,
main = "4 班成绩分布",
xlab = "班级",
ylab = "分数",
col = c("red", "blue", "green", "orange"))
6. par() 图形参数
(1) par 速查表
| 参数 | 作用 | 示例 |
|---|---|---|
mfrow |
多图布局(行 × 列) | par(mfrow = c(2, 2)) |
mar |
边距(4 个数字) | par(mar = c(5, 4, 4, 2)) |
bg |
背景色 | par(bg = "lightyellow") |
col |
默认颜色 | par(col = "blue") |
cex |
默认文字大小 | par(cex = 1.2) |
lty |
线型 | par(lty = 2) 虚线 |
pch |
点形状 | par(pch = 19) |
(2) 多图布局
# 2x2 布局
par(mfrow = c(2, 2))
plot(1:10, main = "图 1")
plot(1:10, type = "l", main = "图 2")
barplot(1:5, main = "图 3")
pie(1:4, main = "图 4")
# 恢复默认布局
par(mfrow = c(1, 1))
(3) layout() 灵活布局
# 1 大 + 4 小 布局
layout(matrix(c(1, 1, 2, 3,
1, 1, 4, 5), nrow = 2, byrow = TRUE))
plot(1:10, main = "大图") # 1
plot(1:5, main = "小图 1") # 2
plot(1:5, main = "小图 2") # 3
plot(1:5, main = "小图 3") # 4
plot(1:5, main = "小图 4") # 5
layout(1) # 恢复
7. 颜色与点形状
(1) 颜色
# 1. 名称
plot(1:5, col = "red")
plot(1:5, col = "blue")
plot(1:5, col = "darkgreen")
# 2. 十六进制
plot(1:5, col = "#FF0000")
plot(1:5, col = "#3366CC")
# 3. rainbow() 调色板
barplot(1:7, col = rainbow(7))
barplot(1:7, col = heat.colors(7))
barplot(1:7, col = topo.colors(7))
barplot(1:7, col = terrain.colors(7))
(2) 点形状 pch
| pch | 形状 | 用途 |
|---|---|---|
| 0-6 | 空心 | 不同形状 |
| 19-25 | 实心 | 推荐(清晰) |
| 19 | 圆点 | 最常用 |
| 17 | 三角 | 强调 |
| 15 | 方块 | 二元 |
plot(1:25, pch = 0:25, cex = 2)
8. 与 ggplot2 的对比
(1) 同一图的两套写法
# 数据
df <- data.frame(x = 1:5, y = c(2, 4, 3, 5, 4))
# 基础 R(5 行)
plot(df$x, df$y, type = "b", main = "趋势", xlab = "X", ylab = "Y",
col = "blue", pch = 19, lwd = 2)
# ggplot2(6 行,**默认更美**)
library(ggplot2)
ggplot(df, aes(x = x, y = y)) +
geom_line(color = "blue") +
geom_point(color = "blue", size = 3) +
labs(title = "趋势", x = "X", y = "Y") +
theme_minimal()
(2) 何时选哪个?
| 场景 | 推荐 |
|---|---|
| 快速看数据 | 基础 R(1 行画图) |
| 发表/论文 | ggplot2(出版级美观) |
| 教学演示 | 基础 R(简单易懂) |
| 标准化报告 | ggplot2(统一主题) |
| 参数调优 | ggplot2(精细控制) |
9. 完整示例:销售数据多图报告
下面是一个完整工作流示例,把本课所有图表串起来。
▶ 示例:4 城市季度销售可视化
# ============================================
# 4 城市季度销售可视化
# 功能:6 种基础图表综合展示
# ============================================
# 1. Prepare data
sales <- matrix(c(
1000, 1200, 1100, 1500, # 北京
1500, 1800, 1700, 2000, # 上海
800, 900, 1000, 1200, # 广州
1200, 1400, 1300, 1600 # 深圳
), nrow = 4, byrow = TRUE)
rownames(sales) <- c("北京", "上海", "广州", "深圳")
colnames(sales) <- c("Q1", "Q2", "Q3", "Q4")
print(sales)
# 2. 设置 2x3 布局
par(mfrow = c(2, 3), mar = c(4, 4, 3, 1))
# 3. 图 1:折线趋势图(4 城市)
plot(1:4, sales[1, ], type = "b", col = "red", ylim = c(0, 2500),
main = "季度销售趋势", xlab = "季度", ylab = "销售额",
pch = 19, lwd = 2, xaxt = "n")
axis(1, at = 1:4, labels = colnames(sales))
for (i in 2:4) {
lines(1:4, sales[i, ], type = "b", col = i, pch = 19, lwd = 2)
}
legend("topleft", legend = rownames(sales),
col = 1:4, pch = 19, lwd = 2, cex = 0.7)
# 4. 图 2:柱状图(总销售)
barplot(rowSums(sales),
main = "各城市总销售",
xlab = "城市", ylab = "总销售额",
col = c("red", "blue", "green", "orange"),
border = "white")
# 5. 图 3:饼图(占比)
pie(rowSums(sales),
main = "销售占比",
col = rainbow(4),
labels = paste0(rownames(sales), "\n", rowSums(sales)))
# 6. 图 4:直方图(销售分布)
hist(sales, main = "销售额分布", xlab = "销售额",
col = "lightblue", border = "white", breaks = 10)
# 7. 图 5:箱线图(按城市分布)
boxplot(sales, main = "各城市季度销售分布",
xlab = "城市", ylab = "销售额",
col = c("red", "blue", "green", "orange"))
# 8. 图 6:堆叠柱状图
barplot(sales, beside = FALSE, # beside=FALSE 堆叠
main = "季度销售堆叠图",
xlab = "城市", ylab = "销售额",
col = c("red", "blue", "green", "orange"),
legend.text = colnames(sales))
# 9. 恢复布局
par(mfrow = c(1, 1))
预期输出:6 张图(折线 / 柱状 / 饼图 / 直方图 / 箱线 / 堆叠柱状)排成 2x3 网格。
❓ 常见问题
png() / pdf() / jpeg() 等:png("myplot.png", width = 800, height = 600)
plot(1:10)
dev.off()
par(family = "PingFang SC")(macOS)或 family = "SimHei"(Windows)。Linux 用 family = "WenQuanYi Zen Hei"。ggplot2 用 theme(text = element_text(family = ...))。par(mfrow = c(行, 列)) 平均分 ② layout(matrix(...)) 灵活布局 ③ ggplot2 用 facet_wrap() 分面(更强大)。col lwd pch cex 几十个参数要一个个调。ggplot2 用 theme() 统一样式更高效。📖 小节
- R 有两套绘图系统:基础 R(graphics)和 ggplot2
- 基础 R 6 种核心图:plot 散点 / plot type="l" 折线 / barplot 柱状 / pie 饼图 / hist 直方图 / boxplot 箱线
par()设置全局参数:mfrow多图 /mar边距 /bg背景 /col颜色 /pch点形layout()灵活布局(1 大 + 4 小)- 颜色用
"red"/"#FF0000"/rainbow(n) - 保存图用
png()+dev.off()或ggsave() - 基础 R 适合快速看数据,ggplot2 适合发表——两者都学,按需选
📝 作业
-
基础题:构造 1 个向量
sales <- c(100, 150, 200, 180, 220),分别用type = "p","l","b","h"画 4 张图(用par(mfrow = c(2, 2))),验证 4 种图形差异。 -
基础题:用
barplot()画 5 个城市(自定义名字)的销售对比图,加上col = rainbow(5)、main、xlab、ylab4 个参数。 -
基础题:用
hist()画 1000 个rnorm(100, 15)随机数的直方图,加breaks = 30col = "lightblue"参数,验证分布近似正态。 -
进阶题:模拟 4 个班级 × 10 个学生的成绩(用
list()或data.frame),用boxplot()画 4 班成绩分布图,加上颜色和标题。 -
挑战题:完整工作流——模拟 4 季度 4 产品销售矩阵,用
par(mfrow = c(2, 3))画 6 张图:① 折线趋势 ② 柱状对比 ③ 饼图占比 ④ 直方图分布 ⑤ 箱线分布 ⑥ 堆叠柱状。最后png("report.png", 1200, 800)保存为一张大图。