Моя конечная цель здесь - stat_summary
добавить итоговые строки к сюжету, используя существующее членство в группах. У меня проблемы с нанесением линий на график, и, хотя я понимаю проблему, я не могу понять, как ее избежать.
Пример:
library(ggplot2)
df <- data.frame(low=c(20,24,18,16),
mid=c(60,61,48,45),
high=c(80,75,81,83),
category=factor(seq(1:4)),
membership=factor(c(1,1,2,2)))
p <- ggplot(df, aes(x=category, y=mid)) +
geom_linerange(aes(ymin=low, ymax=high)) +
geom_point(shape=95, size=8)
p
Это дает график каждой из четырех категорий:
Первый шаг - использовать stat_summary
для добавления строки, показывающей средства ymin
, y
и ymax
, например, так:
p +
stat_summary(data=df, aes(x="Aggregate", ymin=mean(low), y=mean(mid), ymax=mean(high)),
fun.data="mean", geom="linerange", inherit.aes=F) +
stat_summary(data=df, aes(x="Aggregate", y=mid), fun.y="mean", geom="point",
size=8, shape=95)
Но когда я пытаюсь использовать членство df
для создания средств внутри групп, я сталкиваюсь с проблемами linerange
(хотя с point
графиками все в порядке).
p +
stat_summary(data=df, aes(x="Aggregates", ymin=low, y=mid, ymax=high, group=membership),
fun.ymin="mean", fun.y="mean", fun.ymax="mean", geom="linerange",
inherit.aes=F, position_dodge(0.5))
stat_summary(data=df, aes(x="Aggregates", y=mid, group=membership),
fun.y="mean", geom="point", size=8, shape=95, position_dodge(0.5))
Я знаю из ggplot_build(p)
этого ymin
= y
= ymax
, поэтому на графике ничего не отображается. Однако, если я использую fun.data
вместо fun.ymin
/, fun.ymax
я получаю сообщения об отсутствии требований ymin
и ymax
эстетики.
$data[[3]]
x group ymin y ymax
1 5.125 2 46.5 46.5 46.5
2 4.875 1 60.5 60.5 60.5
Любая помощь будет оценена по достоинству!
Возможно, вам будет проще рассчитать средние по группам, прежде чем передавать фрейм данных ggplot()
для построения графика. Один из возможных подходов ниже:
library(dplyr)
df %>%
rbind(df %>%
mutate(category = "Aggregate") %>%
group_by(category, membership) %>%
summarise_all(mean) %>% # calculate mean for low / mid / high by group
ungroup() %>%
select(colnames(df))) %>% #reorder columns to match the original df
ggplot(aes(x = category, y = mid, ymin = low, ymax = high,
colour = membership)) +
geom_linerange(position = position_dodge(width = 0.5)) +
geom_point(shape = 95, size = 8,
position = position_dodge(width = 0.5))
(Я добавил, color = membership
чтобы группы были визуально различимы.)
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения