Как создать фасетный график ggplot, где каждый фасет имеет упорядоченные данные?

Я хочу отсортировать свои факторы (условие, параметр и ИД субъекта) по среднему весу и построить график среднего веса по отношению к ИД субъекта таким образом, чтобы при фасетировании по условию и параметру средний вес отображался в порядке убывания. Вот мое решение, которое не дает мне того, что я хочу:

dataSummary <- structure(list(SubjectID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("s001", 
"s002", "s003", "s004"), class = "factor"), Condition = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("1", "2", "3"), class = "factor"), Parameter = structure(c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L), .Label = c("(Intercept)", "PrevCorr1", "PrevFail1"), class = "factor"), 
    MeanWeight = c(-0.389685536725783, 0.200987679398502, -0.808114314421089, 
    -0.10196105040707, 0.0274188815763494, 0.359978984195839, 
    -0.554583879312783, 0.643791202050396, -0.145042221940287, 
    -0.0144598460145723, -0.225804028997856, -0.928152539784374, 
    0.134025102103562, -0.267448309989731, -1.19980109795115, 
    0.0587152632631923, 0.0050656268880826, -0.156537446664213
    )), .Names = c("SubjectID", "Condition", "Parameter", "MeanWeight"
), row.names = c(NA, 18L), class = "data.frame")
## Order by three variables
orderWeights <- order(dataSummary$Condition, dataSummary$Parameter, dataSummary$SubjectID, -dataSummary$MeanWeight)
## Set factors to the new order. I expect this to sort for each facet when plotting, but it doesn't seem to work. 
conditionOrder <- dataSummary$Condition[orderWeights]
dataSummary$Condition <- factor(dataSummary$Condition, levels=conditionOrder)
paramOrder <- dataSummary$Parameter[orderWeights]
dataSummary$Parameter <- factor(dataSummary$Parameter, levels=paramOrder)
sbjOrder <- dataSummary$SubjectID[orderWeights]
dataSummary$SubjectID <- factor(dataSummary$SubjectID, levels=sbjOrder)
## Plot
ggplot(dataSummary, aes(x=MeanWeight, y=SubjectID)) + 
scale_x_continuous(limits=c(-3, 3)) + 
geom_vline(yintercept = 0.0, size = 0.1, colour = "#a9a9a9", linetype = "solid") + 
geom_segment(aes(yend=SubjectID), xend=0, colour="grey50") + 
geom_point(size=2) + 
facet_grid(Parameter~Condition, scales="free_y")

Я попробовал несколько других подходов, но они тоже не сработали:

dataSummary <- dataSummary[order(dataSummary$Condition, dataSummary$Parameter, dataSummary$SubjectID, -dataSummary$MeanWeight),]

или этот

dataSummary <- transform(dataSummary, SubjectID=reorder(Condition, Parameter, SubjectID, MeanWeight))

person arman    schedule 31.07.2013    source источник
comment
(1) Разве вы не заметили все предупреждения, выдаваемые вашим кодом? (2) То, что вы пытаетесь сделать, невозможно (с использованием огранки). Это потребует разного порядка оси Y для каждого ряда фасетов.   -  person joran    schedule 31.07.2013
comment
@joran, (1) я видел предупреждения и проигнорировал их после того, как не сразу понял, что они мне говорили. (2) Я ожидал, что scales='free' в facet_grid позволит мне иметь независимые шкалы для каждого графика. Хотите попробовать преобразовать ось Y в непрерывную переменную.   -  person arman    schedule 01.08.2013
comment
Все, что можно сделать с помощью свободных масштабов, — это позволить варьировать диапазоны. Но огранка по определению предназначена для случаев, когда масштабы практически одинаковы. Вы предлагаете совершенно разные порядки, следовательно, совершенно разные шкалы. Единственный известный мне вариант — использовать grid.arrange, как указано ниже.   -  person joran    schedule 01.08.2013
comment
Я понял. Спасибо.   -  person arman    schedule 01.08.2013


Ответы (1)


Вы можете заказать свои данные и построить их. Однако метки больше не соответствуют идентификаторам субъекта, а переупорядочены субъектам. Если это не то, что вы хотите, вы не можете использовать фасетирование, а должны строить части отдельно и использовать, например, grid.arrange для объединения разных графиков.

require(plyr)
## Ordered data
datOrder <- ddply(dataSummary, c("Condition", "Parameter"), function(x){
  if (nrow(x)<=1) return(x)
  x$MeanWeight <- x$MeanWeight[order(x$MeanWeight)]
  x
})
## Plot
ggplot(datOrder, aes(x=MeanWeight, y=SubjectID)) + 
  scale_x_continuous(limits=c(-3, 3)) + 
  geom_vline(yintercept = 0.0, size = 0.1, colour = "#a9a9a9", linetype = "solid") + 
  geom_segment(aes(yend=SubjectID), xend=0, colour="grey50") + 
  geom_point(size=2) + 
  facet_grid(Parameter~Condition) +
  scale_y_discrete(name="Ordered subjects")
person shadow    schedule 31.07.2013
comment
спасибо @shadow. Это близко к тому, что я хочу. Однако я также хотел, чтобы SubjectID соответствовал порядку. Я надеялся, что установка scales='free' в facet_grid позволит иметь независимые оси для каждого графика, но это может быть не так для факторов. Теперь я думаю преобразовать SubjectID из категориальной в непрерывную переменную и посмотреть, будет ли это работать с facet_grid. - person arman; 01.08.2013