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