用每个分组的子组和观察值标记一个箱线图

时间:2020-02-12 03:48:29

标签: r ggplot2 boxplot

我想制作一个箱形图,在其中用与该框相关的观察数和与该框相关的子组数标记每个框

使用ggplot2软件包中包含的diamonds数据集,通过以下代码我可以接近我想要的东西

data("diamonds")
n_fun <- function(x){
  return(data.frame(y = 1,
                    label = length(x)))
}
ggplot(diamonds, aes(x=cut, y=price, fill=clarity)) +
  geom_boxplot(position = position_dodge2(width=0.75, preserve='single')) + 
  theme_bw() + 
  stat_summary(fun.data = n_fun, geom = "text",aes(group=clarity),hjust = 0.5, position = position_dodge(0.6))

这给了我一个图,其中显示了每个“盒子”的观察数 我想做的是既显示观测值的数量,又在每个框中显示颜色的数量,例如

Fair_I1<-subset(diamonds, cut=="Fair" & clarity=="I1")
table(Fair_I1$color)

表明与Fair-I1有关的框中存在7个颜色组

因此,最后一个示例将在绘图中此框的上方或下方显示7(颜色数)和210(观察值数)

1 个答案:

答案 0 :(得分:2)

您可以预先汇总数据,然后将汇总数据传递给geom_text()。在这里,我将这些值折叠到一个标签中,但是,例如,如果要在顶部使用一组数字而在底部使用另一组数字,则可以独立地将它们放置在不同的图层上。

library(ggplot2)
library(dplyr)

labeldat <- diamonds %>%
  group_by(cut, clarity) %>%
  summarise(labels = paste(n(), n_distinct(color), sep = "\n"))

ggplot(diamonds, aes(x=cut, y=price, fill=clarity)) +
  geom_boxplot(position = position_dodge2(width=0.75)) + 
  theme_bw() + 
  geom_text(data = labeldat, aes(x = cut, y = -250, label = labels), hjust = 0.5, position = position_dodge2(width = .75))

enter image description here