如何在R的ggplot中为约束条件图填充可行域?
用ggplot填充线性规划可行域的方法
你当前的代码用stat_function画出了两条约束线,但要填充它们和坐标轴围合的可行域,geom_abline并不适用,推荐用geom_ribbon来实现。下面是修改后的完整代码:
library(ggplot2) # 生成密集的x值,保证填充区域平滑无断层 x_seq <- seq(0, 200, length.out = 100) # 计算两条约束线对应的y值 y1 <- (100 - 0.20*x_seq)/0.70 y2 <- 200 - x_seq # 确定可行域的上边界:取两条约束线的最小值(可行域在两条线下方) y_upper <- pmin(y1, y2) # 可行域的下边界为y=0 y_lower <- rep(0, length(x_seq)) # 组合成用于填充的数据框 fill_df <- data.frame(Budget = x_seq, y_lower = y_lower, y_upper = y_upper) ggplot() + # 填充可行域区域 geom_ribbon(data = fill_df, aes(x = Budget, ymin = y_lower, ymax = y_upper), fill = "lightblue", alpha = 0.3) + # 绘制两条约束线 stat_function(fun = \(x) (100 - 0.20*x)/0.70, aes(color = "约束线1"), size = 1) + stat_function(fun = \(x) (200 - x), aes(color = "约束线2"), size = 1) + # 设置坐标轴与标题 labs(y = "空间", color = "约束条件") + ggtitle("羽衣甘蓝与欧洲防风草种植规划") + # 限制坐标轴范围匹配可行域 xlim(0, 200) + ylim(0, max(y1, y2)) + theme_minimal()
核心要点说明:
geom_ribbon:专门用于填充两个y值区间的区域,必须指定ymin(下边界)和ymax(上边界)。- 密集x序列:用
seq生成足够多的x点,避免填充区域出现断层或锯齿。 pmin函数:取两条约束线的最小值,确定可行域的上边界;若你的可行域在两条线上方,替换为pmax即可。- 透明度
alpha:调整填充色的透明度,避免遮挡下方的约束线。
内容的提问来源于stack exchange,提问作者Riddle
相关产品推荐
相关产品推荐

