如何基于多二元函数最大值划分x-y平面区域并使用ggplot绘图
问题解决:用ggplot绘制二元函数最大值区域的可视化
原代码存在的问题
- 仅遍历了x和y的对应索引元素(如x[1]配y[1]),未生成完整的x-y网格点,无法覆盖整个0-100的平面区域
- 计算函数值列表
v时重复调用了f3,遗漏了f4 f2(x,y)=y log(x)中,x=0时log(0)无定义,会引发计算错误- ggplot调用语法错误:未在
aes中映射vmax作为颜色变量,也未添加可视化图层(如geom_tile)
修正后的代码实现
library(ggplot2) library(dplyr) # 定义四个二元函数 f1 <- function(x,y) 5*x + 2*y f2 <- function(x,y) y * log(x) f3 <- function(x,y) x*y/10 f4 <- function(x,y) x^3 - 5*y # 生成完整的x-y网格点(x从1开始避免log(0)错误,步长可根据精度调整) x <- seq(1, 100, by = 1) y <- seq(0, 100, by = 1) df <- expand.grid(x = x, y = y) # 计算每个点的四个函数值,并找出最大值对应的函数编号 df <- df %>% mutate( val1 = f1(x, y), val2 = f2(x, y), val3 = f3(x, y), val4 = f4(x, y), # 找出最大值对应的函数(1-4),并转为因子方便ggplot分组着色 max_func = factor(which.max(cbind(val1, val2, val3, val4)), labels = c("f1=5x+2y", "f2=y log(x)", "f3=xy/10", "f4=x³-5y")) ) # 绘制热力图,用不同颜色区分各函数的最大值区域 ggplot(df, aes(x = x, y = y, fill = max_func)) + geom_tile() + scale_fill_brewer(palette = "Set1") + labs(title = "各区域最大值对应的二元函数", x = "x", y = "y", fill = "最大值函数") + theme_minimal()
代码说明
- 用
expand.grid生成所有x-y组合的网格点,确保覆盖整个0-100平面 - 调整x的起始值为1,避免
log(0)的计算错误 - 使用
dplyr的mutate批量计算函数值,通过which.max(cbind(...))高效找出每个点的最大值函数 - 用
geom_tile绘制热力图,配合scale_fill_brewer设置区分度高的颜色方案 - 将函数编号转为带标签的因子,让图例更直观
内容的提问来源于stack exchange,提问作者簡楷懋
相关产品推荐
相关产品推荐

