ggplot2标签未正确居中

时间:2016-12-09 22:49:43

标签: r ggplot2

我制作了一张包含以下数据的图表:

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的标签,它显然看起来不正确。这是一个错误吗?我是否错误地设置了数据?

enter image description here

1 个答案:

答案 0 :(得分:1)

position="fill"geom_barposition_stackgeom_text。因此,geom_bar堆栈的顶部始终为100%,但geom_text堆栈的顶部是该堆栈中值的总和。 TypeA Question1TypeB 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) 

enter image description here