Cum modificați graficul de bare stivuite în ggplot2 astfel încât să fie divergentă (Programare, R, Ggplot2, Likert)

Fbj9506 a intrebat.
a intrebat.

Datele mele (de la o întrebare pe scară likert) arată astfel:

head(dat)
            Consideration Importance2           Importance  Percent Count
1         Aesthetic value           1 Not at all important 0.046875     3
2         Aesthetic value           2 Of little importance 0.109375     7
3         Aesthetic value           3 Moderately important 0.250000    16

dput(head(dat,6))
structure(list(Consideration = structure(c(2L, 2L, 2L, 2L, 2L, 
12L), .Label = c("", "Aesthetic value", "Affordability/cost-efficiency", 
"Climate change reduction", "Eco-sourcing", "Ecosystem services provision", 
"Erosion mitigation", "Habitat for native wildlife", "Habitat/species conservation", 
"Human use values", "Increasing biodiversity", "Planting native species", 
"Restoring ecosystem function", "Restoring to a historical state"
), class = "factor"), Importance2 = c(1L, 2L, 3L, 4L, 5L, 1L), 
    Importance = structure(c(4L, 5L, 3L, 2L, 6L, 4L), .Label = c("", 
    "Important", "Moderately important", "Not at all important", 
    "Of little importance", "Very Important"), class = "factor"), 
    Percent = c(0.046875, 0.109375, 0.25, 0.375, 0.234375, 0), 
    Count = c(3L, 7L, 16L, 24L, 15L, 0L), percentage = c(5L, 
    11L, 25L, 38L, 23L, 0L)), row.names = c(NA, 6L), class = "data.frame")

Am trasat rezultatele folosind un grafic cu bare stivuite. Aș dori să știu cum să modific acest lucru, astfel încât să fie un grafic de bare stivuite divergente, cum ar fi exemplul prezentat mai jos, cu nivelul de Importanță2 3 (moderat important) ca centru.

Știu că există un pachet numit likert care poate fi folosit pentru acest lucru, dar cred că datele mele nu sunt în formatul corect.

Codul pentru graficul meu existent este:

ggplot(dat, aes(x = Consideration, y = Percent, fill = forcats::fct_rev(Importance2))) +
  geom_bar(position="fill", stat = "identity", color = "black", size = 0.2, width = 0.8) +
  aes(stringr::str_wrap(dat$Consideration, 34), dat$Percent) +
  coord_flip() +
  labs(y = "Percentage of respondents (%)") +
  scale_y_continuous(breaks=c(0, 0.25, 0.50, 0.75, 1), labels=c("0", "25", "50", "75", "100")) +
  theme(axis.title.y=element_blank(), panel.background = NULL, axis.text.y = element_text(size=8), legend.title = element_text(size=8), legend.text = element_text(size = 6)) +
  scale_fill_manual(name="Scale", breaks=c("1", "2", "3", "4", "5"), labels=c("Not at all important", "Of little importance", "Moderately important","Important", "Very important"), values=col3)

Comentarii

  • Cum adică la centru? Barele nu vor fi aliniate? De asemenea, folosiți în codul dvs. „col3”, care nu se află în eșantionul dvs. de date. Ați putea, vă rog, să postați rezultatul din dput(head(dat,x)) (primele x rânduri din setul dvs. de date pentru a da un exemplu)? –  > Por s__.
  • Am adăugat o imagine de exemplu pentru a vă ajuta să arătați cum aș dori să arate graficul. Aș dori ca graficul meu să fie aliniat cu centrul ca fiind „Moderat de important”, așa cum este exemplul cu „Aproape la fel”. De asemenea, am adăugat și ieșirea din dput(). col3 este o scară de culori: col3 <- rep(c(„#0ac00a”, „#86dc86”, „#e8f39c”, „#eebc4a”, „#e06925”, „#faf8f7”), 13) –  > Por Fbj9506.
  • Acum este mai clar, mulțumesc: Aș dori să vă rog să puneți cel puțin un rând pentru fiecare caz al variabilei „Importanță”, pentru a face un răspuns logic (mai bine câteva bare de cu toate cazurile de „Importanță”. De asemenea, datele false sunt în regulă, dar ar trebui să facă reproductibil exemplul dvs. –  > Por s__.
  • Bine, am adăugat ieșirea dput pentru toate rândurile –  > Por Fbj9506.
1 răspunsuri
s__

Am încercat câteva soluții, dar cred că cea mai simplă este să îți convertești datele pentru likert() funcție, și este destul de simplu:

library(tidyr)
# you need the data in the wide format
data_l <- spread(dat[,c(1,3,4)], key = Importance, value = Percent)
# now add colnames
row.names(data_l) <- data_l$Consideration
# remove the useless column
data_l <- data_l[,-1]

Acum poți folosi:

library(HH)
likert(data_l , horizontal=TRUE,aspect=1.5,
       main="Here the plot",
       auto.key=list(space="right", columns=1,
                     reverse=TRUE, padding.text=2),
       sub="Here some words")

Puteți modifica ggplot pentru a face acest lucru, dar în acest caz nu centrați prin centrul clasei pe care o doriți, ci prin „marginea” acesteia.

Comentarii

  • Vă mulțumesc foarte mult! Primesc o eroare cu data_l <- spread(dat[ ,c(1,3,4)]) totuși. Se întoarce Error in eval_tidy(enquo(var), var_env) : object '' not found –  > Por Fbj9506.
  • Ops, am tăiat o parte din cod, îmi pare rău, actualizat, sper că ajută! –  > Por s__.
  • Acest lucru funcționează până când mă duc la plot(likert) și apoi primesc o eroare: All items (columns) must have the same number of levels. Zerourile pentru unele coloane par să o dea în bară. Am încercat data_l[1:5] <- lapply(data_l[1:5], factor, levels=1:13)dar acest lucru umple doar data_l cu valori NA –  > Por Fbj9506.
  • Codul meu funcționează cu datele din exemplu, funcționează cu ele pe PC-ul tău? Dacă da, dar nu funcționează cu alte date, problema sunt celelalte date, deci nu vă pot ajuta fără să le am. –  > Por s__.
  • Am dezinstalat și reinstalat pachetele likert și HH și acum funcționează! Vă mulțumesc mult pentru ajutor -.  > Por Fbj9506.