如何用阴影填充最简单地绘制不等式图形?

16

这里输入图片描述

参考上面的图。我已经在Excel中绘制了方程,然后手动着色。你可以看到它不是很整洁。你可以看到有六个区域,每个区域由两个或多个方程界定。如何使用斜线图案画出不等式并阴影化区域,这是最简单的方法?


7
非常感谢你的手绘图片!但是,如果你没有展示任何代码、样例数据或者你已经尝试过的方法,可能会有一些不那么宽容的人给你点踩哦! - Simon O'Hanlon
@SimonO101 谢谢。我已经在Excel和Matlab中尝试过了。Matlab需要Mupad,而我没有这个软件。此外,我认为许多软件都可以做到这一点,尽管难度级别会有很大的差异。当有人能够确认哪个软件在绘制不等式方面真正酷的时候,我就可以开始详细学习那个软件了。 - Ashni Goyal
2
这可能与此相关:https://dev59.com/iGgu5IYBdhLWcg3wZmW8(如果您想要有斑马线区域,则还需参考此链接:http://blogs.mathworks.com/pick/2011/07/15/creating-hatched-patches/)。但正如您在评论中提到的,Matlab可能不是完成此任务的最佳工具。 - Aabaz
1
我不知道为什么这里会有Stata标签。但是基本上,Stata不支持绘制阴影或点画的图形,这几乎可以看作是一种原则性的限制。 - Nick Cox
@NickCox stata 可以绘图。我可以使用 stata。因此,我想请一位 stata 专家评论是否可以在 stata 中实现这一点。感谢您宝贵的回复。 - Ashni Goyal
2
我相信自己有资格成为经验丰富的Stata用户。你想要的在Stata中并非完全不可能,但最好去其他地方寻找。 - Nick Cox
4个回答

18

在 @agstudy 的回答基础上,以下是一种快速且简单的方法来表示R中的不等式:

plot(NA,xlim=c(0,1),ylim=c(0,1), xaxs="i",yaxs="i") # Empty plot
a <- curve(x^2, add = TRUE) # First curve
b <- curve(2*x^2-0.2, add = TRUE) # Second curve
names(a) <- c('xA','yA')
names(b) <- c('xB','yB')
with(as.list(c(b,a)),{
    id <- yB<=yA
    # b<a area
    polygon(x = c(xB[id], rev(xA[id])),
            y = c(yB[id], rev(yA[id])), 
            density=10, angle=0, border=NULL)
    # a>b area
    polygon(x = c(xB[!id], rev(xA[!id])),
            y = c(yB[!id], rev(yA[!id])), 
            density=10, angle=90, border=NULL)
    })

在此输入图片描述

如果所涉及的区域被超过两个方程式所包围,则只需添加更多条件:

plot(NA,xlim=c(0,1),ylim=c(0,1), xaxs="i",yaxs="i") # Empty plot
a <- curve(x^2, add = TRUE) # First curve
b <- curve(2*x^2-0.2, add = TRUE) # Second curve
d <- curve(0.5*x^2+0.2, add = TRUE) # Third curve

names(a) <- c('xA','yA')
names(b) <- c('xB','yB')
names(d) <- c('xD','yD')

with(as.list(c(a,b,d)),{
    # Basically you have three conditions: 
    # curve a is below curve b, curve b is below curve d and curve d is above curve a
    # assign to each curve coordinates the two conditions that concerns it.

    idA <- yA<=yD & yA<=yB
    idB <- yB>=yA & yB<=yD
    idD <- yD<=yB & yD>=yA
    polygon(x = c(xB[idB], xD[idD], rev(xA[idA])),
            y = c(yB[idB], yD[idD], rev(yA[idA])), 
            density=10, angle=0, border=NULL)
    })

这里输入图片描述


+1!我刚刚使用了 with 来使你的好例子更易读。使用多边形并不明显,所以我不认为你的代码像你说的那样肮脏。 - agstudy
@AshniGoyal为什么不更新你的问题,添加这些方程式呢?这样做会更好地处理一个具体的例子。 - agstudy
2
@agstudy 谢谢!AshniGoyal:请看编辑。然而,自动化这个过程相对较难:解决方案必须针对每个问题进行定制。 - plannapus
1
从技术上讲,除了填充区域之外,每个多边形都是空白的,因此两种阴影将重叠(如果一种具有水平线条,而另一种具有垂直线条,则会产生既有垂直线条又有水平线条的图案)。 - plannapus
1
事实上,curve返回已绘制点的坐标是R版本2.10.0的新功能之一。 - plannapus
显示剩余14条评论

10
在R语言中,对于填充图案的支持非常有限,只能应用于矩形和多边形,并且仅适用于传统图形,不包括ggplot2lattice
可以使用一组以特定角度绘制的线来填充矩形或多边形,线之间具有特定的间距。通过density参数控制线的间距(以每英寸线数表示),通过angle参数控制线的角度。
以下是帮助文档中的一个示例:
plot(c(1, 9), 1:2, type = "n")
polygon(1:9, c(2,1,2,1,NA,2,1,2,1),
         density = c(10, 20), angle = c(-45, 45))

这里输入图片描述

编辑

另一种选择是使用alpha混合来区分区域。在这里,使用@plannapus的示例和gridBase包来叠加多边形,您可以做出类似以下的效果:

library(gridBase)
vps <- baseViewports()
pushViewport(vps$figure,vps$plot)
with(as.list(c(a,b,d)),{
  grid.polygon(x = xA, y = yA,gp =gpar(fill='red',lty=1,alpha=0.2))
  grid.polygon(x = xB, y = yB,gp =gpar(fill='green',lty=2,alpha=0.2))
  grid.polygon(x = xD, y = yD,gp =gpar(fill='blue',lty=3,alpha=0.2))
}
)
upViewport(2)

在此输入图片描述


3

在MATLAB中央文件交换中,有几个提交可以以不同的方式为您生成图案填充图。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接