我们正在尝试使用ggplot2制作一个区域图,其中x轴上方的正面积分为一种颜色,负面积分为另一种颜色。
鉴于这个数据集,我想要一个区域图,在轴的每侧都有不同的颜色。
我可以看到一种将数据集分成两个子集的方法:一个是所有负值为零的正数,另一个是所有正值为零的负数,然后在同一轴上分别绘制这些子集,但似乎有更多适用于ggplot的方法。
在此问题中发布的解决方案没有给出准确的结果(如下所示)。
以下是正确显示为条形图的示例数据。 代码:
请看下文中由@baptiste和Kohske建议的终极答案。
鉴于这个数据集,我想要一个区域图,在轴的每侧都有不同的颜色。
我可以看到一种将数据集分成两个子集的方法:一个是所有负值为零的正数,另一个是所有正值为零的负数,然后在同一轴上分别绘制这些子集,但似乎有更多适用于ggplot的方法。
在此问题中发布的解决方案没有给出准确的结果(如下所示)。
以下是正确显示为条形图的示例数据。 代码:
# 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算法不是通用的
在其他问题上提出的RLE算法,在应用到我们的数据集时会产生与零点相关的伪像:
以下是生成该图的代码(请勿使用):
# 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建议的终极答案。