ggplot:一个Color / class的多行

时间:2012-07-13 21:07:41

标签: r ggplot2

我正在尝试将多行绘制为ggplot2中单个“类”的一部分。我可以绘制如下内容:

image with 5 classes

但我的问题是我想将n1,n2和n3显示为单个类(图例中每个名称都有灰色细线)。

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

graph with one class

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

2 个答案:

答案 0 :(得分: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 ,无需手动构建每个图例,与基本图形相比,您(经常但并非总是)牺牲了一些灵活性。

答案 1 :(得分:0)

在尝试绘制此图时,我将{ROCR rbind对象中的项目performance直接放入data.frame中。我意识到我可以通过颠倒中间类数据的顺序来切断从右上角到左下角的行程。即。

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

会创建三个看起来像

的数据框
  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

这里的问题是当我将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()函数?