问题
I'm trying to get my code to output the percentage on top of each individual bar. Right now, the percentages shown below are on the wrong side. My code combines Labels 1 and 2 and Labels 3 and 4, and then outputs those numbers on the incorrect sides.
Is there a function to label those bars correctly? I'm including my code, the data from the .csv file, and the current visualization.
library(ggplot2)
library(reshape)
library(likert)
library(dplyr)
setwd("~/Desktop/")
df <- read.csv("Likert_Test.csv")
df[2:3] <- lapply(df[2:3], as.factor)
colnames(df)[2:3] <- c("cake?", "cookies?")
df[2:3] <- lapply(df[2:3], factor, levels = 1:4)
myplot <- likert(df[2:3], grouping = df$gender)
plot(myplot, centered = FALSE, col = c("#0A2240", "#3474DA", "#C1A783", "#323A45")) +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
ggtitle("How much do you like...") +
theme(legend.title = element_blank(),
axis.title = element_blank(),
plot.title = element_text(hjust = 0.5))
gender cake cookies
Male 3 1
Male 2 2
Male 2 2
Male 4 2
Male 2 3
Male 2 3
Male 2 3
Male 1 1
Male 4 2
Female 1 1
Female 3 1
Female 3 4
Female 3 4
Female 1 1
Female 4 3
Female 4 2
Female 3 2
Female 2 1
Female 3 1
回答1:
Here's a sample answer - using ggplot without the using the likart package.
library(tidyverse)
#> Warning: package 'tibble' was built under R version 3.6.3
#> Warning: package 'dplyr' was built under R version 3.6.3
df <- readr::read_table("gender cake cookies
Male 3 1
Male 2 2
Male 2 2
Male 4 2
Male 2 3
Male 2 3
Male 2 3
Male 1 1
Male 4 2
Female 1 1
Female 3 1
Female 3 4
Female 3 4
Female 1 1
Female 4 3
Female 4 2
Female 3 2
Female 2 1
Female 3 1")
df %>%
pivot_longer(-gender, names_to = "question", values_to = "values") %>%
group_by(gender, question) %>%
count(values) %>%
mutate(
level = case_when(values %in% c(3, 4) ~ "high",
values %in% c(1, 2) ~ "low",
TRUE ~ "NA"),
values = as.character(values),
total_n = sum(n),
pct_low = sum(n[level == "low"]) / sum(n),
pct_high = sum(n[level == "high"]) / sum(n)
) %>%
print() %>%
ggplot(aes(x = gender, y = n, fill = values)) +
geom_bar(aes(fill = values), position = position_fill(reverse = TRUE), stat = "identity") +
scale_fill_manual(values = c("#0A2240", "#3474DA", "#C1A783", "#323A45")) +
scale_y_continuous(labels = scales::percent_format(),
expand = expand_scale(mult = .05)) +
geom_text(aes(
y = -.05,
x = gender,
label = scales::percent(round(pct_low, 2), accuracy = 1)
),
data = . %>% filter(level == "low")) +
geom_text(aes(
y = 1.05,
x = gender,
label = scales::percent(round(pct_high, 2), accuracy = 1)
),
data = . %>% filter(level == "high")) +
coord_flip() +
facet_wrap(~ question, nrow = 2) +
theme(
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
plot.title = element_text(hjust = 0.5),
legend.position = "bottom"
) +
labs(title = "How Much do you like...",
fill = "",
x = NULL,
y = NULL)
#> # A tibble: 15 x 8
#> # Groups: gender, question [4]
#> gender question values n level total_n pct_low pct_high
#> <chr> <chr> <chr> <int> <chr> <int> <dbl> <dbl>
#> 1 Female cake 1 2 low 10 0.3 0.7
#> 2 Female cake 2 1 low 10 0.3 0.7
#> 3 Female cake 3 5 high 10 0.3 0.7
#> 4 Female cake 4 2 high 10 0.3 0.7
#> 5 Female cookies 1 5 low 10 0.7 0.3
#> 6 Female cookies 2 2 low 10 0.7 0.3
#> 7 Female cookies 3 1 high 10 0.7 0.3
#> 8 Female cookies 4 2 high 10 0.7 0.3
#> 9 Male cake 1 1 low 9 0.667 0.333
#> 10 Male cake 2 5 low 9 0.667 0.333
#> 11 Male cake 3 1 high 9 0.667 0.333
#> 12 Male cake 4 2 high 9 0.667 0.333
#> 13 Male cookies 1 2 low 9 0.667 0.333
#> 14 Male cookies 2 4 low 9 0.667 0.333
#> 15 Male cookies 3 3 high 9 0.667 0.333
Created on 2020-04-22 by the reprex package (v0.3.0)
来源:https://stackoverflow.com/questions/61353320/how-do-i-output-the-correct-percentages-on-each-bar-of-my-likert-chart