我正在尝试制作水平分组的条形图,以显示人们如何回答不同的问题。
有没有一种方法可以将问题分为多个部分,在每个部分的上方放置一个粗体标题以说明问题所在?最好不要像我使用面板那样将其划分为单独的绘图区域。
对于下面的示例,假设我要插入的标题是“ Vowels”和“辅音”(hand-drawn in red in the picture in this example)
library('ggplot2')
library('stringr')
set.seed(5)
questions <- str_wrap(c('Blah blah blah blah blah blah B?',
'Blbbity blah blibbity blah C?',
'Blah blah blibbity blah blah blah D?',
'Blah blah blah A?',
'Blah blah blah blibbity E?',
'Blah blah blibbity blah I?'),15)
status <- data.frame(matrix(data=NA, nrow=18,ncol=3))
names(status) <- c('varname','type','percent')
status['varname'] <- factor(c(rep(1,3),rep(2,3),rep(3,3),rep(4,3),rep(5,3),rep(6,3)),labels=questions)
status['type'] <- c(rep(c('Cohabiting','Married','Divorced'),6))
status['percent'] <- c(rnorm(18,.5,.2))
ggplot(status, aes(varname, percent)) +
theme(axis.title.y = element_blank(), legend.title = element_blank(), plot.title = element_text(hjust = 0.5), legend.position = "top") +
geom_bar(aes(fill = type), position = "dodge", stat="identity") + coord_flip() + scale_fill_manual(values=c('cadetblue1','cadetblue3','darkcyan')) +
ggtitle('By couple type') + labs(y='Percent') + ylim(0,1)
答案 0 :(得分:2)
您可以调整facet_grid()
图以删除所有您喜欢的面板。
如果您希望在各个面上使用y轴,请参见此answer
library(dplyr)
library("ggplot2")
library("stringr")
# create new alp variable
status <- status %>%
# edit: shamelessly steal from Maurits's answer :-)
mutate(alp = if_else(str_detect(varname, "(I|E|A)\\?$"), "Vowels", "Consontants"))
p2 <- ggplot(status, aes(varname, percent)) +
geom_col(aes(fill = type), position = "dodge") +
facet_grid(alp ~ ., scales = 'free_y', space = 'free_y', switch = 'y') +
coord_flip() +
scale_fill_manual(values = c("cadetblue1", "cadetblue3", "darkcyan"),
# increase the spacing between legend key text
labels = stringr::str_pad(status$type, 5, "right"),) +
ggtitle("By couple type") +
labs(y = "Percent") +
scale_x_discrete(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0), limits = c(0, 1)) +
theme_classic(base_size = 14, base_family = 'mono') +
theme(axis.title.y = element_blank(),
legend.spacing.x = unit(0.25, unit = "cm"),
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5),
legend.position = "top") +
theme(panel.grid.minor.x = element_blank()) +
# switch the facet strip label to outside
theme(strip.placement = 'outside',
strip.text.y = element_text(face = 'bold'),
strip.background.y = element_rect(colour = NA, fill = 'grey80'))
p2
p3 <- ggplot(status, aes(varname, percent)) +
geom_col(aes(fill = type), position = "dodge") +
facet_grid(alp ~ ., scales = 'free_y', space = 'free_y', switch = 'y') +
coord_flip() +
scale_fill_manual(values = c("cadetblue1", "cadetblue3", "darkcyan"),
# increase the spacing between legend key text
labels = stringr::str_pad(status$type, 5, "right"),) +
ggtitle("By couple type") +
labs(y = "Percent") +
scale_x_discrete(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0), limits = c(0, 1)) +
theme_classic(base_size = 14, base_family = 'mono') +
theme(axis.title.y = element_blank(),
legend.spacing.x = unit(0.25, unit = "cm"),
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5),
legend.position = "top") +
theme(panel.grid.minor.x = element_blank()) +
# switch the facet strip label to outside
# remove background color
theme(strip.placement = 'outside',
strip.text.y = element_text(face = 'bold'),
strip.background.y = element_blank())
p3
由reprex package(v0.2.1.9000)于2018-10-02创建
答案 1 :(得分:1)
如何使用构面?
library(tidyverse)
status %>%
mutate_if(is.factor, as.character) %>%
mutate(Group = if_else(str_detect(varname, "(I|E|A)\\?$"), "Vowels", "Consontants")) %>%
ggplot(aes(varname, percent)) +
theme(
axis.title.y = element_blank(),
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5),
legend.position = "top") +
geom_bar(aes(fill = type), position = "dodge", stat = "identity") +
facet_wrap(~Group, ncol = 1, scales = "free_y") +
coord_flip() +
scale_fill_manual(values = c('cadetblue1', 'cadetblue3', 'darkcyan')) +
ggtitle('By couple type') +
labs(y = 'Percent') +
ylim(0, 1)
或者您也可以将条形标签向左移动:
library(tidyverse)
status %>%
mutate_if(is.factor, as.character) %>%
mutate(Group = if_else(str_detect(varname, "(I|E|A)\\?$"), "Vowels", "Consontants")) %>%
ggplot(aes(varname, percent)) +
theme(
axis.title.y = element_blank(),
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5),
legend.position = "top") +
geom_bar(aes(fill = type), position = "dodge", stat = "identity") +
facet_wrap(~Group, ncol = 1, scales = "free_y", strip.position = "left") +
coord_flip() +
scale_fill_manual(values = c('cadetblue1', 'cadetblue3', 'darkcyan')) +
ggtitle('By couple type') +
labs(y = 'Percent') +
ylim(0, 1)