【发布时间】:2011-11-23 00:39:32
【问题描述】:
我正在编辑这个以提供一个更好的例子来说明我需要什么。如果有帮助,我会将原始消息保留在底部。
我有以下数据:
x=c(1,2,7,3,4,8,9,5,6,7,11,13,15,8,9,10,11,12,13,15)
y=c(2:10,9,8,7,6,8,10,11,12,13,14,1)
date=strptime(20010101:20010120,'%Y%m%d')
z=data.frame(date,x,y)
z$diff=z$y-z$x
z$min=pmin(x,y)
z$max=pmax(x,y)
所以我的数据是这样的:
date x y diff min max
1 2001-01-01 1 2 1 1 2
2 2001-01-02 2 3 1 2 3
3 2001-01-03 7 4 -3 4 7
4 2001-01-04 3 5 2 3 5
5 2001-01-05 4 6 2 4 6
6 2001-01-06 8 7 -1 7 8
7 2001-01-07 9 8 -1 8 9
8 2001-01-08 5 9 4 5 9
9 2001-01-09 6 10 4 6 10
10 2001-01-10 7 9 2 7 9
11 2001-01-11 11 8 -3 8 11
12 2001-01-12 13 7 -6 7 13
13 2001-01-13 15 6 -9 6 15
14 2001-01-14 8 8 0 8 8
15 2001-01-15 9 10 1 9 10
16 2001-01-16 10 11 1 10 11
17 2001-01-17 11 12 1 11 12
18 2001-01-18 12 13 1 12 13
19 2001-01-19 13 14 1 13 14
20 2001-01-20 15 1 -14 1 15
我想创建一个多边形图,其中多边形的颜色会根据 z$diff 小于零的时间而变化。所以情节应该是这样的:
我知道线段可以用线做到这一点,但不幸的是我需要用多边形来做到这一点。
原文:
假设我有这些数据:
x=rnorm(100)
y=rnorm(100)
date=strptime(20010101:20010410,'%Y%m%d')
date=date[complete.cases(date)]
z=data.frame(date,x,y)
z$max=apply(z[2:3],1,which.max)
z$min=apply(z[2:3],1,which.min)
z$v=z$max-z$min
w=z[z$v<0,]
然后我尝试制作一个由两种颜色组成的多边形,一种用于 x>y 时,另一种用于 y>x 时。我这样做:
plot(z$date,z$x,type='n')
polygon(c(z$date,z$date[nrow(z):1]),c(z$x,z$y[nrow(z):1]),col='skyblue',border=NA)
polygon(c(w$date,w$date[nrow(w):1]),c(w$x,w$y[nrow(w):1]),col='salmon',border=NA)
当数据框w 中存在间隙时,多边形会覆盖这些间隙。我知道如何使用clip来裁剪一个区域,但是它可以用来裁剪数据框中的多个间隙吗?
理想情况下,w 多边形应在 y>x 时与 z 多边形重叠。
【问题讨论】:
-
是的。每次您的多边形遇到具有 NA 值的行时,它都会剪辑。我用你的数据试过了,它原则上是有效的,但我无法弄清楚你的数据操作,所以没有发布答案。
-
我不确定这是否正确。如果我理解查询者想要什么,它最终会变成多个多边形,一个对应于 z 中 z$v0 行之间有 v
-
啊,棘手的一点是您必须颠倒每个段中 y 值的顺序 - 颠倒整个向量是行不通的。
-
Spacedman,我将边框从 NA 更改为相应的颜色,以处理只有一行的多边形。是的,
w数据框将需要某种方式来反转段。我想如果所有其他方法都失败了,我将求助于找出一种方法,从每个连续的行系列中制作多个数据框,然后从中制作多个多边形。不过,我的数据可以追溯到 1960 年,我真的很想避免这种情况。 -
Andrie,对不起,我对 R 很陌生,我的数据操作还有很多不足之处。基本上,我为此示例创建了两组随机数,创建了一个日期字段,然后由于某种原因消除了几个月之间得到的 NA。然后我将所有这些都放在一个数据框中,并确定 y 是否大于 x。我的实际数据中有两列以上,这就是我选择最大值和最小值的原因。如果 x 更大,我希望这些多边形的颜色与 y 更大时不同。希望这让它更清楚一点。我可能不应该在这个例子中使用随机数。