Как добавить количество наблюдений на группу и использовать групповое значение в блоке ggplot2?

Я делаю базовый boxplot, где y=age и x=Patient groups

age <- ggplot(data, aes(factor(group2), age))  + ylim(15, 80) 
age + geom_boxplot(fill = "grey80", colour = "#3366FF")

Я надеялся, что вы могли бы помочь мне с несколькими вещами:

1) Можно ли включить ряд наблюдений в группу над каждым групповым ящиком (но НЕ на оси X, где находятся мои метки групп), не делая этого в краске:)?  Я пробовал использовать:

age + annotate("text", x = "CON", y = 60, label = "25")

где CON - 1-я группа, а y = 60 - чуть выше boxplot для этой группы. Однако команда не сработала. Я предполагаю, что ему нужно что-то делать, чтобы читать x как непрерывную, а не категориальную переменную.

2) Кроме того, хотя есть много вопросов об использовании среднего, а не медианного для ящиков, я до сих пор не нашел код, который работает для меня?

3) В том же вопросе есть способ, которым вы могли бы включить средний групповой stat в boxplot? Возможно, используя

age + stat_summary(fun.y=mean, colour="red", geom="point")

который, однако, включает только точку, где лежит среднее. Или снова используя

age + annotate("text", x = "CON", y = 30, label = "30")

где CON - 1-я группа, а y = 30 - средний возраст группы. Зная, насколько гибким и богатым синтаксисом ggplot2 я надеялся, что есть более элегантный способ использования результата реальной статистики, а не annotate.

Любые предложения/ссылки будут высоко оценены!

Спасибо!!

Ответ 1

Это что-то вроде того, что тебе нужно? С помощью stat_summary, в соответствии с запросом:

# function for number of observations 
give.n <- function(x){
  return(c(y = median(x)*1.05, label = length(x))) 
  # experiment with the multiplier to find the perfect position
}

# function for mean labels
mean.n <- function(x){
  return(c(y = median(x)*0.97, label = round(mean(x),2))) 
  # experiment with the multiplier to find the perfect position
}

# plot
ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
  geom_boxplot(fill = "grey80", colour = "#3366FF") +
  stat_summary(fun.data = give.n, geom = "text", fun.y = median) +
  stat_summary(fun.data = mean.n, geom = "text", fun.y = mean, colour = "red")

Черное число - количество наблюдений, красное - среднее значение. joran answer показывает, как поставить цифры в верхней части ящиков enter image description here

hat-tip: fooobar.com/questions/66046/...

Ответ 2

Я думаю, что это то, что вы ищете, может быть?

myboxplot <- ddply(mtcars,
                    .(cyl),
                    summarise,
                    min = min(mpg),
                    q1 = quantile(mpg,0.25),
                    med = median(mpg),
                    q3 = quantile(mpg,0.75),
                    max= max(mpg),
                    lab = length(cyl))
ggplot(myboxplot, aes(x = factor(cyl))) + 
    geom_boxplot(aes(lower = q1, upper = q3, middle = med, ymin = min, ymax = max), stat = "identity") + 
    geom_text(aes(y = max,label = lab),vjust = 0)

enter image description here

Я только что понял, что ошибочно использовал медианную информацию, когда вы спрашивали о значении, но вы, очевидно, можете использовать любую функцию для эстетического middle, который вам нравится.

Ответ 3

Ответ на первую проблему. Чтобы показать значение над полем, вы должны указать значения x как числовые, а не как имена уровней. Итак, чтобы построить значение выше первого значения, дайте x=1.

data(ToothGrowth)
ggplot(ToothGrowth,aes(supp,len))+geom_boxplot()+
   annotate("text",x=1,y=32,label=30)