2014-09-11 3 views
1

Я пытаюсь построить dataframe в ggplot, и у меня возникают проблемы с отображением точек и линий в нужном порядке.R: Порядок точек и линий в пределах geom в ggplot2

Данные разделяются на один и тот же столбец (из коэффициентов 0 или 1), и я хочу, чтобы 0 отображалось над 1 для обеих линий и точек (которые используют данные из 4 других отдельных столбцов).

Я сделал тестовый информационный фрейм ниже, чтобы проиллюстрировать мою мысль. У моего реального фрейма данных есть тысячи точек, и я хочу построить несколько фреймов данных, поэтому на самом деле не хочу использовать работу, например, подмножество моих данных и построение в виде отдельных слоев/геометрий.

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.

Любая идея, что здесь происходит и как я могу заставить это работать, будет оценена по достоинству.

Благодаря

ответ

0

После изучения ситуации в течение некоторого времени, это то, что я нашел и предложить. Короче говоря, я считаю, что решение заключается в присвоении значения от 2 до 0 в unclass().

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) 

Для того, чтобы назначить 2 в unclass() 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 имеет 2 в unclass().

#> 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

+0

Привет спасибо за вашу помощь, я очень надеюсь на ответ, который не включает в себя дробление данных вручную, как это simlification этого нужно просто, и мне нужно применить несколько раз и разбился на более чем 2 слоя. – user2738526

+0

Привет, я нашел способ. Но это заняло очень много времени. Мне также нужно многое объяснять. Пожалуйста, дайте мне немного времени. Спасибо. – jazzurro

+0

@ user2738526 Теперь я пересмотрел свой ответ. – jazzurro

Смежные вопросы