2012-07-13 145 views
5

多行我想要绘制多行,如GGPLOT2一个“类”的一部分。我可以绘制类似如下:ggplot:一种颜色/

image with 5 classes

但我的问题是,我想说明N1,N2和N3作为一个单独的类(灰色细线每个在图例一个名字) 。

我的问题是,如果我在数据框中创建一个新因子以便将它们分组,我最终将从n1(右上角)的末端到n2(左下角)的开头绘制添加连接,加在我的图对角线:

graph with one class

这更接近我想要的东西,但有额外的对角线。如果它很重要,我使用ROCR计算这些值,然后从结果performance对象中提取x和y点,以产生这些行。

+1

如果您提供最小可重现的示例(数据+代码),这将更容易回答。 – joran 2012-07-13 21:13:10

+0

我同意。不幸的是,我担心重现这样一个例子所需的代码会占用比实际问题更多的空间。我希望有人能够认识到这个理论,并且之前已经看到了解决这个问题的方法。 – 2012-07-13 21:19:38

+1

我不明白没有可重复的例子的问题,但在我看来,在第二个情节中,你可以使用与第一个情节相同的变量来指定“组”美学和颜色的新因素。 – baptiste 2012-07-13 22:31:43

回答

1

这里有一种方法,但我不认为你会非常喜欢它:

d1 <- data.frame(x = 1:10, 
       y = rep(1:2,each = 5), 
       grp = factor(rep(letters[1:2],each = 5),levels = letters[1:3])) 
d1 <- rbind(d1,data.frame(x = 1:2,y = c(NA,NA),grp = c('c','c'))) 

d2 <- data.frame(x = 1:15, 
       y = rep(3:5,each = 5), 
       grp = rep(1:3,each = 5)) 

ggplot() + 
    geom_line(data = d1,aes(x = x,y = y,group = grp,colour = grp)) + 
    geom_line(data = d2,aes(x = x,y = y,group = grp),colour = "blue") 

enter image description here

请注意,您的解决方案不会与其他类型的数据很好地工作。恰好在图例中你想要合并成同一类别的三条线中的每条线都开始和结束于基本相同的位置。如果情况并非如此,最终会出现不必要的连接线。

上面的方法将更普遍地工作,但正如你所看到的并不难。如果有的话更不方便。

这种问题已经出现了很多次,可能是我忘记了一个更简单的解决方案。但总的来说,请记住,与基本图形相比,您无需手动构建每个图例,而是(通常但不总是)牺牲了一些灵活性,以换取ggplot2

+0

谢谢!我会第一个承认我的解决方案不应该被普遍采用。这是一个很好的解决方案 - 在ggplot2中讲授关于图层的新东西 - 但我同意它不太理想。我想我可能会更适合这种情况的'lines',但是我已经使用ggplot2格式化了其余的图形,所以我现在要在一致性方面超过方便。再次感谢。 – 2012-07-13 21:43:21

0

当我试图绘制该图时,我已经将rbind'物品从ROCR performance对象直接转换为data.frame。我意识到我可以通过颠倒中产阶级数据的顺序来减少从右上角到左下角的旅程。即

n1 <- getPerformance(test1) 
n2 <- getPerformance(test2) 
n3 <- getPerformance(test3) 

将创建3个数据帧寻找像

type x   y 
1 n1 0 0.000000000 
2 n1 0 0.003448276 
3 n1 0 0.006896552 
4 n1 0 0.010344828 
5 n1 0 0.013793103 
6 n1 0 0.017241379 
... 
26565 n1 0.9999619 1 
26566 n1 1.0000000 1 

这里的问题是,当我rbind N1到n2,我会N1的点(1,1)连接到N2的点( 0,0) - 创建对角线。

在我的情况下,一个(草率)解决方案是只扭转每隔一行的顺序,以便没有对角线。

n2_rev <- n2[nrow(n2):1,] 
ns <- rbind(n1,n2_rev,n3) 

所以现在行云,而不是开始回往复,并在同一位置始终结束,创建如下图:

desired graph

尽管如此,我认为有一个更普遍处理这个问题的方法。有没有一种方法可以将一条线添加到ggplot2图中,例如基准R的lines()函数?