r - R ggplot2 geom_ribbon:阴影/着色区域由两侧的两条交叉线界定,当没有线在下面并且没有线在上面时
问题描述
问题:我想在线条之间着色
诡计标题,我知道。我有三行看起来像这样 我想对绿色和红色之间的区域进行着色/着色。基本上,红线和绿线代表蓝线的某种置信区间的边界。我现在只能上色一半,那是因为交叉前的蓝色低于绿色,交叉后的绿色低于蓝色。但是,我不能给另一半上色,因为蓝色和红色是不同的。
有没有像这样在两条几乎垂直的线之间着色的简单方法?
我尝试了 geom_ribbon,但没有得到任何结果。这是我当前的代码,只着色了一半。
最小的工作示例
library(ggplot2)
# Lines to plot
blue_line <- function(x) 28.6*x - 51
red_line <- function(x) -16*x + 28
green_line <- function(x) 5.5*x-10
# Data to plot
x <- seq(from=1, to=4, length.out=200)
df <- data.frame(x=x, yblue=blue_line(x), yred=red_line(x), ygreen=green_line(x))
ggplot(data=df, aes(x=x)) +
geom_ribbon(aes(x=x, ymin=ygreen, ymax=yblue), fill="grey80") +
geom_line(aes(x=x, y=yblue), color="blue") +
geom_line(aes(x=x, y=yred), color="red") +
geom_line(aes(x=x, y=ygreen), color="green") +
coord_cartesian(xlim=c(-3.5, 8), ylim=c(-4, 12))
第二个最小工作示例
这段代码有效,但是请注意它是多么乏味、重复和愚蠢。希望有更好的方法。
library(ggplot2)
# Lines to plot
blue_line <- function(x) 28.6*x - 51
red_line <- function(x) -16*x + 28
green_line <- function(x) 5.5*x-10
# Data to plot
x <- seq(from=0.9, to=4.2, length.out=200)
# Below
x_below <- seq(from=0.9, to=2.06, length.out=200)
y_below <- rep(-5, 200)
y_below_above <- c(green_line(x_below[x_below <= 1.76744]), red_line(x_below[x_below > 1.76744]))
# Above
x_above <- seq(from=-2.5625, to=4.181818, length.out=200)
y_above <- rep(13, 200)
y_above_below <- c(red_line(x_above[x_above<=1.76744]), green_line(x_above[x_above>1.76744]))
df <- data.frame(x=x, yblue=blue_line(x), yred=red_line(x), ygreen=green_line(x),
ybelow=y_below, xbelow=x_below, y_below_above=y_below_above,
xabove=x_above, yabove=y_above, y_above_below=y_above_below)
ggplot(data=df, aes(x=x)) +
geom_ribbon(aes(x=xbelow, ymin=ybelow, ymax=y_below_above), fill="grey80") +
geom_ribbon(aes(x=xabove, ymin=y_above_below, ymax=yabove), fill="grey80") +
geom_line(aes(x=x, y=yblue), color="blue") +
geom_line(aes(x=x, y=yred), color="red") +
geom_line(aes(x=x, y=ygreen), color="green") +
coord_cartesian(xlim=c(-3.5, 8), ylim=c(-4, 12))
解决方案
除了您的数据操作示例之外,我不知道如何使用geom_ribbon
从 xmin 到 xmax 来填充,而不像这里coord_flip
提到的那样。
但是,您可以使用geom_polygon
在两行之间创建填充区域,如下所示:
poly_df <- rbind(setNames(df[, c(1,3)],c('x','y')),
setNames(df[, c(1,4)],c('x','y')))
ggplot(data=df, aes(x=x)) +
geom_line(aes(y=yblue), color="blue") +
geom_line(aes(y=yred), color="red") +
geom_line(aes(y=ygreen), color="green") +
coord_cartesian(xlim=c(-3.5, 8), ylim=c(-4, 12)) +
geom_polygon(data = poly_df, aes(x = x,y = y), fill = "lightblue", alpha = 0.25)
推荐阅读
- twilio - 按日期范围检索 Twilio 消息?
- javascript - 如何在页面呈现之前加载字体?
- ruby-on-rails - Rails 5使用参数从url地址查询
- angular - 如何使用 django rest 框架和 angular 上传图片?
- spring - 带有两个罐子的 docker 中的 Spring Boot
- rest - 是否必须将 RestTemplate 用于宁静的 Web 服务?或者在给@PostMapping 提供响应实体时可以忽略它?
- ios - 从设置打开应用程序时如何检测授权状态是否更改
- windows - 加载DLL文件时,是否也调用了DLL文件的入口点?
- regex - 从字段中提取值
- mysql - 如何根据字符串列按降序对数据进行排序?