R函数用阴影绘制不等式

R function to plot inequalities with shading

假设我有一组不等式:

  -2x + y <= -3
1.25x + y <= 2.5
        y >= -3

而我可以将这些信息总结如下:

mat <- matrix(c(-2, 1, 1.25, 1, 0, 1), nrow = 3, byrow = TRUE)
dir <- c("<=", "<=", ">=")
rhs <- c(-3, 2.5, -3)

我编写了以下函数来绘制不等式:

plot(0, 0, xlim = c(-1, 5), ylim = c(-4, 1))
plot_ineq <- function(mat, dir, rhs, xlow, xhigh){
  line <- list()
  for(i in 1:nrow(mat)){
    if(mat[i, 2] > 0){
      line[[i]] <- sapply(seq(xlow, xhigh, 0.1), function(x) (rhs[i] - mat[i, 1] * x)/mat[i, 2])
    }else if(mat[i, 2] < 0){
      line[[i]] <- sapply(seq(xlow, xhigh, 0.1), function(x) (rhs[i] - mat[i, 1] * x)/mat[i, 2])
      if(dir[i] == ">="){
        dir[i] = "<="
      }else dir[i] = ">="
    }
    lines(seq(xlow, xhigh, 0.1), line[[i]])
  }
}

plot_ineq(mat = mat, dir = dir, rhs = rhs, xlow = -1, xhigh = 5)

我有两个问题:(1) 如何在没有 (0, 0) 点的情况下绘制空白图?以及(2)如何根据dir对相应区域进行着色?我应该试试 ggplot2 吗?

我只是想遮蔽上述不等式所描述的区域。不在 (0, 0) 所在的位置。

1) 将最后一个不等式改成与其他不等式方向相同,然后在gMOIP中使用plotPolytope。

library(gMOIP)
mat <- matrix(c(-2, 1, 1.25, 1, 0, -1), nrow = 3, byrow = TRUE)
rhs <- c(-3, 2.5, 3)

argsFaces <- list(argsGeom_polygon = list(fill = "blue"))
plotPolytope(mat, rhs, argsFaces = argsFaces)

捐赠(图片后续)

2) 以上使用 ggplot2 图形,但如果您更喜欢经典图形,则使用上面的 mat 和 rhs:

library(gMOIP)

cp <- cornerPoints(mat, rhs)
cp <- cp[chull(cp), ]  # chull gives indices of convex hull in order
plot(cp, type = "n")
polygon(cp, col = "blue")

# not shown but to add lines run this too
for(i in 1:nrow(cp)) {
  ix <- if (i < nrow(cp)) i + 0:1 else c(i, 1)
  b <- diff(cp[ix, 2]) / (d <- diff(cp[ix, 1]))
  if (abs(d) < 1e-5) abline(v = a <- cp[i, 1])
  else abline(a = a <- cp[i, 2] - b * cp[i, 1], b = b)
}

捐赠(图片后续)

3) 注意CRAN上有一个压缩包intpoint,可以用来画可行域的边界线。它确实有一个限制,即它被硬编码为在 -1 和 5 之间显示 X 和 Y 轴,尽管它可能不难概括它。它是这样使用的(输出未显示),其中 mat、rhs 和 cp 来自上方。

library(intpoint)

intpoint:::show2d(mat, rhs, c = numeric(2))
polygon(cp, col = "blue")