R 绘图实战:函数曲线图绘制详解与丰富代码实例
1. 引言:为什么选择 R 绘制函数曲线图?
R 语言作为统计计算和图形绘制的强大工具,在数据可视化领域有着不可替代的地位。对于函数曲线图的绘制,R 提供了从基础到高级的完整解决方案。无论是简单的数学函数可视化,还是复杂的自定义函数图形展示,R 都能以简洁的语法生成高质量的出版级图形。本文将深入探讨 R 中绘制函数曲线图的各种方法,并通过丰富的代码实例帮助读者快速掌握这一核心技能。
2. 基础绘制:plot() 函数入门
R 中最基础的绘图函数是plot(),它能够绘制散点图、线图等多种图形。对于函数曲线,我们需要先生成 x 值序列,然后计算对应的 y 值。
# 示例 1:绘制正弦函数曲线 x <- seq(-2*pi, 2*pi, length.out = 100) # 生成 x 值序列 y <- sin(x) # 计算对应的 y 值 基础绘图 plot(x, y, type = "l", # type="l" 表示绘制线图 main = "正弦函数曲线", xlab = "x 值", ylab = "sin(x)", col = "blue", lwd = 2) # 线宽为 2 添加网格线 grid() 添加图例 legend("topright", legend = "y = sin(x)", col = "blue", lty = 1, lwd = 2)这段代码展示了绘制正弦函数的基本流程:seq()生成均匀的 x 值序列,sin()计算函数值,plot()绘制图形,最后通过grid()和legend()增强可读性。
3. 进阶技巧:curve() 函数的威力
R 专门为函数绘图提供了curve()函数,它可以直接接受函数表达式,无需预先计算 x 和 y 值。
# 示例 2:使用 curve() 绘制多种函数 par(mfrow = c(2, 2)) # 设置 2x2 的图形布局 绘制指数函数 curve(exp(x), from = -2, to = 2, main = "指数函数", xlab = "x", ylab = "exp(x)", col = "red", lwd = 2) 绘制对数函数(注意定义域) curve(log(x), from = 0.1, to = 10, main = "自然对数函数", xlab = "x", ylab = "log(x)", col = "darkgreen", lwd = 2) 绘制多项式函数 curve(x^3 - 3*x^2 + 2, from = -2, to = 4, main = "三次多项式", xlab = "x", ylab = "f(x)", col = "purple", lwd = 2) 绘制自定义函数 my_function <- function(x) { return(sin(x) * cos(2*x)) } curve(my_function, from = -pi, to = pi, main = "自定义函数:sin(x)*cos(2x)", xlab = "x", ylab = "f(x)", col = "orange", lwd = 2) par(mfrow = c(1, 1)) # 恢复单图布局curve()函数的优势在于:
- 语法简洁,直接使用函数表达式
- 自动处理定义域和值域
- 支持匿名函数和自定义函数
- 与基础图形参数完全兼容
4. 多函数对比与图形美化
在实际应用中,我们经常需要比较多个函数。R 提供了多种方式实现这一需求。
# 示例 3:在同一坐标系中绘制多个函数 # 定义绘图范围 x_range <- seq(-3, 3, length.out = 200) 计算多个函数值 y1 <- dnorm(x_range) # 标准正态分布密度函数 y2 <- dt(x_range, df = 5) # t 分布(自由度为5) y3 <- dnorm(x_range, mean = 1, sd = 0.5) # 正态分布(μ=1, σ=0.5) 创建空白图形框架 plot(x_range, y1, type = "n", # type="n" 只创建坐标系,不画线 xlim = c(-3, 3), ylim = c(0, 0.8), main = "概率密度函数对比", xlab = "x", ylab = "密度") 添加网格 grid(col = "gray", lty = "dotted") 绘制三条曲线 lines(x_range, y1, col = "blue", lwd = 2, lty = 1) lines(x_range, y2, col = "red", lwd = 2, lty = 2) lines(x_range, y3, col = "darkgreen", lwd = 2, lty = 3) 添加图例 legend("topright", legend = c("标准正态分布", "t分布(df=5)", "正态分布(μ=1,σ=0.5)"), col = c("blue", "red", "darkgreen"), lty = c(1, 2, 3), lwd = 2, bg = "white")5. ggplot2:优雅的图形语法
对于更复杂的图形需求,ggplot2包提供了强大的图形语法系统。
# 示例 4:使用 ggplot2 绘制函数曲线 library(ggplot2) 创建数据框 x <- seq(-4, 4, length.out = 300) df <- data.frame( x = x, normal = dnorm(x), cauchy = dcauchy(x), logistic = dlogis(x) ) 使用 ggplot2 绘制 ggplot(df, aes(x = x)) + geom_line(aes(y = normal, color = "标准正态分布"), size = 1.2) + geom_line(aes(y = cauchy, color = "柯西分布"), size = 1.2) + geom_line(aes(y = logistic, color = "逻辑分布"), size = 1.2) + scale_color_manual( name = "分布类型", values = c("标准正态分布" = "#E41A1C", "柯西分布" = "#377EB8", "逻辑分布" = "#4DAF4A") ) + labs( title = "三种连续概率分布的密度函数", subtitle = "使用 ggplot2 绘制", x = "x 值", y = "概率密度" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 16, face = "bold"), plot.subtitle = element_text(hjust = 0.5, size = 12), legend.position = "right" ) + geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.5) + geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.5)6. 实战应用:自定义复杂函数可视化
下面通过一个综合实例,展示如何可视化一个复杂的自定义函数。
# 示例 5:复杂函数的三维曲面与等高线图 library(plot3D) 定义二元函数 f <- function(x, y) { sin(sqrt(x^2 + y^2)) / sqrt(x^2 + y^2 + 1) } 生成网格数据 x <- seq(-10, 10, length.out = 50) y <- seq(-10, 10, length.out = 50) z <- outer(x, y, f) 绘制三维曲面图 par(mfrow = c(1, 2)) 3D 曲面图 persp3D(x, y, z, main = "三维曲面图:sin(sqrt(x²+y²))/sqrt(x²+y²+1)", xlab = "X", ylab = "Y", zlab = "f(x,y)", theta = 30, phi = 30, # 视角参数 col = ramp.col(col = c("blue", "cyan", "green", "yellow", "red")), border = "black", shade = 0.5, expand = 0.5) 等高线图 contour(x, y, z, main = "等高线图", xlab = "X", ylab = "Y", nlevels = 20, col = terrain.colors(20)) points(0, 0, pch = 19, col = "red", cex = 1.5) # 标记原点 par(mfrow = c(1, 1))7. 图形导出与格式设置
绘制完成后,我们需要将图形导出为文件。R 支持多种图形格式和高质量导出。
# 示例 6:图形导出设置 # 绘制一个精美的函数图 curve(sin(x) * exp(-x/5), from = 0, to = 20, main = "阻尼正弦波", xlab = "时间", ylab = "振幅", col = "darkblue", lwd = 3, col.main = "darkred", font.main = 2, cex.main = 1.2) 添加填充区域 x_poly <- seq(0, 20, length.out = 200) y_poly <- sin(x_poly) * exp(-x_poly/5) polygon(c(0, x_poly, 20), c(0, y_poly, 0), col = rgb(0, 0, 1, 0.3), border = NA) 导出为 PDF(矢量图,适合出版) pdf("damped_sine_wave.pdf", width = 8, height = 6) curve(sin(x) * exp(-x/5), from = 0, to = 20, main = "阻尼正弦波", xlab = "时间", ylab = "振幅", col = "darkblue", lwd = 3) dev.off() 导出为 PNG(位图,适合网页) png("damped_sine_wave.png", width = 800, height = 600, res = 150) curve(sin(x) * exp(-x/5), from = 0, to = 20, main = "阻尼正弦波", xlab = "时间", ylab = "振幅", col = "darkblue", lwd = 3) dev.off() 导出为 SVG(矢量图,适合网页和进一步编辑) svg("damped_sine_wave.svg", width = 8, height = 6) curve(sin(x) * exp(-x/5), from = 0, to = 20, main = "阻尼正弦波", xlab = "时间", ylab = "振幅", col = "darkblue", lwd = 3) dev.off()8. 总结与最佳实践
通过本文的实例,我们掌握了 R 绘制函数曲线图的核心技能:
- 基础绘制:使用
plot()和curve()函数 - 多函数对比:在同一坐标系中展示多个函数
- 图形美化:调整颜色、线型、添加图例和网格
- 高级可视化:使用
ggplot2创建出版级图形 - 复杂函数:三维曲面和等高线图绘制
- 图形导出:支持 PDF、PNG、SVG 等多种格式
最佳实践建议:
- 对于简单函数,优先使用
curve()函数 - 需要高度定制化时,选择
plot()+lines()组合 - 制作报告或出版物时,使用
ggplot2保证图形一致性 - 导出图形时,根据用途选择合适格式(出版用 PDF,网页用 PNG/SVG)
- 使用
par()函数全局设置图形参数,保持多图风格统一
R 的函数绘图能力远不止于此,读者可以进一步探索lattice、plotly(交互式图形)、shiny(动态可视化)等高级包,构建更加丰富和交互式的函数可视化应用。