【问题标题】:Plotting inequalities in r在 r 中绘制不等式
【发布时间】:2016-12-17 06:17:27
【问题描述】:

我有许多来自我的数据的值,例如x1x2x3 等,我正在尝试绘制依赖于这些值的函数的阴影区域。这些区域由以下形式的不等式定义:

f(x1, x2) <= A <= f(x3, x4)

f(x5, x6) <= A + B <= f(x7, x8)

我希望 A 在 x 轴上,B 在 y 轴上。

我尝试将值放入数据框中并使用 ggplot,但我的 r 技能缺乏并且超出了简单的线图/条形图等。我有点迷茫,我尤其不能找出将不等式绘制为区域的语法。

谢谢

例如编辑:

        x1    x2    x3    x4    x5    x6
Plot1   0.2   0.3   0.24  0.14  0.17  0.31
Plot2   0.14  0.35  0.30  0.11  0.21  0.39

希望绘制两个单独的图表(一个用于Plot1,一个用于Plot2),其区域定义为:

max(x2 + x3, x4 + x5) <= A <= min(1 - x1, 1 - x6)

max(x3, x5) <= A + B <= min(x2 + x3, x5 + x6)

【问题讨论】:

  • AFAIK 没有用于将不等式绘制为区域的内置几何图形。如果您实际上提供了一个reproducible example,其中包含可用于制作绘图的样本数据和实际值,那将会有所帮助。您是否正在尝试求解方程并绘制轮廓?这些至少是线性不等式吗?
  • 对不起,我应该给出一个更清楚的例子!我现在编辑了。基本上只是试图绘制满足上述两个不等式的 A 和 B 值的范围。

标签: r plot


【解决方案1】:

我不知道有任何内置的 R 函数可以做到这一点。但是,如果满足不等式,您可以使用网格制作 data.frame 并计算每个网格点。然后您可以使用 geom_tile 进行绘图。一个工作示例:

## Equation 1: f1(A,B) <= A < f2(A,B)
## Equation 2: f3(A,B) < A + B < f4(A,B)

library(ggplot2)

grid <- expand.grid( A = seq(-2,2, length.out = 100), B = seq(-1, 1, length.out = 100))

f1 <- function(A, B) B
f2 <- function(A, B) 2*(A^2 + B^2)
f3 <- function(A, B) A*B
f4 <- function(A, B) 2*A+B^3

grid$inside_eq1 <- (f1(grid$A, grid$B) <= grid$A) & (grid$A < f2(grid$A, grid$B))
grid$inside_eq2 <- (f3(grid$A, grid$B) < grid$A + grid$B) & (grid$A + grid$B < f4(grid$A, grid$B))
grid$inside <- grid$inside_eq1 & grid$inside_eq2

ggplot(grid) +
    geom_tile(aes(x = A, y = B, color = inside, fill = inside))

编辑:您在评论中询问如何在该区域周围绘制边框。我认为一般的灵魂有点复杂,但在你的情况下并不难。您在不等式中的函数独立于 A 和 B,它们是恒定的,因此是凸的。由于凸集的交集又是凸的,所以满足不等式的区域也是凸的。这导致了一个利用该区域的凸包的解决方案:

## if you want a border for the region (works only if all equations are convex!)

f1 <- function() 0.1
f2 <- function() 1.8
f3 <- function() -1.2
f4 <- function() 0.3

grid$inside_eq1 <- (f1() <= grid$A) & (grid$A < f2())
grid$inside_eq2 <- (f3() < grid$A + grid$B) & (grid$A + grid$B < f4())
grid$inside <- grid$inside_eq1 & grid$inside_eq2

hull <- chull(grid$A[grid$inside], grid$B[grid$inside])
ggplot(grid, aes(x = A, y = B)) +
    geom_tile(aes(color = inside, fill = inside)) +
    geom_path(data = grid[grid$inside, ][c(hull, hull[1]), ], size = 2)

【讨论】:

  • 感谢您的回复!这很好用,有什么方法可以将区域绘制得更像图表?即我希望在满足不等式的区域边界上有一条线,中间有阴影。 geom_tile 的美学似乎不允许这样做?
  • 不,我不认为你可以用 geom_tile 做到这一点。但是,我为另一个解决方案编辑了答案。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多