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")
假设我有一组不等式:
-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")