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