переупорядочение сложенного geom_bar - PullRequest
0 голосов
/ 31 мая 2018

Я впервые задаю вопрос здесь, так что, пожалуйста, будьте спокойны!Как вы увидите из моего примера кода, я тоже новичок в 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))

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

Если я построю 2 отдельных кадра данных, тогда диаграмма выглядит хорошо, но я могуне упорядочить легенду.

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

1 Ответ

0 голосов
/ 01 июня 2018

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

    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.

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

...