在条形图中使用position_dodge(preserve =“ single”)时geom_text位置不正确

时间:2018-08-13 00:24:12

标签: r ggplot2 geom-text

对于刻面bB中标签下方的代码,未正确定位。 问题似乎源于position_dodge(preserve="single")中没有geom_text的事实(正确吗?)。我知道我可以“手动”添加一个空的虚拟单元格(在面bB中填充y = 0),但是我想知道是否有任何方法可以直接在ggplot中对其进行校正?

v1 <- LETTERS[1:2]
v2 <- letters[1:2]
v3 <- c("x","y")
g <- expand.grid(v1,v2,v3)
val=c(sample(10,8))
df<- data.frame(g,val)
df<- df[-8,]


    df %>% ggplot() +
      geom_bar(aes(x=Var2, y=val, fill=Var3, group=Var3), 
               stat="identity", 
               position=position_dodge(preserve="single"))+
      geom_text(aes(x=Var2, y=val+1, label=val, group=Var3), 
                position=position_dodge(width=1))+
  facet_grid(Var1~Var2, scale="free_x")

enter image description here

更新/答案::使用position_dodge2将条形与标签对齐(但是,条形然后居中,而不与其他构面中的条形对齐)。

df %>% ggplot() +
  geom_bar(aes(x=Var2, y=val, fill=Var3, group=Var3), stat="identity", 
           position=position_dodge2(preserve="single"))+
  geom_text(aes(x=Var2, y=val+1, label=val, group=Var3), 
            position=position_dodge2(width=1))+
  facet_grid(Var1~Var2, scale="free_x")

1 个答案:

答案 0 :(得分:0)

如果该示例与您的实际用例相似,建议您避免使用position_dodge的所有麻烦,而只需将不同的变量分配给facet_grid的x轴和列即可。您当前正在同时使用“ Var2”。

ggplot(df, 
       aes(x = Var3, y = val)) +              # put Var3 here instead of Var2
  geom_col(aes(fill = Var3)) +                # dodge becomes unnecessary here
  geom_text(aes(y = val + 1, label = val)) +  # as above
  facet_grid(Var1 ~ Var2) +

  # optional, simulates the same appearance as original
  labs(x = "Var2") +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

plot