gpt4 book ai didi

r - 根据值填充曲线下面积

转载 作者:行者123 更新时间:2023-12-02 11:00:00 24 4
gpt4 key购买 nike

我们正在尝试使用 ggplot2 绘制面积图,其中 x 轴上方的正区域是一种颜色,负区域是另一种颜色。

给定这个数据集,我想要一个面积图来在轴的每一侧绘制不同颜色的阴影。

我可以找到一种方法将数据集分为两个子集,一个是正数,所有负值都为零,一个是负数,所有正值都为零,然后将它们分别绘制在同一轴上,但似乎有将是一种更像 ggplot 的方式来做到这一点。

解决方案发布于 this question没有给出准确的结果(见下文)。

以条形图形式准确显示的示例数据

Raw data

由此代码生成:

# create some fake data with zero-crossings
yvals=c(2,2,-1,2,2,2,0,-1,-2,2,-2)
test = data.frame(x=seq(1,length(yvals)),y=yvals)

# generate the bar plot
ggplot(data=test,aes(x=x,y=y))
+ geom_bar(data=test[test$y>0,],aes(y=y), fill="blue",stat="identity", width=.5)
+ geom_bar(data=test[test$y<0,],aes(y=y), fill="red",stat="identity", width=.5)

RLE 方法并不通用

the other question 上提出的 RLE 方法当应用于我们的数据集时,会产生与零交叉相关的工件:

Ribbon RLE plot

由以下代码生成(不要使用):

# set up grouping function
rle.grp <- function(x) {
xx <- rle(x)
xx$values = seq_along(xx$values)
inverse.rle(xx) }

# generate ribbon plot
ggplot(test, aes(x=x,y=y,group = factor(rle.grp(sign(y))))) +
geom_ribbon(aes(ymax = pmax(0,y),ymin = pmin(0,y),
fill = factor(sign(y), levels = c(-1,0,1), labels = c('-','0','+'))))
+ scale_fill_brewer(name = 'sign', palette = 'RdBu')

请参阅下面@baptiste 和 Kohske 建议的最终答案。

最佳答案

根据 @baptiste 的评论(已删除),我想说这是最好的答案。它基于this post由科斯克。它在零交叉处将新的 x-y 对添加到数据集,并生成下面的图:

# create some fake data with zero-crossings
yvals = c(2,2,-1,2,2,2,0,-1,-2,2,-2)
d = data.frame(x=seq(1,length(yvals)),y=yvals)

rx <- do.call("rbind",
sapply(1:(nrow(d)-1), function(i){
f <- lm(x~y, d[i:(i+1),])
if (f$qr$rank < 2) return(NULL)
r <- predict(f, newdata=data.frame(y=0))
if(d[i,]$x < r & r < d[i+1,]$x)
return(data.frame(x=r,y=0))
else return(NULL)
}))
d2 <- rbind(d,rx)
ggplot(d2,aes(x,y)) + geom_area(data=subset(d2, y<=0), fill="pink")
+ geom_area(data=subset(d2, y>=0), fill="lightblue") + geom_point()

生成以下输出: example plot

关于r - 根据值填充曲线下面积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17959817/

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