gpt4 book ai didi

r - ggplot2 - 在两个 geom_abline 层之间创建一个阴影区域

转载 作者:行者123 更新时间:2023-12-03 22:33:51 25 4
gpt4 key购买 nike

few posts关于在 ggplot2 中使用阴影区域,但我认为没有人能准确回答我的问题。我有两个斜率用于跨越许多条件的线,我想对它们之间的区域进行阴影处理。以下是示例数据:

dat <- data.frame(cond1=c("a","a","b","b"),
cond2=c("c","d","c","d"),
x=c(1,5),
y=c(1,5),
sl=c(1,1.2,0.9,1.1),
int=c(0,0.1,0.1,0),
slopeU=c(1.1,1.3,1.2,1.2),
slopeL=c(.9,1,0.7,1))

在这里, sl是来自单独拟合程序的平均斜率参数, slopeUslopeL表示每个条件下斜率估计的上下置信区域。截距被限制为相同。以下代码使用一些分面为每个条件绘制最佳拟合线:
p <- ggplot(dat,aes(x=x,y=y,colour=cond1))
p <- p + facet_grid(. ~ cond2)
p <- p + geom_blank()
p <- p + geom_abline(aes(intercept=int,slope=sl,colour=cond1),data=dat)
p

我想添加由 intercept=int, slope=slopeU 定义的行和 intercept=int, slope=slopeL到绘图并对它们之间的区域进行着色(例如,在 alpha=.5 处,使用相应的 cond1 颜色)。

我认识到,通过一点点操作,我可以创建一个数据框,为至少两个 x 值指定这些线的值,然后绘制相应的 geom_ribbon 或 geom_polygon 以创建阴影区域,但是我想找到一个更优雅的解决方案。或者是手动指定斜率的一些坐标并截取的唯一方法?我将如何最好地创建所需的数据框(它需要比原始框架有更多的行来说明条件和 x,y 对的所有组合)。

最佳答案

就个人而言,我认为创建数据框并使用 geom_ribbon是优雅的解决方案,但显然意见会有所不同。

但如果你充分利用 胶合板 ggplot 事情会变得非常光滑。由于您的斜率和截距无论如何都很好地存储在数据框中,我们可以使用 胶合板和一个自定义函数来完成所有工作:

dat <- data.frame(cond1=c("a","a","b","b"),
cond2=c("c","d","c","d"),
x=c(1,5),
y=c(1,5),
sl=c(1,1.2,0.9,1.1),
int=c(0,0.1,0.1,0),
slopeU=c(1.1,1.3,1.2,1.2),
slopeL=c(.9,1,0.7,1))

genRibbon <- function(param,xrng){
#xrng is a vector of min/max x vals in original data
r <- abs(diff(xrng))
#adj for plot region expansion
x <- seq(xrng[1] - 0.05*r,xrng[2] + 0.05*r,length.out = 3)
#create data frame
res <- data.frame(cond1 = param$cond1,
cond2 = param$cond2,
x = x,
y = param$int + param$sl * x,
ymin = param$int + param$slopeL * x,
ymax = param$int + param$slopeU * x)
#Toss the min/max x vals just to be safe; needed them
# only to get the corresponding y vals
res$x[which.min(res$x)] <- -Inf
res$x[which.max(res$x)] <- Inf
#Return the correspondinng geom_ribbon
geom_ribbon(data = res,aes(x = x,y=y, ymin = ymin,ymax = ymax,
fill = cond1,colour = NULL),
alpha = 0.5)
}

ribs <- dlply(dat,.(cond1,cond2),genRibbon,xrng = c(1,5))

这里特别巧妙的是我完全丢弃了生成的数据帧,只返回了一个 geom_ribbon 的列表。对象。然后他们可以简单地添加到我们的情节中:
p + ribs + 
guides(fill = guide_legend(override.aes = list(alpha = 0.1)))

我覆盖了 alpha传说中的美学,因为你第一次看不到传说中的对角线。

enter image description here

我会警告你,生成图的最后一行也会抛出很多关于无效因子水平的警告,老实说,我不知道为什么。但是剧情看起来还可以。

关于r - ggplot2 - 在两个 geom_abline 层之间创建一个阴影区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9675403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com