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语言传统绘图系统的核心内容:
核心知识点总结
-
高级绘图函数:plot()、hist()、barplot()、boxplot()、pie()、dotchart()、curve()等,用于创建完整图形
-
低级绘图函数:points()、lines()、abline()、text()、legend()、axis()等,用于在现有图形上添加元素
-
图形参数控制:
- 点参数(pch、cex)
- 线参数(lty、lwd)
- 文字参数(font、cex)
- 坐标轴参数(las)
- 边距参数(mar、mai)
-
颜色控制:
- 颜色名称
- RGB/HSV颜色系统
- 调色板函数(rainbow、heat.colors等)
- RColorBrewer包
-
页面布局:
- par(mfrow/mfcol):简单分割
- layout():灵活布局
- split.screen():交互式分割
-
多窗口管理:
- 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语言传统绘图系统创建各种统计图形,并能够灵活控制图形参数和布局。