R: R 基础绘图

最后更新:2026-08-26

这一课开始 R 教程的"图形篇"——数据可视化。R 有两套绘图系统:基础 R(plot/line/bar)和 ggplot2(ggplot + geom_)。这一课先学基础 R 绘图——简单快速,适合临时查看数据。

读完这一课你就能用 R 画 6 种基础图表:散点、折线、柱状、饼图、直方图、箱线。

1. 你将学到



2. 一个销售可视化的故事

(1) 痛点:表格不够直观

Bob给manager展示 4 季度销售数据:

TEXT 📖 仅展示
地区    Q1    Q2    Q3    Q4
北京  1000  1200  1100  1500
上海  1500  1800  1700  2000
广州   800   900  1000  1200

manager看了一眼说:"数字我不看,给我"。

(2) R 的解法

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) 何时用哪个?

100%
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
💡 提示临时看数据用基础 R(快),出报告/写论文用 ggplot2(美)。本课学基础 R,下一课学 ggplot2。



4. plot():万能图(散点图为主)

(1) 基础散点图

R
# 两列数据画散点图
x <- 1:10
y <- x ^ 2
plot(x, y)

(2) 常用参数

R
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" 阶梯 阶梯图
R
# 同一组数据的 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()

R
# 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")

R
# 季度趋势图
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()

R
# 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()

R
# 销售占比饼图
sales_data <- c(北京 = 4800, 上海 = 7000, 广州 = 3900, 深圳 = 4500)

pie(sales_data,
    main = "销售占比",
    col = rainbow(4),
    labels = paste0(names(sales_data), "\n", sales_data))
⚠️ 注意饼图不推荐用——人眼对角度不敏感,柱状图更准确。ggplot2 作者也建议用 geom_bar() 替代 pie()

(5) 直方图 hist()

R
# 1000 个随机数的分布
data <- rnorm(1000, mean = 100, sd = 15)

hist(data,
     main = "正态分布",
     xlab = "值",
     ylab = "频次",
     col = "lightblue",
     border = "white",
     breaks = 30)  # 分 30 个区间

(6) 箱线图 boxplot()

R
# 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) 多图布局

R
# 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() 灵活布局

R
# 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) 颜色

R
# 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 方块 二元
R
plot(1:25, pch = 0:25, cex = 2)


8. 与 ggplot2 的对比

(1) 同一图的两套写法

R
# 数据
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 城市季度销售可视化

R
# ============================================
# 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 网格。


❓ 常见问题

Q 怎么保存图到文件?
Apng() / pdf() / jpeg() 等:
R
png("myplot.png", width = 800, height = 600)
plot(1:10)
dev.off()
Q 图中文乱码怎么办?
Apar(family = "PingFang SC")(macOS)或 family = "SimHei"(Windows)。Linux 用 family = "WenQuanYi Zen Hei"。ggplot2 用 theme(text = element_text(family = ...))
Q 怎么画多图布局?
Apar(mfrow = c(行, 列)) 平均分 ② layout(matrix(...)) 灵活布局 ③ ggplot2 用 facet_wrap() 分面(更强大)。
Q 基础 R 画的图能改样式吗?
A 能但繁琐——col lwd pch cex 几十个参数要一个个调。ggplot2 用 theme() 统一样式更高效。

📖 小节


📝 作业

  1. 基础题:构造 1 个向量 sales <- c(100, 150, 200, 180, 220),分别用 type = "p", "l", "b", "h" 画 4 张图(用 par(mfrow = c(2, 2))),验证 4 种图形差异。

  2. 基础题:用 barplot() 画 5 个城市(自定义名字)的销售对比图,加上 col = rainbow(5)mainxlabylab 4 个参数。

  3. 基础题:用 hist() 画 1000 个 rnorm(100, 15) 随机数的直方图,加 breaks = 30 col = "lightblue" 参数,验证分布近似正态。

  4. 进阶题:模拟 4 个班级 × 10 个学生的成绩(用 list()data.frame),用 boxplot() 画 4 班成绩分布图,加上颜色和标题。

  5. 挑战题:完整工作流——模拟 4 季度 4 产品销售矩阵,用 par(mfrow = c(2, 3)) 画 6 张图:① 折线趋势 ② 柱状对比 ③ 饼图占比 ④ 直方图分布 ⑤ 箱线分布 ⑥ 堆叠柱状。最后 png("report.png", 1200, 800) 保存为一张大图。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏