r - 如何在 Likert 图的每个条形上输出正确的百分比?

标签 r ggplot2 dplyr reshape likert

我试图让我的代码在每个单独的条形顶部输出百分比。现在,下面显示的百分比是错误的。我的代码组合了标签 1 和 2 以及标签 3 和 4,然后在不正确的一侧输出这些数字。

是否有一个函数可以正确标记这些条形?我包含了我的代码、.csv 文件中的数据以及当前的可视化效果。

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))

enter image description here

    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

最佳答案

这是一个示例答案 - 使用 ggplot 而不使用 likart 包。



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

reprex package于2020年4月22日创建(v0.3.0)

关于r - 如何在 Likert 图的每个条形上输出正确的百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61353320/

相关文章:

r - 修剪一个巨大的 (3.5 GB) csv 文件以读入 R

r - ggplot中轴的默认文本颜色

r - 从文件名中提取字符串并使用 mutate 创建新列

具有非常特定结构的 R 数组创建

regex - 在 R 中使用 Regex 获取 Twitter @Username

r - 加载 R 包时如何分配变量可用?

r - ggplot2:使用grid.arrange()作为do.call()的参数定义图版面

r - 使用 dplyr,将唯一名称分配给由多个条件定义的行组

r - 如何在 data.table 中创建带有约束的滞后列?

在 R 或 python 中 reshape 表格