ggplot2:添加行和点显示均值(stat_summary)

时间:2016-05-20 23:17:36

标签: r ggplot2

所以我正在使用这个数据框:

xym <- data.frame(
  Var1 = c("vloga", "odločitve", "dolgoročno", 
         "krizno", "uživa v", "vloga",   "odločitve", 
         "dolgoročno",  "krizno",   "uživa v", "vloga",
         "odločitve","dolgoročno", "krizno",   "uživa v",
         "vloga","odločitve",  "dolgoročno", "krizno",
         "uživa v"),
  Var2 = c("Nad","Nad", "Nad",  "Nad",  "Nad", "Pod",
         "Pod",  "Pod",  "Pod",  "Pod",  "Enak","Enak",
         "Enak", "Enak", "Enak", "Sam.", "Sam.", "Sam.",
         "Sam.", "Sam."),
  value = c(4, 3, 4, 4, 3, 3, 3, 2, 3, 3, 3, 2.5, 2.5,
             2, 3.5 ,5 ,6 ,6 ,5 ,6))

使用此代码:

p <- ggplot(xym, aes(x = Var1, y = value, fill = Var2)) + coord_flip()+
  theme_bw() + scale_fill_manual(values = c("yellow", "deepskyblue1", "yellowgreen","orchid4")) + xlim(rev(levels(xym$Var1)))+ theme(axis.title=element_blank(),axis.ticks.y=element_blank(),legend.position = "bottom",
                                                                                                                                     axis.text.x = element_text(angle = 0,vjust = 0.4)) +
  geom_bar(stat = "identity", width = 0.7, position = position_dodge(width=0.7)) +
  geom_text(aes(x = Var1, y =max(value), label = round(value, 2), fill = Var2), 
            angle = 0, position = position_dodge(width = 0.7), size = 4.2)
p + labs(fill="")

p +  stat_summary(fun.y=mean, colour="red", geom="line", aes(group = 1))

我产生输出:

enter image description here

但旁边的红线标记总问题(即“dolgoročno”,“krizno”等)。我想添加积分,旁边单个问题组的条形图和标签表示

我的输出应该如下图所示(我在油漆中做过),其中黑点代表我想要的点,第一个点的值3.6是(6,2,4,2.5)的平均值并代表我想要的价值标签。

enter image description here

我也看过:

Plot average line in a facet_wrap

ggplot2: line connecting the means of grouped data

How to label graph with the mean of the values using ggplot2

1 个答案:

答案 0 :(得分:4)

一种选择如下。我按照你的代码添加了几行。

# Your code
p <- ggplot(xym, aes(x = Var1, y = value, fill = Var2)) +
     coord_flip() +
     theme_bw() +
     scale_fill_manual(values = c("yellow", "deepskyblue1", "yellowgreen","orchid4")) +
     xlim(rev(levels(xym$Var1))) +
     theme(axis.title = element_blank(),
           axis.ticks.y = element_blank(),
           legend.position = "bottom",
           axis.text.x = element_text(angle = 0,vjust = 0.4)) +
     geom_bar(stat = "identity", width = 0.7, position = position_dodge(width = 0.7)) +
     geom_text(aes(x = Var1, y = max(value), label = round(value, 2), fill = Var2), 
               angle = 0, position = position_dodge(width = 0.7), size = 4.2)

p + labs(fill = "")

然后,我添加了以下代码。您可以在stat_summary中添加将geom更改为point的点。对于标签,我选择从ggplot_build()获取数据并创建一个名为foo的数据框。 (我认为还有其他方法可以完成相同的工作。)使用foo,我最后添加了注释。

p2 <- p +
      stat_summary(fun.y = mean, color = "red", geom = "line", aes(group = 1)) + 
      stat_summary(fun.y = mean, color = "black", geom ="point", aes(group = 1), size = 5,
                   show.legend = FALSE)

# This is the data for your dots in the graph
foo <- as.data.frame(ggplot_build(p2)$data[[4]])

p2 +
annotate("text", x = foo$x, y = foo$y + 0.5, color = "black", label = foo$y)

enter image description here