Добавление средних групповых линий на график geom_bar и включение в легенду
Я хочу иметь возможность создавать гистограмму, которая показывает также показывает среднее значение для баров в каждой группе. И показывает средний бар в легенде.
Я смог получить эту гистограмму с помощью средства, используя приведенный ниже код, и это хорошо, но я хотел бы видеть средние линии в легенде.
##The data to be graphed is the proportion of persons receiving a treatment
## (num=numerator) in each population (denom=demoninator). The population is
##grouped by two age groups and (Age) and further divided by a categorical
##variable V1
###SET UP DATAFRAME###
require(ggplot2)
df <- data.frame(V1 = c(rep(c("S1","S2","S3","S4","S5"),2)),
Age= c(rep(70,5),rep(80,5)),
num=c(5280,6570,5307,4894,4119,3377,4244,2999,2971,2322),
denom=c(9984,12600,9425,8206,7227,7290,8808,6386,6206,5227))
df$prop<-df$num/df$denom*100
PopMean<-sum(df$num)/sum(df$denom)*100
df70<-df[df$Age==70,]
group70mean<-sum(df70$num)/sum(df70$denom)*100
df80<-df[df$Age==80,]
group80mean<-sum(df80$num)/sum(df80$denom)*100
df$PopMean<-c(rep(PopMean,10))
df$groupmeans<-c(rep(group70mean,5),rep(group80mean,5))
Я хочу, чтобы сюжет выглядел так, но хочу, чтобы линии в легенде тоже были помечены как «среднее по группе» или аналогичные.
#basic plot
P<-ggplot(df, aes(x=factor(Age), y=prop, fill=factor(V1))) +
geom_bar(position=position_dodge(), colour='black',stat="identity")
P
####add mean lines
P+geom_errorbar(aes(y=df$groupmeans, ymax=df$groupmeans,
ymin=df$groupmeans), col="red", lwd=2)
Добавление show.legend = TRUE накладывает панели ошибок на легенду фактора, а не по отдельности. Если есть способ показать geom_errorbar отдельно в легенде, это, вероятно, самое простое решение.
Я также пробовал разные вещи с geom_line. Синтаксис ниже создает строку для среднего значения совокупности, но работает от центра каждой точки, а не покрывает ширину столбцов. Это создает линию для среднего значения совокупности и создает легенду. но один показывает полосу цвета, а не линии.
P+geom_line(aes(y=df$PopMean, group=df$PopMean, color=df$PopMean),lwd=1)
Если я пытаюсь сделать линии для группы, значит, линии не видны (потому что они только отдельные точки).
P+geom_line(aes(y=df$groupmeans, group=df$groupmeans, color=df$groupmeans))
Я также попытался обойти это с помощью фасетного графика, хотя для этого мне нужно притвориться, что моя категориальная переменная числовая, чтобы заставить ее работать.
###set up new df
df2<-df
df2$V1<-c(rep(c(1,2,3,4,5),2))
P<-ggplot(df2, aes(x=factor(V1), y=prop, fill=factor(V1))) +
geom_bar(position=position_dodge(),
colour='black',stat="identity",width=1)
P+facet_grid(.~factor(df2$Age))
P+facet_grid(.~factor(df2$Age))+geom_line(aes(y=df$groupmeans,
group=df$groupmeans, color=df$groupmeans))
Facetplot
Это позволяет мне показывать средние линии, используя geom_line, поэтому легенда появляется (хотя она выглядит неправильно, показывая цветовой градиент, а не цветные линии!). Тем не менее, линии по-прежнему не соответствуют всей ширине полос. Также моя ось X теперь нуждается в перемаркировке, чтобы показать S1, S2 и т. Д., А не цифру 1,2,3
Подводя итог - есть ли способ показать строки погрешности отдельно в легенде?
Если нет, то, если я использую фасетирование, как я могу скорректировать внешний вид легенды и относительные оси с моими категориальными переменными, и возможно ли заставить линию пройти всю ширину графика?
Или есть альтернативное решение, которое мне не хватает !?
Спасибо