gpt4 book ai didi

r - 在 for 循环结构中时,Alpha ggplot2 不工作

转载 作者:行者123 更新时间:2023-12-04 11:28:01 28 4
gpt4 key购买 nike

我在 ggplot2 上迭代添加 geom_ribbon 层并确保色带透明时遇到问题。

如果我遵循手动/硬编码方法:

bla<-ggplot(plot_fcst)
bla<-bla+geom_line(aes(y=Optimal,x=week))
bla<-bla+geom_ribbon(aes(ymin=get(paste("lower",bands[1]*100,sep="")),ymax=get(paste("upper",bands[1]*100,sep="")),x=week),alpha=alp[1])
bla<-bla+geom_ribbon(aes(ymin=get(paste("lower",bands[2]*100,sep="")),ymax=get(paste("upper",bands[2]*100,sep="")),x=week),alpha=alp[2])
bla<-bla+geom_ribbon(aes(ymin=get(paste("lower",bands[3]*100,sep="")),ymax=get(paste("upper",bands[3]*100,sep="")),x=week),alpha=alp[3])

示例 Plot1:alpha 着色表现符合预期:

Example Plot1: alpha shading behaving as expected

但是如果我反复添加色带层,alpha 设置为匹配最暗的色带。因此,我认为问题不是在这里回答的问题:Alpha transparency not working in ggplot2?

bands <- seq(0.5,0.9,by=0.1)
alp <- seq(.3,.1,by=-0.05)

ggplot_fcst<-ggplot(plot_fcst)+geom_line(aes(y=Optimal,x=week))

for(i1 in 1:length(bands)){
ggplot_fcst<-ggplot_fcst+geom_ribbon(aes(ymin=get(paste("lower",bands[i1]*100,sep="")),ymax=get(paste("upper",bands[i1]*100,sep="")),x=week),alpha=alp[i1])
}

示例图 2:Alpha 错误地设置为匹配最高值:

Example plot2: Alpha wrongly set to match highest value

最佳答案

据我所知,您的问题与 alpha 值无关。我使用 economics 数据集创建了一些虚拟数据。您可以看到我在下面复制了您的代码:

library(ggplot2)

bands <- seq(0.5,0.9,by=0.1)
alp <- seq(.3,.1,by=-0.05)

data("economics")

plot_fcst <- data.frame(week = economics$date,
Optimal = economics$pce,
lower50 = economics$pce*0.8,
upper50 = economics$pce/0.8,
lower60 = economics$pce*0.7,
upper60 = economics$pce/0.7,
lower70 = economics$pce*0.6,
upper70 = economics$pce/0.6,
lower80 = economics$pce*0.5,
upper80 = economics$pce/0.5,
lower90 = economics$pce*0.4,
upper90 = economics$pce/0.4)

ggplot_fcst<-ggplot(plot_fcst)+geom_line(aes(y=Optimal,x=week))

for(i1 in 1:length(bands)){
ggplot_fcst <- ggplot_fcst+geom_ribbon(aes(ymin=get(paste("lower",bands[i1]*100,sep="")),ymax=get(paste("upper",bands[i1]*100,sep="")),x=week),alpha=alp[i1])
}

ggplot_fcst

现在,这个图看起来很像你的图,只有一条色带是可见的,而且它是错误的 alpha 级别。 ggplot2 让我们能够使用 ggplot_build 命令研究 ggplot 对象的结构。关于结果对象包含的内容,我不会在这里过多地详细介绍,但我们对 data 感兴趣。这为绘图中的每一层提供了一个表格,其中包含 ggplot 创建该层所需的所有信息。由于第一层是线,我们感兴趣的是1之后的线:

built <- ggplot_build(ggplot_fcst)

head(built$data[[2]])
#> x ymin ymax PANEL group colour fill size linetype alpha
#> 1 -915 202.96 1268.50 1 -1 NA grey20 0.5 1 0.3
#> 2 -884 204.20 1276.25 1 -1 NA grey20 0.5 1 0.3
#> 3 -853 206.52 1290.75 1 -1 NA grey20 0.5 1 0.3
#> 4 -823 205.16 1282.25 1 -1 NA grey20 0.5 1 0.3
#> 5 -792 207.24 1295.25 1 -1 NA grey20 0.5 1 0.3
#> 6 -762 210.32 1314.50 1 -1 NA grey20 0.5 1 0.3
head(built$data[[3]])
#> x ymin ymax PANEL group colour fill size linetype alpha
#> 1 -915 202.96 1268.50 1 -1 NA grey20 0.5 1 0.25
#> 2 -884 204.20 1276.25 1 -1 NA grey20 0.5 1 0.25
#> 3 -853 206.52 1290.75 1 -1 NA grey20 0.5 1 0.25
#> 4 -823 205.16 1282.25 1 -1 NA grey20 0.5 1 0.25
#> 5 -792 207.24 1295.25 1 -1 NA grey20 0.5 1 0.25
#> 6 -762 210.32 1314.50 1 -1 NA grey20 0.5 1 0.25

我们可以看到,对于第 2 层 (i1 = 1),alpha 正确设置为 0.3,而第 3 层 (i1 = 2) 的 alpha 为0.25。 yminymax 列显示了问题:两个色带具有相同的值。不是将 alpha 错误地设置为最高级别,而是每个层都有正确的 alpha,但 yminymax 变量被设置为 for 循环中的最后一个值。

ggplot 的惰性计算意味着 get 函数在您绘制图表之前不会被调用,此时它会查找 i1 的值并分配 lower90upper90 所有层。

您可以做的是完全摆脱 get 调用,并使用 aes_string 和粘贴调用:

ggplot_fcst<-ggplot(plot_fcst)+geom_line(aes(y=Optimal,x=week))

for(i1 in 1:length(bands)){
ggplot_fcst <- ggplot_fcst+geom_ribbon(aes_string(ymin=paste("lower",bands[i1]*100,sep=""),ymax=paste("upper",bands[i1]*100,sep=""),x="week"),alpha=alp[i1])
}

ggplot_fcst

关于r - 在 for 循环结构中时,Alpha ggplot2 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48884554/

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