首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为图中的不同区域提供不同的ggplot2背景

如何为图中的不同区域提供不同的ggplot2背景
EN

Stack Overflow用户
提问于 2020-11-18 13:08:22
回答 3查看 60关注 0票数 1

我有两个定义一个图中三个区域的线性方程来定义这个空图。

代码语言:javascript
运行
复制
lin.func <- function(int, slope, x) {
  y = int + slope*x
}

ggplot(data.frame(x = c(32, 40)), aes(x)) + 
  stat_function(fun = lin.func, args = list(int = 78.8, slope = -1.76), 
                colour="black", size = 1) +
  stat_function(fun = lin.func, args = list(int = 105.3, slope = -2.38), 
                colour="black", size = 1)+
  theme_bw() + 
  scale_x_continuous(limits=c(28,44), breaks = c(seq(min(28),max(44), length.out = 5))) +
  scale_y_continuous(limits=c(10,25), breaks = c(seq(min(10),max(25), length.out = 4))) 

该图如下所示:

我需要的是顶部有一个绿色的背景在中央对角线上,红色在最左边的区域,蓝色在最右边的区域。

这有可能做到吗?我环顾四周,能找到任何解决方案。

另一个问题是如何使轴从我在scale_x_continuous中设置的数字开始,并且不会比这个数字小很多。

提前谢谢你

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-18 13:45:32

我必须时不时地这样做,这可能有点单调乏味,但我发现最好的方法是定义多边形。在这种情况下,您需要定义三个多边形,每个多边形由唯一的id标识。请看我下面第一个多边形的例子。如果需要多次执行此操作,定义一个基于多边形顶点创建多边形的函数可能会更容易。我还切换到了coord_cartesian,因为它允许您基于绘图上不可见的点来定义多边形。对于中间的背景,我建议用三个点来定义它:两条线和另外两个点的交点,每个点都远离你的图形在一条线上。我希望这能给你一些启迪。祝好运。

代码语言:javascript
运行
复制
polygons <- data.frame(x= c(10, 10, 20, 40), y = c(5, 25, 78.8-1.76*c(20,40)), group = c(rep(1,4)))

ggplot(data.frame(x = c(32, 40)), aes(x)) + 
  geom_polygon(data = polygons, aes(x = x, y=y, group = group, fill= factor(group))) + 
  stat_function(fun = lin.func, args = list(int = 78.8, slope = -1.76), 
                colour="black", size = 1) +
  stat_function(fun = lin.func, args = list(int = 105.3, slope = -2.38), 
                colour="black", size = 1)+
  theme_bw() + 
  coord_cartesian(x = c(28,44), y = c(10,25))
票数 1
EN

Stack Overflow用户

发布于 2020-11-18 16:31:23

如果你想给两条曲线(或两条线,就像你的例子)的左边、中间和右边的区域着色,你可以使用geom_ribbon,适当设置xmin、xmax、ymin和ymax列。在此基础上添加一个具有三个级别(左、间、右)的因子的列,并根据该列将美学设置为颜色。

票数 1
EN

Stack Overflow用户

发布于 2020-11-18 14:19:34

有几种方法可以定义界限,其中一些比另一些更有效,但我认为在背景中绘制矩形可能是最简单的?

要删除边缘周围的填充,请使用expand = c(0,0)

代码语言:javascript
运行
复制
lin.func <- function(int, slope, x) {
  y = int + slope*x
}
miny = 10
maxy = 25
x1 = c(28,31)
x2 = c(31,40)
x3 = c(40,44)

ggplot(data.frame(x = c(32, 40)), aes(x)) + 
    geom_rect(aes(xmin=x1[1], xmax=x1[2], ymin=miny, ymax=maxy), fill='#BB0000', color=NA, alpha=0.2) +
    geom_rect(aes(xmin=x2[1], xmax=x2[2], ymin=miny, ymax=maxy), fill='#00BB00', color=NA, alpha=0.2) +
    geom_rect(aes(xmin=x3[1], xmax=x3[2], ymin=miny, ymax=maxy), fill='#0000BB', color=NA, alpha=0.2) +
  stat_function(fun = lin.func, args = list(int = 78.8, slope = -1.76), 
                colour="black", size = 1) +
  stat_function(fun = lin.func, args = list(int = 105.3, slope = -2.38), 
                colour="black", size = 1)+
  theme_bw() + 
  scale_x_continuous(expand = c(0, 0),limits=c(28,44), breaks = c(seq(min(28),max(44), length.out = 5))) +
  scale_y_continuous(expand = c(0, 0),limits=c(miny,maxy), breaks = c(seq(min(miny),max(maxy), length.out = 4))) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64887416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档