R语言入门学习教程,从入门到精通,R语言传统绘图系统 - 完整知识点与案例代码(2)

R语言传统绘图系统 - 完整知识点与案例代码

2.1 常用的绘图函数

2.1.1 高级绘图函数

高级绘图函数会直接创建新的图形或覆盖当前图形

r 复制代码
# 高级绘图函数概览

# 1. plot() - 最通用的绘图函数
# 2. hist() - 直方图
# 3. barplot() - 条形图
# 4. boxplot() - 箱线图
# 5. pie() - 饼图
# 6. dotchart() - 点图
# 7. curve() - 函数曲线图

# 示例1:plot()函数 - 散点图
# 准备数据
x <- 1:20                                    # x轴数据:1到20
y <- x^2                                     # y轴数据:x的平方

# 创建散点图
plot(x, y,                                   # x和y数据
     main = "散点图示例",                     # 图形主标题
     xlab = "X轴变量",                        # x轴标签
     ylab = "Y轴变量")                        # y轴标签

# 示例2:hist()函数 - 直方图
# 生成1000个正态分布随机数
set.seed(123)                                # 设置随机种子,确保结果可重复
data_normal <- rnorm(1000, mean = 50, sd = 10)  # 生成1000个均值50、标准差10的正态分布数据

# 创建直方图
hist(data_normal,                            # 数据
     breaks = 20,                            # 组数(分20个区间)
     main = "正态分布直方图",                 # 标题
     xlab = "数值",                          # x轴标签
     ylab = "频数",                          # y轴标签
     col = "lightblue",                      # 填充颜色
     border = "darkblue")                    # 边框颜色

# 示例3:barplot()函数 - 条形图
# 准备数据:各类水果销量
sales <- c(苹果 = 35, 香蕉 = 45, 橙子 = 28, 葡萄 = 52, 西瓜 = 40)

# 创建条形图
barplot(sales,                               # 数据向量
        main = "水果销量统计",                # 标题
        xlab = "水果种类",                    # x轴标签
        ylab = "销量(公斤)",                # y轴标签
        col = c("red", "yellow", "orange", "purple", "green"),  # 不同颜色
        ylim = c(0, 60),                     # y轴范围0-60
        las = 1)                             # 坐标轴标签方向:1表示水平

# 示例4:boxplot()函数 - 箱线图
# 准备分组数据
group1 <- rnorm(50, mean = 10, sd = 2)       # 第1组:均值10
group2 <- rnorm(50, mean = 12, sd = 2)       # 第2组:均值12
group3 <- rnorm(50, mean = 15, sd = 3)       # 第3组:均值15

# 创建箱线图
boxplot(group1, group2, group3,              # 多个组的数据
        names = c("组A", "组B", "组C"),       # 各组名称
        main = "三组数据对比",                # 标题
        ylab = "数值",                       # y轴标签
        col = c("lightgreen", "lightyellow", "lightpink"),  # 填充颜色
        notch = TRUE,                        # 显示凹槽(用于比较中位数)
        outline = TRUE)                      # 显示异常值

# 示例5:pie()函数 - 饼图
# 准备市场份额数据
market_share <- c(35, 28, 22, 15)
labels <- c("产品A", "产品B", "产品C", "产品D")

# 创建饼图
pie(market_share,                           # 数据
    labels = paste0(labels, " (", market_share, "%)"),  # 标签:产品名+百分比
    main = "市场份额分布",                    # 标题
    col = rainbow(4),                       # 彩虹色
    init.angle = 90)                        # 起始角度90度

# 示例6:dotchart()函数 - 点图
# 准备数据
scores <- c(85, 92, 78, 88, 95, 76, 89, 91, 84, 87)
names(scores) <- paste0("学生", 1:10)

# 创建点图
dotchart(scores,                            # 数据
         main = "学生成绩点图",              # 标题
         xlab = "分数",                     # x轴标签
         color = "blue",                    # 点的颜色
         pch = 16,                          # 点的形状(16为实心圆)
         cex = 1.2)                         # 点的大小缩放因子

# 示例7:curve()函数 - 绘制函数曲线
# 绘制数学函数曲线
curve(sin(x),                               # 函数表达式
      from = -2*pi,                         # x轴下限
      to = 2*pi,                            # x轴上限
      main = "正弦函数曲线",                 # 标题
      xlab = "x",                           # x轴标签
      ylab = "sin(x)",                      # y轴标签
      col = "red",                          # 曲线颜色
      lwd = 2,                              # 线宽
      lty = 1)                              # 线型(1为实线)

# 在同一图形上添加余弦曲线
curve(cos(x),                               # 添加余弦函数
      from = -2*pi, 
      to = 2*pi, 
      add = TRUE,                           # 添加到现有图形
      col = "blue", 
      lwd = 2, 
      lty = 2)                              # 线型2为虚线

# 添加图例
legend("topright",                          # 图例位置
       legend = c("sin(x)", "cos(x)"),      # 图例文本
       col = c("red", "blue"),              # 颜色
       lty = c(1, 2),                       # 线型
       lwd = 2,                             # 线宽
       cex = 0.8)                           # 字体大小

2.1.2 低级绘图函数

低级绘图函数在现有图形上添加元素,不创建新图形

r 复制代码
# 低级绘图函数分类

# 1. 添加点、线、文本
# points() - 添加点
# lines() - 添加线
# abline() - 添加直线
# text() - 添加文本
# mtext() - 添加边缘文本

# 2. 添加图例、标注
# legend() - 添加图例
# title() - 添加标题
# axis() - 添加坐标轴

# 3. 添加图形元素
# rect() - 添加矩形
# polygon() - 添加多边形
# arrows() - 添加箭头
# segments() - 添加线段

# 完整示例:逐步构建复杂图形

# 步骤1:创建基础散点图
set.seed(456)                                # 设置随机种子
x <- 1:50                                    # x数据:1到50
y <- 20 + 3*x + rnorm(50, mean = 0, sd = 15) # y数据:线性关系+噪声

# 创建空图形(设置type="n")
plot(x, y,                                   # 数据
     type = "n",                             # 不绘制点,只创建绘图区域
     main = "回归分析示例",                   # 主标题
     xlab = "自变量 X",                      # x轴标签
     ylab = "因变量 Y",                      # y轴标签
     xlim = c(0, 55),                        # x轴范围
     ylim = c(0, 200))                       # y轴范围

# 步骤2:添加数据点(使用points)
points(x, y,                                 # 添加点
       col = "darkblue",                     # 点颜色
       pch = 19,                             # 点的形状(19为实心圆)
       cex = 1.2)                            # 点的大小

# 步骤3:添加回归线(使用lines)
# 计算线性回归
lm_model <- lm(y ~ x)                        # 线性回归模型
# 预测值
y_pred <- predict(lm_model)                  # 根据模型预测y值
# 添加回归线
lines(x, y_pred,                             # x和预测值
      col = "red",                           # 线颜色
      lwd = 2,                               # 线宽
      lty = 1)                               # 线型

# 步骤4:添加辅助线(使用abline)
abline(h = mean(y),                          # 添加水平线(y=均值)
       col = "gray",                         # 灰色
       lty = 2,                              # 虚线
       lwd = 1)                              # 线宽
abline(v = mean(x),                          # 添加垂直线(x=均值)
       col = "gray", 
       lty = 2)

# 步骤5:添加文本标注(使用text)
# 找出最远的点
max_resid_idx <- which.max(abs(residuals(lm_model)))  # 残差最大的点
text(x[max_resid_idx], y[max_resid_idx], 
     labels = "异常点",                      # 文本内容
     pos = 4,                               # 位置(1下,2左,3上,4右)
     col = "red", 
     cex = 0.9)

# 添加回归方程文本
equation_text <- sprintf("y = %.2f + %.2fx", 
                         coef(lm_model)[1], coef(lm_model)[2])
text(x = 5, y = 180,                        # 文本位置
     labels = equation_text, 
     col = "darkgreen", 
     cex = 1.0, 
     font = 2)                              # 粗体

# 步骤6:添加图例(使用legend)
legend("topleft",                           # 图例位置
       legend = c("观测数据", "回归线", "均值线"),  # 图例标签
       col = c("darkblue", "red", "gray"),  # 颜色
       pch = c(19, NA, NA),                 # 点的形状(NA表示无线条)
       lty = c(NA, 1, 2),                   # 线型(NA表示无点)
       lwd = c(NA, 2, 1),                  # 线宽
       cex = 0.8)                           # 字体大小

# 步骤7:添加箭头(使用arrows)
arrows(x0 = 30, y0 = 150,                   # 起点坐标
       x1 = 35, y1 = 130,                   # 终点坐标
       length = 0.1,                        # 箭头长度
       angle = 30,                          # 箭头角度
       col = "purple", 
       lwd = 1.5)
text(30, 155, "趋势方向", col = "purple", cex = 0.8)

# 步骤8:添加矩形框(使用rect)
rect(xleft = 40, ybottom = 20,              # 矩形左下角坐标
     xright = 50, ytop = 60,                # 矩形右上角坐标
     border = "orange",                     # 边框颜色
     lty = 2,                               # 虚线边框
     col = rgb(1, 0.5, 0, 0.1))             # 半透明填充
text(45, 40, "关注区域", col = "orange", cex = 0.8)

# 步骤9:添加多边形(使用polygon)
# 绘制置信区间带
ci_lower <- y_pred - 1.96 * summary(lm_model)$sigma  # 95%置信下限
ci_upper <- y_pred + 1.96 * summary(lm_model)$sigma  # 95%置信上限
polygon(c(x, rev(x)),                       # x坐标(正向+反向)
        c(ci_lower, rev(ci_upper)),         # y坐标
        col = rgb(0.8, 0.8, 0.8, 0.5),      # 半透明灰色
        border = NA)                        # 无边框

# 步骤10:添加边缘文本(使用mtext)
mtext("数据来源:模拟数据",                  # 边缘文本
      side = 1,                             # 1=底部,2=左侧,3=顶部,4=右侧
      line = 3,                             # 距离轴的行数
      cex = 0.7)                            # 字体大小

# 低级函数专项示例

# 示例1:segments() - 添加线段
plot(1:10, 1:10, type = "n", main = "线段示例")
segments(x0 = c(2, 4, 6), y0 = c(2, 4, 6),  # 起点
         x1 = c(8, 6, 4), y1 = c(8, 6, 4),  # 终点
         col = c("red", "blue", "green"), 
         lwd = 2)

# 示例2:polygon() - 绘制多边形
plot(1:10, 1:10, type = "n", main = "多边形示例")
# 绘制五边形
theta <- seq(0, 2*pi, length.out = 6)       # 角度序列
x_poly <- 5 + 3*cos(theta)                  # x坐标
y_poly <- 5 + 3*sin(theta)                  # y坐标
polygon(x_poly, y_poly, 
        col = "lightblue", 
        border = "darkblue", 
        lwd = 2, 
        density = 10)                       # 阴影线密度

# 示例3:arrows() - 箭头示例
plot(1:10, 1:10, type = "n", main = "箭头示例")
arrows(x0 = 2, y0 = 2, x1 = 8, y1 = 8, 
       length = 0.2, angle = 30, 
       col = "red", lwd = 3)
arrows(x0 = 8, y0 = 2, x1 = 2, y1 = 8, 
       length = 0.15, angle = 45, 
       col = "blue", lwd = 2, code = 3)     # code=3表示两端箭头

# 示例4:rug() - 添加轴须线
hist(rnorm(100), main = "带轴须线的直方图")
rug(rnorm(100),                            # 添加轴须线
    col = "red", 
    side = 1,                              # 1=底部,2=左侧,3=顶部,4=右侧
    ticksize = 0.05)                       # 刻度线大小

2.2 图形参数控制

2.2.1 图形控制参数

r 复制代码
# par()函数 - 设置或查询图形参数
# par()的参数会一直生效,直到修改或关闭图形设备

# 查看当前图形参数设置
current_par <- par()                        # 获取所有图形参数
par("col")                                  # 查看特定参数(颜色)
par("lty")                                  # 查看线型

# 常用的图形参数

# 1. 点控制参数
# pch: 点的形状(0-25之间的整数)
plot(1:10, 1:10, type = "n", main = "点的形状演示")
shapes <- 0:25
for(i in 1:26) {
  points(1:10, rep(i, 10),                 # 在对应y位置
         pch = shapes[i],                   # 点的形状
         col = "blue", 
         cex = 1.5)
}
text(rep(11, 26), 1:26, labels = shapes, adj = 0)  # 标注形状编号

# 2. 线控制参数
# lty: 线型(0=空白,1=实线,2=虚线,3=点线,4=点划线,5=长虚线,6=双虚线)
plot(1:10, 1:10, type = "n", main = "线型演示")
for(i in 1:6) {
  lines(c(1, 10), c(i, i),                 # 水平线
        lty = i,                           # 线型
        lwd = 2,                           # 线宽
        col = i+1)                         # 颜色
}
legend("topright", legend = paste("lty =", 1:6), 
       lty = 1:6, lwd = 2, col = 2:7)

# 3. 文字控制参数
# cex: 文字大小缩放因子(默认1)
# font: 字体样式(1=常规,2=粗体,3=斜体,4=粗斜体)
plot(1:10, 1:10, type = "n", main = "文字样式演示")
text(5, 9, "正常文字", cex = 1, font = 1)
text(5, 8, "粗体文字", cex = 1.2, font = 2, col = "red")
text(5, 7, "斜体文字", cex = 1.2, font = 3, col = "blue")
text(5, 6, "粗斜体文字", cex = 1.2, font = 4, col = "darkgreen")
text(5, 5, "放大文字", cex = 1.5, font = 2, col = "purple")

# 4. 坐标轴控制参数
# las: 坐标轴标签方向(0=平行轴,1=水平,2=垂直轴,3=垂直)
par(mfrow = c(2, 2))                        # 2x2布局
for(i in 0:3) {
  plot(1:10, 1:10, main = paste("las =", i), 
       las = i, type = "n")
  text(5, 5, paste("las =", i), cex = 1.5)
}
par(mfrow = c(1, 1))                        # 恢复单图布局

# 5. 边距控制参数
# mar: 边距(下,左,上,右),单位:线条数
# mai: 边距(下,左,上,右),单位:英寸
par(mar = c(5, 4, 4, 2) + 0.1)              # 默认边距
plot(1:10, 1:10, main = "默认边距")

# 调整边距示例
par(mar = c(2, 2, 2, 2))                   # 减小边距
plot(1:10, 1:10, main = "减小边距")
text(5, 5, "边距变小了", cex = 1.2)

par(mar = c(8, 6, 5, 4))                   # 增大边距
plot(1:10, 1:10, main = "增大边距(底部有空间)")
mtext("底部文字", side = 1, line = 5, cex = 1.2)
mtext("左侧文字", side = 2, line = 4, cex = 1.2)
mtext("顶部文字", side = 3, line = 3, cex = 1.2)

# 恢复默认边距
par(mar = c(5, 4, 4, 2) + 0.1)

# 6. 图形背景控制
# bg: 背景色
# fg: 前景色(坐标轴、边框颜色)
par(bg = "lightyellow", fg = "darkblue")   # 设置背景和前景色
plot(1:10, 1:10, main = "自定义背景色")
par(bg = "white", fg = "black")            # 恢复默认

# 7. 多重图形控制
# mfrow: 按行填充的图形矩阵(nfrow, nfcol)
# mfcol: 按列填充的图形矩阵

par(mfrow = c(2, 3))                       # 2行3列,按行填充
for(i in 1:6) {
  plot(rnorm(50), main = paste("图", i))
}

par(mfrow = c(1, 1))                       # 恢复单图

# 8. 保存和恢复图形参数
old_par <- par(no.readonly = TRUE)          # 保存当前所有可修改参数
par(mfrow = c(2, 2), mar = c(3, 3, 3, 3))  # 临时修改
plot(1:10, 1:10)
plot(rnorm(100))
par(old_par)                                # 恢复原参数

2.2.2 颜色控制

r 复制代码
# R语言中的颜色控制

# 1. 颜色名称(657种内置颜色)
colors()                                    # 查看所有颜色名称
# 常用颜色:red, blue, green, yellow, black, white, gray, purple, orange, pink

# 示例:使用颜色名称
plot(1:10, 1:10, type = "n", main = "颜色名称示例")
points(1:5, 1:5, col = "red", pch = 19, cex = 2)
points(6:10, 6:10, col = "darkblue", pch = 17, cex = 2)

# 2. RGB颜色(红绿蓝,0-255或0-1)
# rgb(red, green, blue, alpha, maxColorValue)
color_rgb <- rgb(255, 100, 50, maxColorValue = 255)  # 橙色
color_rgb_alpha <- rgb(255, 0, 0, alpha = 128, maxColorValue = 255)  # 半透明红

plot(1:10, 1:10, type = "n", main = "RGB颜色示例")
rect(1, 1, 5, 5, col = color_rgb, border = NA)
rect(6, 6, 10, 10, col = color_rgb_alpha, border = NA)
text(3, 3, "RGB", col = "white", cex = 1.5)
text(8, 8, "半透明", col = "black", cex = 1.5)

# 3. HSV颜色(色调、饱和度、明度)
# hsv(hue, saturation, value)
# hue: 0-1(0=红,0.33=绿,0.67=蓝)
color_hsv <- hsv(h = 0.5, s = 0.8, v = 0.9)  # 青绿色

# 创建HSV渐变色
hue_values <- seq(0, 1, length.out = 20)     # 色调序列
colors_hsv <- hsv(h = hue_values, s = 1, v = 1)  # 彩虹色

# 绘制HSV色环
pie(rep(1, 20), col = colors_hsv, 
    main = "HSV颜色环", 
    clockwise = TRUE, 
    init.angle = 90)

# 4. 颜色索引(1-8为基本色,1=black,2=red,3=green,4=blue,5=cyan,6=magenta,7=yellow,8=gray)
plot(1:8, 1:8, col = 1:8, pch = 19, cex = 3,
     main = "颜色索引1-8", xlab = "索引", ylab = "")
text(1:8, 1:8 - 0.5, labels = 1:8)

# 5. 调色板函数
# rainbow() - 彩虹色
# heat.colors() - 热图色
# terrain.colors() - 地形色
# topo.colors() - 拓扑色
# cm.colors() - 青-品红色

# 示例:不同调色板对比
par(mfrow = c(2, 3))                        # 2行3列布局

# 彩虹色
barplot(rep(1, 10), col = rainbow(10), 
        main = "rainbow()", axes = FALSE)

# 热图色
barplot(rep(1, 10), col = heat.colors(10), 
        main = "heat.colors()", axes = FALSE)

# 地形色
barplot(rep(1, 10), col = terrain.colors(10), 
        main = "terrain.colors()", axes = FALSE)

# 拓扑色
barplot(rep(1, 10), col = topo.colors(10), 
        main = "topo.colors()", axes = FALSE)

# 青-品红色
barplot(rep(1, 10), col = cm.colors(10), 
        main = "cm.colors()", axes = FALSE)

# 灰度色
barplot(rep(1, 10), col = gray(seq(0, 1, length.out = 10)), 
        main = "gray()", axes = FALSE)

par(mfrow = c(1, 1))

# 6. 颜色透明度
# 使用rgb()或adjustcolor()设置透明度
set.seed(789)
x <- rnorm(200)
y <- rnorm(200)

# 无透明度
plot(x, y, pch = 19, col = "blue", 
     main = "无透明度", cex = 1.5)

# 有透明度
plot(x, y, pch = 19, 
     col = rgb(0, 0, 1, alpha = 0.3),       # 半透明蓝色
     main = "透明度0.3", cex = 1.5)

# 使用adjustcolor()
plot(x, y, pch = 19, 
     col = adjustcolor("red", alpha.f = 0.2),  # 20%不透明度
     main = "adjustcolor()示例", cex = 1.5)

# 7. 颜色搭配示例:散点图颜色映射
# 根据数值大小设置颜色
set.seed(999)
x <- 1:100
y <- 2*x + rnorm(100, 0, 30)
z <- y / max(y)                             # 归一化到0-1

# 创建颜色梯度
color_palette <- colorRampPalette(c("blue", "green", "red"))(100)
colors_mapped <- color_palette[rank(z)]     # 根据z值排名映射颜色

plot(x, y, 
     col = colors_mapped, 
     pch = 19, 
     cex = 1.2,
     main = "颜色映射示例(蓝-绿-红渐变)",
     xlab = "X", 
     ylab = "Y")

# 添加颜色条
color_bar <- matrix(1:100, nrow = 1)
image(1:100, 1, color_bar, 
      col = color_palette, 
      add = TRUE, 
      xpd = NA,                            # 允许在绘图区域外绘制
      xlim = c(80, 100), 
      ylim = c(min(y)-20, min(y)-5))

# 8. RColorBrewer包(需要安装)
# install.packages("RColorBrewer")
library(RColorBrewer)

# 查看所有调色板
display.brewer.all()                        # 显示所有调色板

# 使用顺序调色板
colors_seq <- brewer.pal(9, "Blues")        # 蓝色系
barplot(rep(1, 9), col = colors_seq, 
        main = "RColorBrewer - Blues调色板")

# 使用发散调色板
colors_div <- brewer.pal(11, "RdBu")        # 红-蓝发散色
barplot(rep(1, 11), col = colors_div, 
        main = "RColorBrewer - RdBu调色板")

# 使用分类调色板
colors_qual <- brewer.pal(8, "Set2")        # 分类色
barplot(rep(1, 8), col = colors_qual, 
        main = "RColorBrewer - Set2调色板")

2.2.3 页面布局

r 复制代码
# 页面布局控制

# 1. par(mfrow) 和 par(mfcol) - 简单分割
par(mfrow = c(2, 2))                        # 2行2列,按行填充

# 绘制4个子图
plot(rnorm(100), main = "图1: 随机数")
hist(rnorm(100), main = "图2: 直方图")
boxplot(rnorm(100), main = "图3: 箱线图")
barplot(1:5, main = "图4: 条形图")

par(mfrow = c(1, 1))                        # 恢复

# 2. layout()函数 - 更灵活的分割
# layout(mat, widths, heights)

# 示例1:简单2x2布局
layout_matrix1 <- matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE)
layout(layout_matrix1)
# 绘制图形
plot(1:10, main = "图形1")
hist(rnorm(100), main = "图形2")
boxplot(rnorm(100), main = "图形3")
barplot(1:5, main = "图形4")

# 示例2:不等宽布局
layout_matrix2 <- matrix(c(1, 1, 2, 3), nrow = 2, byrow = TRUE)
#      [,1] [,2] [,3]
# [1,]    1    1    2
# [2,]    3    3    3
layout(layout_matrix2, 
       widths = c(1, 1, 1),                # 列宽比例
       heights = c(1, 2))                  # 行高比例

plot(1:10, main = "图形1(占右上角)")
plot(rnorm(100), main = "图形2(占右上)")
hist(rnorm(100), main = "图形3(占底部整行)")

# 示例3:复杂布局 - 热图+边距图
# 创建布局矩阵
# 主图在中间,右侧和底部留出空间放边距图
layout_matrix3 <- matrix(c(2, 0, 1, 3), nrow = 2, byrow = TRUE)
# [1,] 2 0
# [2,] 1 3
layout(layout_matrix3, 
       widths = c(4, 1),                   # 主图列宽4,边距列宽1
       heights = c(1, 4))                  # 顶部行高1,主图行高4

# 布局说明:
# 1: 主图(左下)
# 2: 顶部边距图
# 3: 右侧边距图
# 0: 空白区域

# 生成数据
set.seed(123)
data_matrix <- matrix(rnorm(100), nrow = 10)
rownames(data_matrix) <- paste0("行", 1:10)
colnames(data_matrix) <- paste0("列", 1:10)

# 主图:热图
par(mar = c(4, 4, 2, 1))                  # 设置边距
image(1:10, 1:10, data_matrix, 
      col = heat.colors(20), 
      xlab = "列", ylab = "行", 
      main = "热图主图")
# 添加文本
for(i in 1:10) {
  for(j in 1:10) {
    text(i, j, round(data_matrix[i, j], 2), cex = 0.7)
  }
}

# 顶部图:行均值
par(mar = c(0, 4, 2, 1))                  # 顶部边距小
row_means <- rowMeans(data_matrix)
barplot(row_means, horiz = FALSE, 
        col = "lightblue", 
        main = "行均值", 
        axes = TRUE, 
        ylim = c(-2, 2))

# 右侧图:列均值
par(mar = c(4, 0, 2, 1))                  # 右侧边距小
col_means <- colMeans(data_matrix)
barplot(col_means, horiz = TRUE, 
        col = "lightgreen", 
        main = "列均值", 
        axes = TRUE, 
        xlim = c(-2, 2))

# 重置布局
layout(1)

# 示例4:使用layout.show()查看布局
layout_matrix4 <- matrix(c(1, 2, 3, 4, 5, 5), nrow = 3, byrow = TRUE)
# [1,] 1 2
# [2,] 3 4
# [3,] 5 5
layout(layout_matrix4, 
       widths = c(1, 1), 
       heights = c(1, 1, 1.5))
layout.show(5)                             # 显示布局示意图

# 示例5:嵌套布局 - 复杂图形组合
# 先创建外层布局
outer_layout <- matrix(c(1, 1, 2, 2, 3, 4), nrow = 3, byrow = TRUE)
# [1,] 1 1
# [2,] 2 2
# [3,] 3 4
layout(outer_layout, heights = c(1, 1, 2))

# 图形1:标题图形
par(mar = c(0, 0, 0, 0))
plot(1, 1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(1, 1, "数据可视化报告\n2024年度", 
     cex = 2, font = 2, col = "darkblue")

# 图形2:数据概览
par(mar = c(4, 4, 2, 2))
data_overview <- rnorm(200, mean = 50, sd = 10)
hist(data_overview, col = "lightblue", 
     main = "数据分布概览", 
     xlab = "数值", ylab = "频数")

# 图形3:箱线图
boxplot(data_overview, 
        main = "数据箱线图", 
        ylab = "数值", 
        col = "lightgreen")

# 图形4:密度图
plot(density(data_overview), 
     main = "核密度估计", 
     xlab = "数值", 
     ylab = "密度", 
     col = "red", 
     lwd = 2)
polygon(density(data_overview), 
        col = rgb(1, 0, 0, 0.3), 
        border = NA)

# 重置布局
layout(1)

# 3. split.screen() - 交互式分割
# 创建分割屏幕
split.screen(fig = matrix(c(0, 0.5, 0, 1,      # 左半屏
                             0.5, 1, 0, 0.5,    # 右上
                             0.5, 1, 0.5, 1),   # 右下
                           nrow = 3, byrow = TRUE))

screen(1)                                    # 切换到屏幕1
plot(1:10, 1:10, main = "左半屏")

screen(2)                                    # 切换到屏幕2
hist(rnorm(100), main = "右上")

screen(3)                                    # 切换到屏幕3
boxplot(rnorm(100), main = "右下")

close.screen(all.screens = TRUE)             # 关闭所有分割屏幕

2.3 同时打开多个绘图窗口

r 复制代码
# 多绘图窗口管理

# 1. 创建新绘图窗口
# Windows系统
windows()                                    # 创建新窗口
# Mac系统
# quartz()                                   # Mac系统
# Linux系统
# x11()                                      # Linux系统

# 跨平台通用方法
dev.new()                                    # 创建新图形设备(跨平台)

# 2. 查看和管理图形设备
dev.list()                                   # 列出所有打开的图形设备
dev.cur()                                    # 查看当前活动的设备
dev.prev()                                   # 切换到前一个设备
dev.next()                                   # 切换到后一个设备
dev.set(which = 2)                           # 设置设备2为当前设备

# 示例:多窗口绘图
# 创建3个绘图窗口
dev.new()                                    # 窗口1
plot(1:10, main = "窗口1 - 线性序列")

dev.new()                                    # 窗口2
hist(rnorm(1000), main = "窗口2 - 正态分布")

dev.new()                                    # 窗口3
boxplot(rnorm(100), rnorm(100, mean = 2), 
        main = "窗口3 - 箱线图对比")

# 查看设备状态
dev.list()                                   # 显示所有设备
dev.cur()                                    # 显示当前活动设备

# 在窗口间切换
dev.set(which = 2)                           # 切换到窗口2
points(1:100, rnorm(100), col = "red")       # 在窗口2上添加点

dev.set(which = 1)                           # 切换回窗口1
lines(1:10, (1:10)^2, col = "blue", lwd = 2) # 在窗口1上添加曲线

# 3. 关闭图形设备
dev.off()                                    # 关闭当前设备
graphics.off()                               # 关闭所有图形设备

# 4. 保存图形到文件

# 保存为PNG
png("my_plot.png",                           # 文件名
    width = 800,                             # 宽度(像素)
    height = 600,                            # 高度(像素)
    res = 96)                                # 分辨率(DPI)
plot(1:10, 1:10, main = "PNG格式保存")
dev.off()                                    # 关闭设备,完成保存

# 保存为PDF(适合打印)
pdf("my_plot.pdf",                           # 文件名
    width = 8,                               # 宽度(英寸)
    height = 6,                              # 高度(英寸)
    onefile = FALSE)                         # 每页一个图
plot(1:10, 1:10, main = "PDF格式保存")
dev.off()

# 保存为JPEG
jpeg("my_plot.jpg", 
     width = 800, height = 600, 
     quality = 90)                           # 质量(1-100)
hist(rnorm(1000), main = "JPEG格式保存")
dev.off()

# 保存为TIFF
tiff("my_plot.tiff", 
     width = 800, height = 600, 
     compression = "lzw")                    # 压缩方式
boxplot(rnorm(100), main = "TIFF格式保存")
dev.off()

# 保存为矢量图(SVG)
svg("my_plot.svg", width = 8, height = 6)
plot(1:10, 1:10, main = "SVG矢量格式")
dev.off()

# 5. 在单个文件中保存多个图形
pdf("multiple_plots.pdf", onefile = TRUE)    # 允许多页
for(i in 1:4) {
  plot(rnorm(100), main = paste("第", i, "页"))
}
dev.off()

# 6. 复制图形设备
dev.new()                                    # 创建新窗口
plot(1:10, 1:10, main = "原始图形")

dev.new()                                    # 创建另一个窗口
dev.copy(which = dev.prev())                 # 复制上一个窗口的内容
# 或使用dev.copy()
dev.copy(device = png, file = "copy.png")    # 复制到PNG文件
dev.off()

# 7. 图形设备参数设置
# 查看当前设备参数
dev.size()                                   # 设备尺寸(英寸)
dev.size(units = "px")                       # 设备尺寸(像素)
dev.capture()                                # 捕获当前图形(实验性)

# 8. 完整示例:多窗口协作分析
# 清空所有图形设备
graphics.off()

# 创建模拟数据
set.seed(2024)
data_raw <- rnorm(500, mean = 100, sd = 15)
data_log <- log(data_raw)
data_sqrt <- sqrt(data_raw)

# 窗口1:原始数据探索
dev.new(width = 10, height = 8)
par(mfrow = c(2, 2))
hist(data_raw, main = "原始数据直方图", col = "lightblue")
boxplot(data_raw, main = "原始数据箱线图", col = "lightgreen")
plot(density(data_raw), main = "原始数据密度图", col = "red", lwd = 2)
qqnorm(data_raw, main = "Q-Q图")
qqline(data_raw, col = "blue", lwd = 2)
par(mfrow = c(1, 1))

# 窗口2:数据变换对比
dev.new(width = 12, height = 6)
par(mfrow = c(1, 3))
hist(data_raw, main = "原始数据", col = "lightblue", prob = TRUE)
lines(density(data_raw), col = "red", lwd = 2)

hist(data_log, main = "对数变换", col = "lightgreen", prob = TRUE)
lines(density(data_log), col = "red", lwd = 2)

hist(data_sqrt, main = "平方根变换", col = "lightpink", prob = TRUE)
lines(density(data_sqrt), col = "red", lwd = 2)
par(mfrow = c(1, 1))

# 窗口3:相关性分析
dev.new(width = 8, height = 8)
# 创建相关矩阵图
cor_matrix <- cor(cbind(原始 = data_raw[1:100], 
                        对数 = data_log[1:100], 
                        平方根 = data_sqrt[1:100]))
# 使用image绘制相关矩阵
image(1:3, 1:3, cor_matrix, 
      col = colorRampPalette(c("blue", "white", "red"))(20),
      xlab = "", ylab = "", 
      axes = FALSE, 
      main = "相关系数矩阵")
axis(1, at = 1:3, labels = c("原始", "对数", "平方根"))
axis(2, at = 1:3, labels = c("原始", "对数", "平方根"))
# 添加相关系数文本
for(i in 1:3) {
  for(j in 1:3) {
    text(i, j, round(cor_matrix[i, j], 2), 
         col = ifelse(abs(cor_matrix[i, j]) > 0.7, "white", "black"), 
         cex = 1.2)
  }
}

# 显示所有打开的窗口
print(dev.list())

# 询问是否关闭所有窗口(交互式)
# graphics.off()  # 取消注释以关闭所有窗口

本章小结

本章详细介绍了R语言传统绘图系统的核心内容:

核心知识点总结

  1. 高级绘图函数:plot()、hist()、barplot()、boxplot()、pie()、dotchart()、curve()等,用于创建完整图形

  2. 低级绘图函数:points()、lines()、abline()、text()、legend()、axis()等,用于在现有图形上添加元素

  3. 图形参数控制

    • 点参数(pch、cex)
    • 线参数(lty、lwd)
    • 文字参数(font、cex)
    • 坐标轴参数(las)
    • 边距参数(mar、mai)
  4. 颜色控制

    • 颜色名称
    • RGB/HSV颜色系统
    • 调色板函数(rainbow、heat.colors等)
    • RColorBrewer包
  5. 页面布局

    • par(mfrow/mfcol):简单分割
    • layout():灵活布局
    • split.screen():交互式分割
  6. 多窗口管理

    • dev.new():创建新窗口
    • dev.list()、dev.cur()、dev.set():窗口管理
    • dev.off()、graphics.off():关闭窗口
    • 图形保存(PNG、PDF、JPEG等格式)

实践建议

r 复制代码
# 综合练习:创建专业级数据分析报告图

# 练习要求:
# 1. 使用layout创建复杂布局
# 2. 使用多种颜色方案
# 3. 添加适当的低级图形元素
# 4. 保存为PDF文件

# 创建数据
set.seed(456)
sales_data <- data.frame(
  month = 1:12,
  product_A = cumsum(rnorm(12, mean = 100, sd = 20)),
  product_B = cumsum(rnorm(12, mean = 80, sd = 15)),
  product_C = cumsum(rnorm(12, mean = 60, sd = 10))
)

# 保存为PDF
pdf("sales_report.pdf", width = 12, height = 8)

# 创建布局
layout_matrix <- matrix(c(1, 1, 2, 3, 4, 4), nrow = 3, byrow = TRUE)
layout(layout_matrix, heights = c(1, 2, 1.5))

# 图1:标题
par(mar = c(0, 0, 0, 0))
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(1, 1, "2024年度销售数据分析报告", 
     cex = 2.5, font = 2, col = "darkblue")

# 图2:销售趋势
par(mar = c(4, 4, 3, 2))
plot(sales_data$month, sales_data$product_A, 
     type = "l", col = "red", lwd = 2,
     xlab = "月份", ylab = "销售额(万元)",
     main = "产品销售趋势", ylim = c(0, max(sales_data[,2:4])))
lines(sales_data$month, sales_data$product_B, col = "blue", lwd = 2)
lines(sales_data$month, sales_data$product_C, col = "green", lwd = 2)
legend("topleft", 
       legend = c("产品A", "产品B", "产品C"),
       col = c("red", "blue", "green"),
       lty = 1, lwd = 2, cex = 0.9)

# 图3:年度总结
par(mar = c(4, 4, 3, 2))
total_sales <- colSums(sales_data[,2:4])
barplot(total_sales, 
        col = c("red", "blue", "green"),
        main = "年度总销售额",
        xlab = "产品", ylab = "总销售额(万元)",
        ylim = c(0, max(total_sales) * 1.1))
text(1:3, total_sales + 50, round(total_sales), cex = 1)

# 图4:月度贡献
par(mar = c(4, 4, 3, 2))
monthly_total <- rowSums(sales_data[,2:4])
barplot(monthly_total, 
        col = colorRampPalette(c("lightblue", "darkblue"))(12),
        main = "月度销售总额",
        xlab = "月份", ylab = "销售额(万元)",
        names.arg = 1:12)

dev.off()
cat("报告已保存为 sales_report.pdf\n")

通过本章学习,您应该能够熟练使用R语言传统绘图系统创建各种统计图形,并能够灵活控制图形参数和布局。

相关推荐
代龙涛1 小时前
WordPress archive.php 分类与归档页面开发指南
开发语言·后端·php·wordpress
格林威2 小时前
面阵相机 vs 线阵相机:堡盟与大恒相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
xyq20242 小时前
相邻节点迭代器
开发语言
YSF2017_32 小时前
C语言15-makefile(2)——makefile的自定义变量及两个函数
c语言·开发语言
YaBingSec2 小时前
玄机靶场—Apache-druid(CVE-2021-25646) WP
java·开发语言·笔记·安全·php·apache
少控科技2 小时前
小数典应用:农场环境数据采集监控
开发语言·windows·c#
叶小鸡2 小时前
Java 篇-项目实战-天机学堂(从0到1)-day7
java·开发语言
原来是猿2 小时前
Linux线程同步与互斥(五):线程池的全面实现
linux·服务器·开发语言
嵌入式×边缘AI:打怪升级日志2 小时前
从零开始学习 Linux SPI 驱动开发(基于 IMX6ULL + TLC5615 DAC)
linux·驱动开发·学习