我有两个定义一个图中三个区域的线性方程来定义这个空图。
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
中设置的数字开始,并且不会比这个数字小很多。
提前谢谢你
发布于 2020-11-18 13:45:32
我必须时不时地这样做,这可能有点单调乏味,但我发现最好的方法是定义多边形。在这种情况下,您需要定义三个多边形,每个多边形由唯一的id标识。请看我下面第一个多边形的例子。如果需要多次执行此操作,定义一个基于多边形顶点创建多边形的函数可能会更容易。我还切换到了coord_cartesian
,因为它允许您基于绘图上不可见的点来定义多边形。对于中间的背景,我建议用三个点来定义它:两条线和另外两个点的交点,每个点都远离你的图形在一条线上。我希望这能给你一些启迪。祝好运。
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))
发布于 2020-11-18 16:31:23
如果你想给两条曲线(或两条线,就像你的例子)的左边、中间和右边的区域着色,你可以使用geom_ribbon,适当设置xmin、xmax、ymin和ymax列。在此基础上添加一个具有三个级别(左、间、右)的因子的列,并根据该列将美学设置为颜色。
发布于 2020-11-18 14:19:34
有几种方法可以定义界限,其中一些比另一些更有效,但我认为在背景中绘制矩形可能是最简单的?
要删除边缘周围的填充,请使用expand = c(0,0)
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)))
https://stackoverflow.com/questions/64887416
复制相似问题