如何使用 R 的 ggplot2 包在堆叠条形图中添加文本?
How to add text in the stacked barplot using ggplot2 package of R?
我正在分析 5 点 - 李克特量表问卷,并尝试使用 R 的 ggplot2 可视化堆积条形图。
数据集可以在这个 link - https://gofile.io/d/fKVZuL
中找到
我的数据集是.sav (SPSS) 格式。
所以我按照代码来读取这些数据:
require("foreign")
d = read.spss(file.choose(), to.data.frame=TRUE)
attach(d)
现在要将这个 5 点李克特量表绘制成堆积条形图,我使用了 tidyverse
包,其中包括 ggplot2
require("tidyverse")
d %>% select(F1:F6) %>% na.omit %>% nrow
d %>% select(F1:F6) %>% na.omit -> f_items
f_items %>% gather(key = items, value = answer) %>% mutate(answer = factor(answer),items = factor(items)) -> data2
为了重新排列图例的键,我使用了以下代码:
data2$answer = factor(data2$answer, levels = c("Strongly Agree", "Agree", "Neutral",
"Disagree", "Strongly Disagree"))
然后我使用以下代码创建了堆积条形图:
ggplot(data2, aes(x = items)) +
geom_bar(aes(fill = answer), position = "fill") +
coord_flip() +
scale_x_discrete(limits = rev(levels(data2$items)))+
scale_y_continuous(labels = scales::percent)+
scale_fill_brewer(palette="RdYlBu")-> p2
p2
这些代码产生了这个数字:
现在我想添加每个问题响应的百分比,如下图但无法管理代码:
如何添加像这个数字这样的问题回复百分比?这对我会有很大的帮助。
-沙基尔
您可以尝试下一个代码。最好处理数据以具有@Axeman 早先告诉您的标签和比例:
library(foreign)
library(tidyverse)
#Data
d = read.spss(file.choose(), to.data.frame=TRUE)
attach(d)
#Process
d %>% select(F1:F6) %>% na.omit %>% nrow
d %>% select(F1:F6) %>% na.omit -> f_items
f_items %>% gather(key = items, value = answer) %>% mutate(answer = factor(answer),items = factor(items)) -> data2
#Assign factor
data2$answer = factor(data2$answer, levels = c("Strongly Agree", "Agree", "Neutral",
"Disagree", "Strongly Disagree"))
#Some code for proportions and labels
data2 %>% group_by(items,answer) %>% summarise(freq=n()) %>% ungroup() %>%
group_by(items) %>% mutate(total = sum(freq),prop = freq/total) -> labdf
labdf %>% ungroup() -> labdf
#Create label
labdf$Label <- ifelse(labdf$prop<0.06,NA,paste0(100*round(labdf$prop,3),'%'))
#Plot
ggplot(labdf, aes(x = items, y = prop,group=answer))+
geom_bar(stat='identity',aes(fill = answer), position = 'fill')+
geom_text(aes(label = Label),position = position_fill(vjust = 0.5),size=3)+
coord_flip() +
scale_x_discrete(limits = rev(levels(data2$items)))+
scale_y_continuous(labels = scales::percent)+
scale_fill_brewer(palette="RdYlBu")-> p2
p2
输出:
有些比例太短,标签可能会覆盖其他比例。这就是为什么您可以修改 labdf$Label <- ifelse(labdf$prop<0.06,NA,paste0(100*round(labdf$prop,3),'%'))
来决定保留哪些标签。
我正在分析 5 点 - 李克特量表问卷,并尝试使用 R 的 ggplot2 可视化堆积条形图。
数据集可以在这个 link - https://gofile.io/d/fKVZuL
中找到我的数据集是.sav (SPSS) 格式。
所以我按照代码来读取这些数据:
require("foreign")
d = read.spss(file.choose(), to.data.frame=TRUE)
attach(d)
现在要将这个 5 点李克特量表绘制成堆积条形图,我使用了 tidyverse
包,其中包括 ggplot2
require("tidyverse")
d %>% select(F1:F6) %>% na.omit %>% nrow
d %>% select(F1:F6) %>% na.omit -> f_items
f_items %>% gather(key = items, value = answer) %>% mutate(answer = factor(answer),items = factor(items)) -> data2
为了重新排列图例的键,我使用了以下代码:
data2$answer = factor(data2$answer, levels = c("Strongly Agree", "Agree", "Neutral",
"Disagree", "Strongly Disagree"))
然后我使用以下代码创建了堆积条形图:
ggplot(data2, aes(x = items)) +
geom_bar(aes(fill = answer), position = "fill") +
coord_flip() +
scale_x_discrete(limits = rev(levels(data2$items)))+
scale_y_continuous(labels = scales::percent)+
scale_fill_brewer(palette="RdYlBu")-> p2
p2
这些代码产生了这个数字:
现在我想添加每个问题响应的百分比,如下图但无法管理代码:
如何添加像这个数字这样的问题回复百分比?这对我会有很大的帮助。
-沙基尔
您可以尝试下一个代码。最好处理数据以具有@Axeman 早先告诉您的标签和比例:
library(foreign)
library(tidyverse)
#Data
d = read.spss(file.choose(), to.data.frame=TRUE)
attach(d)
#Process
d %>% select(F1:F6) %>% na.omit %>% nrow
d %>% select(F1:F6) %>% na.omit -> f_items
f_items %>% gather(key = items, value = answer) %>% mutate(answer = factor(answer),items = factor(items)) -> data2
#Assign factor
data2$answer = factor(data2$answer, levels = c("Strongly Agree", "Agree", "Neutral",
"Disagree", "Strongly Disagree"))
#Some code for proportions and labels
data2 %>% group_by(items,answer) %>% summarise(freq=n()) %>% ungroup() %>%
group_by(items) %>% mutate(total = sum(freq),prop = freq/total) -> labdf
labdf %>% ungroup() -> labdf
#Create label
labdf$Label <- ifelse(labdf$prop<0.06,NA,paste0(100*round(labdf$prop,3),'%'))
#Plot
ggplot(labdf, aes(x = items, y = prop,group=answer))+
geom_bar(stat='identity',aes(fill = answer), position = 'fill')+
geom_text(aes(label = Label),position = position_fill(vjust = 0.5),size=3)+
coord_flip() +
scale_x_discrete(limits = rev(levels(data2$items)))+
scale_y_continuous(labels = scales::percent)+
scale_fill_brewer(palette="RdYlBu")-> p2
p2
输出:
有些比例太短,标签可能会覆盖其他比例。这就是为什么您可以修改 labdf$Label <- ifelse(labdf$prop<0.06,NA,paste0(100*round(labdf$prop,3),'%'))
来决定保留哪些标签。