r - 如何在李克特图表的每个条形上输出正确的百分比?
问题描述
我试图让我的代码在每个条形图的顶部输出百分比。现在,下面显示的百分比是错误的。我的代码结合了标签 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))
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 包(v0.3.0)于 2020-04-22 创建
推荐阅读
- c# - AutoMapper:如何在 c# 中使用 AutoMapper 从映射中忽略子对象的子对象
- angular - ng-alain sf 基于事件的模式更改选项
- apache-spark - Spark UI 未正确显示文件和行号
- api - Podio:注册的域与重定向 uri 不匹配
- javascript - 如何在 Javascript 中通过迭代创建请求
- python - 有没有办法确定文本文件中多行字段的最佳引号字符?
- vue.js - 如何在 Quasar 项目中制作特定于平台的代码?
- linkedin - 我想使用 API 访问完整的 LinkedIn 个人资料信息
- python - 使用 Python 将现有的 Chrome cookie 加载到 Selenium webdriver
- apache-spark - 在 Pyspark 中将字符串日期时间文件转换为纪元