R:ggplot2中geom中的点和线的顺序

时间:2014-09-11 02:33:18

标签: r ggplot2 levels factors

我正在尝试在ggplot中绘制一个数据框,并且无法按要求的顺序显示点和线。

数据基于相同的列(因子0或1)进行拆分,我希望0对于线和点(使用来自4个其他单独列的数据)绘制超过1的值。

我在下面做了一个测试数据框来说明我的观点。我的真实数据帧有数千个点,我想绘制一些数据帧,所以不要真正想要使用一种解决方法,例如将数据子集化并绘制为单独的图层/ geoms。

testdata <- data.frame(Split = c(rep(0,5), rep(1,5)), a = rep(1:5,2), 
      b = c(7,8,9,10,11,6,8,9,10,12), x = c(1:5, 1:5), y = c(1:3,5,6,1.1,2.1,4.1,5.1,7.1))
testdata$Split <- factor(testdata$Split)


ggplot(data = testdata)+
  geom_point(aes(x = x, y = y, colour = Split), size = 4)+
  geom_line(aes(x = a, y = b, colour = Split))

testdata$Split <- ordered(testdata$Split, levels = rev(levels(testdata$Split)))

当我运行代码行以反转我的关卡的顺序时,它会将我的哪些线条交换到前面,而不是哪一组点。因此,最初两个与Split = 0相关的点和线都落后了,但是当我颠倒顺序时,Split = 0的线是前面的(我想要的)但是Split = 0的点仍然在Split = 1的点后面。

任何想法在这里发生了什么,以及我如何让它工作将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

经过一段时间的调查,这是我发现和建议的。简而言之,我认为解决方案是在unclass()中将值2分配给0。

foo <- data.frame(split = rep(c("0", "1"), each = 5),
             a = rep(1:5,2), 
             b = c(7,8,9,10,11,6,8,9,10,12),
             x = c(1:5, 1:5),
             y = c(1:3,5,6,1.1,2.1,4.1,5.1,7.1),
             stringsAsFactors=F)

为了在分割中将unclass()中的2分配给0,我执行了以下操作。

foo <- arrange(foo, desc(split))
foo$split <- as.factor(foo$split)

#> str(foo)
#'data.frame':  10 obs. of  5 variables:
# $ split: Factor w/ 2 levels "0","1": 2 2 2 2 2 1 1 1 1 1
# $ a    : int  1 2 3 4 5 1 2 3 4 5
# $ b    : num  6 8 9 10 12 7 8 9 10 11
# $ x    : int  1 2 3 4 5 1 2 3 4 5
# $ y    : num  1.1 2.1 4.1 5.1 7.1 1 2 3 5 6

再一次,0在unclass()中有2个。

#> unclass(foo$split)
# [1] 2 2 2 2 2 1 1 1 1 1
#attr(,"levels")
#[1] "0" "1"

现在我运行以下内容。 q(对于积分)具有理想的结果。但是q2(对于线条)没有。

q <- ggplot(data = foo, aes(x = x, y = y, colour = split))+
     geom_point(size = 6)

q2 <- ggplot(data = foo, aes(x = a, y = b, colour = split))+
      geom_line()

所以,我颠倒了因子顺序,看看会发生什么。

### Reorder the factor levels.      
foo$split <- ordered(foo$split, rev(levels(foo$split)))

#> str(foo)
#'data.frame':  10 obs. of  5 variables:
#$ split: Ord.factor w/ 2 levels "1"<"0": 1 1 1 1 1 2 2 2 2 2
#$ a    : int  1 2 3 4 5 1 2 3 4 5
#$ b    : num  6 8 9 10 12 7 8 9 10 11
#$ x    : int  1 2 3 4 5 1 2 3 4 5
#$ y    : num  1.1 2.1 4.1 5.1 7.1 1 2 3 5 6

#> unclass(foo$split)
#[1] 1 1 1 1 1 2 2 2 2 2
#attr(,"levels")
#[1] "1" "0"

q3和q4都得到了正确的结果。

q3 <- ggplot(data = foo, aes(x = x, y = y, colour = split))+
      geom_point(size = 6)

q4 <- ggplot(data = foo, aes(x = a, y = b, colour = split))+
      geom_line()

所以,这是最终形式。

ggplot(data = foo)+
  geom_point(aes(x = x, y = y, colour = split), size = 6)+
  geom_line(aes(x = a, y = b, colour = split))

enter image description here