Упорядочить facet_grid по столбцу без фасета (и метки с использованием столбца без фасета) - PullRequest
4 голосов
/ 15 марта 2010

У меня есть пара вопросов относительно фасетирования в ggplot2 ...

Допустим, у меня есть запрос, который возвращает данные, которые выглядят так:

(обратите внимание, что он упорядочен по рангу asc, Alarm asc и две сигнализации имеют ранг 3, потому что их итоги = 1798 за неделю 4, а ранг устанавливается в соответствии с итогом за неделю 4)

   Rank Week                      Alarm Total
      1    1      BELTWEIGHER HIGH HIGH  1000
      1    2      BELTWEIGHER HIGH HIGH  1050
      1    3      BELTWEIGHER HIGH HIGH   900
      1    4      BELTWEIGHER HIGH HIGH  1800
      2    1              MICROWAVE LHS   200
      2    2              MICROWAVE LHS  1200
      2    3              MICROWAVE LHS   400
      2    4              MICROWAVE LHS  1799
      3    1  HI PRESS FILTER 2 CLOG SW  1250
      3    2  HI PRESS FILTER 2 CLOG SW  1640
      3    3  HI PRESS FILTER 2 CLOG SW  1000
      3    4  HI PRESS FILTER 2 CLOG SW  1798
      3    1 LOW PRESS FILTER 2 CLOG SW   800
      3    2 LOW PRESS FILTER 2 CLOG SW  1200
      3    3 LOW PRESS FILTER 2 CLOG SW   800
      3    4 LOW PRESS FILTER 2 CLOG SW  1798

(код дублирования ниже)

Rank = c(rep(1,4),rep(2,4),rep(3,8))
Week = c(rep(1:4,4))
Total = c(  1000,1050,900,1800,
        200,1200,400,1799,
        1250,1640,1000,1798,
        800,1200,800,1798) 
Alarm = c(rep("BELTWEIGHER HIGH HIGH",4),  
        rep("MICROWAVE LHS",4), 
        rep("HI PRESS FILTER 2 CLOG SW",4), 
        rep("LOW PRESS FILTER 2 CLOG SW",4)) 
spark <- data.frame(Rank, Week, Alarm, Total) 

Теперь, когда я делаю это ...

s <- ggplot(spark, aes(Week, Total)) +          
     opts( 
        panel.background = theme_rect(size = 1, colour = "lightgray"), 
        panel.grid.major = theme_blank(), 
        panel.grid.minor = theme_blank(), 
        axis.line = theme_blank(), 
        axis.text.x = theme_blank(), 
        axis.text.y = theme_blank(), 
        axis.title.x = theme_blank(), 
        axis.title.y = theme_blank(),  
        axis.ticks = theme_blank(), 
        strip.background = theme_blank(), 
        strip.text.y = theme_text(size = 7, colour = "red", angle = 0) 
    ) 

s + facet_grid(Alarm ~ .) + geom_line() 

Я получаю это ...

альтернативный текст http://img101.imageshack.us/img101/9103/ss20100315112108.png

Обратите внимание, что это огранено согласноТревога и что грани расположены в алфавитном порядке.

Два вопроса:

  1. Как я могу держать его ограненным по тревоге, но отображенным в правильном порядке?(Ранг asc, Тревога asc).

альтернативный текст http://img17.imageshack.us/img17/6986/ss20100315113243.png

Кроме того, как я могу сохранить его ограненным с помощью Alarm, но показывать метки от Rank вместо Alarm?

alt text http://img85.imageshack.us/img85/470/ss20100315113529.png

Обратите внимание, что я не могу просто фасетироватьна ранге, потому что ggplot2 будет видеть только 3 аспекта для построения там, где на самом деле есть 4 различных сигнала тревоги.

1 Ответ

6 голосов
/ 15 марта 2010

Чтобы ответить на ваш первый вопрос: вы можете просто изменить порядок уровней факторов, чтобы они больше не были в алфавитном порядке, например:

spark$Alarm<-factor(spark$Alarm, levels(spark$Alarm)[c(1,4,2,3)])

Что касается второго вопроса, вы можете написать свою собственную функцию labeller, чтобы связать Alarms and Ranks, что-то вроде

lbl.fn <- function(variable, value) {  paste(spark$Rank[which(as.character(spark$Alarm)==as.character(value))],as.character(value)) }
s + facet_grid(Alarm ~ ., labeller="lbl.fn") + geom_line()
...