2015-07-15 6 views
3

У меня есть следующие данные:Изменение порядка размещения в ggplot уложены области графа

df <- as.data.frame(c(rep(1,3),rep(2,3),rep(3,3))) 
names(df) <- "cont_var" 
df$factor_var <- as.factor(rep(c("fac1","fac2","fac3"),3)) 
df$prop <- c(10,20,70,20,30,50,25,40,35) 

Уровни «factor_var» быть:

> levels(df$factor_var) 
[1] "fac1" "fac2" "fac3" 

Я делаю площадь участка сложены, используя следующие:

library(ggplot) 
ggplot(df, aes(x=cont_var, y=prop, fill=factor_var)) + 
    geom_area(colour="black",size=.2, alpha=.8) + 
    scale_fill_manual(values=c("blue", "grey", "red")) 

который возвращает следующий результат: enter image description here

Легенда показывает, что «factor_var» упорядочен по уровням, видимым ранее, но области не сложены в том же порядке. Как я могу создать выход с красным внизу, а затем серый, а затем синий, как и в легенде?

(. NB Это порядок мне нужно (factor_var будет упорядоченным переменным), это не только случай согласования штабелирования к порядку легенды по эстетическим причинам.)

EDIT: Желаемый результат, показанным ниже

enter image description here

РЕШЕНИЕ !!

переупорядочивая dataframe необходимо создать желаемый результат:

newdata <- df[order(df$cont_var, df$factor_var),] 

Большое спасибо за вашу помощь.

ответ

5

Вы можете изменить порядок вашей легенды, добавляя guides(fill = guide_legend(reverse=TRUE)) к коду:

ggplot(dat, aes(x=cont_var, y=prop, fill=factor_var)) + 
    geom_area(colour="black",size=.2, alpha=.8) + 
    scale_fill_manual(values=c("blue", "grey", "red")) + 
    guides(fill = guide_legend(reverse=TRUE)) 

это дает:

enter image description here


В качестве альтернативы, вы можете установить фактор-уровни до вашего участка:

# manually ordering the factor levels 
dat$factor_var2 <- factor(dat$factor_var, levels=c("fac3","fac2","fac1")) 
# automatcally ordering the factor levels (copied from Jakub P's answer) 
dat$factor_var2 <- factor(dat$factor_var, sort(unique(dat$factor_var), decreasing = TRUE)) 

ggplot(dat, aes(x=cont_var, y=prop, fill=factor_var2)) + 
    geom_area(colour="black",size=.2, alpha=.8) + 
    scale_fill_manual(values=c("blue", "grey", "red")) 

это дает:

enter image description here

+0

Это работает для приведенного выше примера. Однако мои реальные данные немного сложнее - в легенде есть 9 уровней, которые находятся в правильном порядке, но на самом деле построены в порядке (снизу вверх): уровни 5, 4, 3, 2, 1, 6 , 7, 8, 9. Извините, я не могу воспроизвести его именно здесь, мои данные чувствительны. – user2568648

+0

@ user2568648 см. Обновление – Jaap

+0

С обновлением и 'levels (dat $ factor_var)' уровни находятся в том порядке, который я хотел бы выполнить для укладки, но уровень 5 по-прежнему отображается внизу! – user2568648

1

бы эту работу?

df$factor_var <- rep(c("fac1","fac2","fac3"),3) 
df$factor_var <- factor(df$factor_var, sort(unique(df$factor_var), decreasing = T)) 

На тестовых данных вы предложили это производит последовательный результат fac1 быть красным, а в нижней части, и т.д.

+0

Как и в случае с предложением Яапса, это переупорядочивает факторы, поскольку я хотел бы их построить, подтвержденными «уровнями (df $ factor_var)», но уровень 5 по-прежнему отображается внизу! – user2568648

+0

В приведенном примере фактически значения fac3 должны быть внизу и fac1 вверху, а не порядки цветов, которые необходимо изменить, а порядок значений - см. Добавленный второй график (сделанный путем манипулирования значениями). – user2568648

+0

Хорошо, я вас неправильно понял. Ваше решение (закажите файл data.frame) заставляет меня задуматься об общем заключении, которое я пришел к нескольким месяцам: мне пришлось сортировать факторы, метки и данные (все три), чтобы получить желаемый результат. Отсутствие одного из них почти всегда приводило к чему-то грязному на графике. –