2016-02-15 87 views
1

我试图通过本质上是关键值来绘制一些部分连续数据。下面是一个示例data.frame来说明问题。用ggplot在R中绘制不等长的离散群体

testDf <- data.frame("x1" = c(26.7, 33.0, 23.6, 18.4, 26.7, 75.0, 52.5, 51.5, 56.1, 60.1, 57.7, 37.6, 32.1, 47.7, 65.7, 55.9, 29.6, 32.1, 26.6, 19.3), 
"y1" = c(8.1, 3.5, 4.9, 24.6, 23.6, 2.8, 95.7, 93.9, 84.5, 83.0, 94.7, 74.4, 32.5, 6.7, 5.6, 40.7, 25.6, 16.5, 13.2, 22.6), 
"x2" = c(33.0, 23.6, 18.4, 26.7, 75.0, 77.2, 51.5, 56.1, 60.1, 57.7, 37.6, 32.1, 47.7, 65.7, 77.9, 58.0, 32.1, 26.6, 19.3, 22.2), 
"y2" = c(3.5, 4.9, 24.6, 23.6, 3.3, 3.1, 93.9, 84.5, 83.0, 94.7, 74.4, 32.5, 6.7, 5.6, 3.7, 43.3, 16.5, 13.2, 22.6, 24.3), 
"event" = c(8, 1, 1, 1, 1, 44, 8, 1, 1, 11, 12, 1, 1, 1, 36, 8, 8 , 1, 1, 12)) 

所以8这里是魔术数字。我需要从事件== 8的每一次出现开始。然后将所有的x,y对与段连接,直到下一个事件== 8(其他'事件'数字不重要,8是这些值用于过滤/重置目的)。

简而言之,这里有四个独立的集合。第1到第6行是一组连接的段;第7到15行是另一组段。第16行只是一个段。然后行16到20将是另一组连接段。

Df可能看起来有点混乱,但第n行的(x2,y2)值与第n + 1行的(x1,y1)值相同(8s除外)。只有一个例外,从第5行到第6行有一个小的不连续跃变。

我试图添加一个实际索引的列(在使用verboten'if'循环之前'rle'失败) ,使用重塑按这些索引进行分组,然后使用ggplot制作分段。但无数次尝试后我都无法获得我想要的融化Df。这似乎应该会更容易,但我有点难以理解如何在传递给ggplot之前将它们正确分组。

感谢您的任何帮助。

+0

你能否澄清你在寻求什么帮助(即你期望的结果是什么)?看起来你正在寻找一种方法来创建一个适当的指示变量来传递给ggplot的“group”审美,但是你的最后一段让我有点不确定它是否是你遇到的问题,或者你是否得到了在ggplot结尾的不明原因的行为。 – Empiromancer

+0

所以下面的答案是最直接的,但你的评论也是有帮助的。我试图使用reshape2从宽转换为长。但是没有得到我需要的结果。我完全忘了ggplot中的'group'。 – noLongerRandom

回答

2

您可以通过累计总和event == 8来获得组的指标变量。

testDf$ind <- cumsum(testDf$event == 8) 

这为您提供以下数据帧:

 x1 y1 x2 y2 event ind 
1 26.7 8.1 33.0 3.5  8 1 
2 33.0 3.5 23.6 4.9  1 1 
3 23.6 4.9 18.4 24.6  1 1 
4 18.4 24.6 26.7 23.6  1 1 
5 26.7 23.6 75.0 3.3  1 1 
6 75.0 2.8 77.2 3.1 44 1 
7 52.5 95.7 51.5 93.9  8 2 
8 51.5 93.9 56.1 84.5  1 2 
9 56.1 84.5 60.1 83.0  1 2 
10 60.1 83.0 57.7 94.7 11 2 
11 57.7 94.7 37.6 74.4 12 2 
12 37.6 74.4 32.1 32.5  1 2 
13 32.1 32.5 47.7 6.7  1 2 
14 47.7 6.7 65.7 5.6  1 2 
15 65.7 5.6 77.9 3.7 36 2 
16 55.9 40.7 58.0 43.3  8 3 
17 29.6 25.6 32.1 16.5  8 4 
18 32.1 16.5 26.6 13.2  1 4 
19 26.6 13.2 19.3 22.6  1 4 
20 19.3 22.6 22.2 24.3 12 4 

有了这些索引列,你应该能够使用GGPLOT2得到你正在寻找的图形。

+0

谢谢。我以前从来没有用过'cumsum'。箭的另一个箭头。 – noLongerRandom