Как добавить количество наблюдений на группу и использовать групповое значение в блоке 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)