我制作了一张包含以下数据的图表:
library(dplyr)
library(forcats)
library(ggplot2)
library(scales)
mydf <- tibble(type = c(rep(c(rep("TypeA", 4), rep("TypeB", 4)), 2)),
Ratings = rep(c("Top", "Middle", "Low", "NA"), 4),
Prop = c(0.62, 0.15, 0.15, 0, 0.32, 0.16, 0.47, 0, 0.38, 0.31, 0.31, 0, 0.16, 0.16, 0.63, 0.05),
Question = c(rep("Question1", 8), rep("Question2", 8)))
mydf$Ratings <- factor(mydf$Ratings) %>% fct_inorder() %>% fct_rev()
这是制作图表的代码:
mydf %>% filter(Prop > 0) %>% ggplot(aes(x = Question, y = Prop, fill = Ratings)) +
geom_bar(position = "fill", stat = "identity") +
geom_text(aes(label = percent(round(Prop,2))), position = position_stack(vjust = 0.5)) +
facet_grid(~ type) + scale_y_continuous(labels = percent) +
guides(fill = guide_legend(reverse = TRUE))
它产生了以下图表。我特意使用position = position_stack(vjust = 0.5)
将标签置于条形图的中间位置。对于Question1的标签,它显然看起来不正确。这是一个错误吗?我是否错误地设置了数据?
答案 0 :(得分:1)
position="fill"
为geom_bar
,position_stack
为geom_text
。因此,geom_bar
堆栈的顶部始终为100%,但geom_text
堆栈的顶部是该堆栈中值的总和。 TypeA
Question1
和TypeB
Question1
的值之和均小于100%,因此标签堆栈的高度低于条形堆栈的高度
要使标签高度与条形高度相匹配,请更改为position_fill
中的geom_text
。 (但请注意,由于四个条形堆栈中的两个不会使百分比加起来达到100%,因此如果您还没有标准化标签以在每个堆栈中添加到100%,则使用position_fill()
会产生误导。)
我还删除了反转图例的最后一行,以便图例的颜色顺序与条形图的颜色顺序相同:
mydf %>% filter(Prop > 0) %>%
ggplot(aes(x = Question, y = Prop, fill = Ratings)) +
geom_bar(position="fill", stat="identity") +
geom_text(aes(label = percent(round(Prop,2))), position=position_fill(vjust = 0.5)) +
facet_grid(~ type) +
scale_y_continuous(labels = percent)