переупорядочивание сложенного geom_bar

Я впервые задаю вопрос здесь, поэтому, пожалуйста, не торопитесь! Как вы увидите из моего примера кода, я тоже новичок в R (3 месяца), поэтому мне немного неловко показывать его! У меня довольно конкретное требование, но может быть лучший способ визуализировать его. У нас есть люди в регионах, которые несколько раз отвечали на вопросы, и мы хотим сравнить первый и самый последний ответы. Ответы в основном по шкале от 1 до 5, но я оставил их как многословные (от полностью недостаточных до полностью достаточных). Я хочу отображать «худшие» ответы как отрицательные, хорошие - как положительные, а средний ответ («Довольно недостаточный») разделить пополам, чтобы промежуточная точка была как бы сосредоточена на сюжете (я понимаю? ! Ниже приведен образец графика). Я также хочу сгруппировать по региону и по тому, будет ли это первый или последний ответ. Если я построю 2 отдельных фрейма данных, тогда диаграмма будет выглядеть хорошо, но я не могу упорядочить легенду. Если я объединяю фреймы данных, легенда выглядит хорошо, но диаграмма идет не так! Пожалуйста помоги!

# Input load
`dataset` = readr::read_csv("FirstLast,AnswerCount,Answer,Region
                 First,10,Completely Insufficient,North
                 First,3,Completely Insufficient,South
                 Last,5,Completely Insufficient,North
                 Last,1,Completely Insufficient,South
                 First,8,Mostly Insufficient,North
                 First,2,Mostly Insufficient,South
                 Last,9,Mostly Insufficient,North
                 Last,2,Mostly Insufficient,South
                 First,14,Quite Insufficient,North
                 First,3,Quite Insufficient,South
                 Last,19,Quite Insufficient,North
                 Last,7,Quite Insufficient,South
                 First,26,Mostly Sufficient,North
                 First,9,Mostly Sufficient,South
                 Last,44,Mostly Sufficient,North
                 Last,17,Mostly Sufficient,South
                 First,8,Completely Sufficient,North
                 First,3,Completely Sufficient,South
                 Last,16,Completely Sufficient,North
                 Last,3,Completely Sufficient,South")
require("dplyr")
library(dplyr)
require("ggplot2")
library(ggplot2)
require("tidyr")
library(tidyr)
require("stringr")
library(stringr)
require("formattable")
library(formattable)

# split mid answer for First reviews
Reviews.First.four <- filter(Reviews.Sums, FirstLast == "First", Answer=="Quite Insufficient") %>% mutate(AnswerCount=as.numeric(AnswerCount/2))
Reviews.First.rest <- filter(Reviews.Sums, FirstLast == "First", Answer != "Quite Insufficient")
Reviews.First <- full_join(Reviews.First.four, Reviews.First.rest) %>% arrange(Answer)
Reviews.First <- mutate(Reviews.First, RegRev = paste(Region, FirstLast))

# split mid answer for Last reviews
Reviews.Last.four <- filter(Reviews.Sums, FirstLast == "Last", Answer=="Quite Insufficient") %>% mutate(AnswerCount=as.numeric(AnswerCount/2))
Reviews.Last.rest <- filter(Reviews.Sums, FirstLast == "Last", Answer !="Quite Insufficient")
Reviews.Last <- full_join(Reviews.Last.four, Reviews.Last.rest) %>% arrange(Answer)
Reviews.Last <- mutate(Reviews.Last, RegRev = paste(Region,FirstLast))

# Split data into negative and positive scores
Reviews.First.Neg <- Reviews.First %>% 
filter (Answer == "Completely Insufficient" | Answer == "Mostly Insufficient" | Answer == "Quite Insufficient") %>% 
mutate(AnswerCount = AnswerCount *-1)
Reviews.First.Pos <- Reviews.First %>% 
filter (Answer == "Quite Insufficient" | Answer == "Mostly Sufficient" | Answer == "Completely Sufficient") 

Reviews.Last.Neg <- Reviews.Last %>% 
filter (Answer == "Completely Insufficient" | Answer == "Mostly Insufficient" | Answer == "Quite Insufficient") %>% 
mutate(AnswerCount = AnswerCount *-1)
Reviews.Last.Pos <-Reviews.Last %>% 
filter (Answer == "Quite Insufficient" | Answer == "Mostly Sufficient" | Answer == "Completely Sufficient") 

# Reorder factors (or try to anyway!)
Reviews.First.Neg$Answer <- factor(Reviews.First.Neg$Answer, levels=c("Completely Insufficient", "Mostly Insufficient", "Quite Insufficient"))
Reviews.First.Pos$Answer <- factor(Reviews.First.Pos$Answer, levels=rev(c("Quite Insufficient", "Mostly Sufficient", "Completely Sufficient")))
Reviews.Last.Neg$Answer <- factor(Reviews.Last.Neg$Answer, levels=c("Completely Insufficient", "Mostly Insufficient", "Quite Insufficient"))
Reviews.Last.Pos$Answer <- factor(Reviews.Last.Pos$Answer, levels=rev(c("Quite Insufficient", "Mostly Sufficient", "Completely Sufficient")))
# Other thing I tried was to order both factors same before union-ing them - plot Reviews.all instead of the separate First.Pos and First.Neg and still no joy - sad smiley 
#Reviews.First.Neg$Answer <- factor(Reviews.First.Neg$Answer, levels=c("Completely Insufficient", "Mostly Insufficient", "Quite Insufficient", "Mostly Sufficient", "Completely Sufficient"))
#Reviews.First.Pos$Answer <- factor(Reviews.First.Pos$Answer, levels=c("Completely Insufficient", "Mostly Insufficient", "Quite Insufficient", "Mostly Sufficient", "Completely Sufficient"))
#Reviews.all <- union(Reviews.First.Neg, Reviews.First.Pos)
#Reviews.all$Answer = factor(Reviews.all$Answer, levels=c("Completely Insufficient", "Mostly Insufficient", "Quite Insufficient", "Mostly Sufficient", "Completely Sufficient"))

# and plot!
ggplot() + 
# geom_bar(data=Reviews.all, aes(x=RegRev, y=AnswerCount, fill=Answer), stat="identity", position = "stack") +
geom_bar(data=Reviews.First.Neg, aes(x=RegRev, y=AnswerCount, fill=Answer), stat="identity", position = "stack") +
geom_bar(data=Reviews.First.Pos, aes(x=RegRev, y=AnswerCount, fill=Answer), stat="identity", position = "stack") +
geom_bar(data=Reviews.Last.Neg, aes(x=RegRev, y=AnswerCount, fill=Answer), stat="identity", position = "stack") +
geom_bar(data=Reviews.Last.Pos, aes(x=RegRev, y=AnswerCount, fill=Answer), stat="identity", position = "stack") +
coord_flip() + 
theme_minimal() + 
scale_fill_manual(values = c("#d7191c","#fdae61","#ffffbf","#abdda4","#2b83ba"))+
theme(
legend.position = "top"
) +
guides(fill = guide_legend(nrow = 2, byrow=TRUE))

TL; DR - я ужасен в R. Любая помощь очень ценится.

Если я построю 2 отдельных фрейма данных, тогда диаграмма будет выглядеть хорошо, но я не могу упорядочить легенду. < / а>

Если я объединю фреймы данных (в данном случае только для First), легенда выглядит хорошо, но диаграмма идет не так ! Ох!


person slado    schedule 31.05.2018    source источник
comment
stackoverflow.com/questions/ 25664007 / или stackoverflow.com/questions/50256172/ любая помощь?   -  person A Duv    schedule 31.05.2018
comment
Я не видел второй, и он выглядит многообещающим, я попробую и дам вам знать ... Спасибо   -  person slado    schedule 31.05.2018
comment
Без проблем. Возможно, вы захотите изучить adv-r.had.co.nz/Functional- Programming.html, чтобы сделать код менее подробным. Кроме того, вы можете объединить свои данные в один большой фрейм данных и попробовать это вместо   -  person A Duv    schedule 31.05.2018
comment
Я почти уверен, что это дубликат второй ссылки, которую я опубликовал ранее, поскольку решение было практически таким же. Если у вас есть какие-либо дополнительные вопросы, просто нажмите lmk, и мы сможем ответить на них здесь, прежде чем закрыть это. Между прочим, отличный код   -  person A Duv    schedule 01.06.2018
comment
Черт побери, спасибо за это. Я отсутствовал последние пару дней, так что займусь этим завтра и обязательно доложу. Похоже, что это ответ на вопрос о перерывах. Спасибо   -  person slado    schedule 03.06.2018


Ответы (1)


Дайте мне знать, если вам тоже нужны другие настройки или что-то еще.

    Reviews.comb <- bind_rows(Reviews.Last.Pos, Reviews.Last.Neg, Reviews.First.Pos, Reviews.First.Neg)

    cols <- c("#d7191c","#fdae61","#ffffbf","#abdda4","#2b83ba")
    ord <- c("Completely Insufficient", "Mostly Insufficient", "Quite Insufficient", "Mostly Sufficient", "Completely Sufficient")

    ggplot() + geom_bar(data=Reviews.comb, aes(x=RegRev, y=AnswerCount, fill=Answer), stat="identity", position = "stack") +
      coord_flip() + 
      theme_minimal() + 
      scale_fill_manual(breaks = ord, values = cols) +
      theme(
        legend.position = "top") +
      guides(fill = guide_legend(nrow = 2, byrow=TRUE)) + 
      labs(x = "Answer Count", y = "Reg Rev") + expand_limits(y = c(-50, 50))

ОБНОВЛЕНИЕ: я добавил expand_limits, чтобы попытаться центрировать гистограммы около 0.

Я также сравнил вашу команду union с bind_rows эквивалентом (bind_rows(Reviews.First.Pos, Reviews.First.Neg)); только порядок был другим. Вероятно, это то, что изменило порядок графиков. Часть перерывов должна изменить порядок ваших графиков за вас.

person A Duv    schedule 01.06.2018
comment
Извините за то, что я замолчал - мне пришлось заняться другими делами, которые имели приоритет. Большое спасибо за вашу помощь, мне явно не хватает многих основ! Bind_rows, казалось, дали мне то, что я хотел, так что спасибо вам за это. - person slado; 06.06.2018
comment
Без проблем! Не забудьте также проверить шпаргалки и виньетки для своих пакетов; они могут быть на удивление полезными! - person A Duv; 06.06.2018