Добавление среднего значения к фасетам

У меня есть этот график, который вычисляет индекс численности видов птиц для данной зимы: Facet by yearЭто графика взята из этого кода (за исключением тем и масштабов):

ggplot (a, aes (pentada,ika,colour=inv,group=inv,na.rm=T)) + geom_line()+
facet_wrap(~inv, ncol=3)+labs(title="SYLATR\n",x="",y="IKA")

а фрейм данных имеет 6 переменных:

пентада / ценз / год / всего / инв / ика

Дело в том, что я хотел бы добавить в каждый из зимовальных сезонов строку, показывающую среднее значение численности за все годы вместе взятые, но не знаю как. должен ли я добавлять среднее значение в новый столбец после каждого зимнего сезона? В таком случае, как мне поступить?

Спасибо.


person Miguel    schedule 17.02.2015    source источник
comment
Комментарий к стилю: цветные линии могут выглядеть красиво, но они вам не нужны, потому что название фасета указано вверху каждого фасета. Легенда справа — это пустая трата места, вы можете получить больше деталей на своих графиках без нее.   -  person Spacedman    schedule 17.02.2015
comment
спасибо за комментарий, вы правы.   -  person Miguel    schedule 17.02.2015


Ответы (1)


Я не уверен, хотите ли вы глобальное среднее значение, то есть усреднение по зимам и дням. Если это так, то теневое решение выше, вероятно, лучше; что-то вроде этого также будет делать:

#toy data
df <- data.frame(t = rep(1:100,9), pop = rnorm(900)+20, 
    year = rep(letters[1:9], 9, each = 100))

#make graph
ggplot(data = df, aes(x = t, y = pop, colour = year, na.rm=T)) + 
    geom_line() + facet_wrap(~year, ncol = 3) + 
    geom_line(aes(x=t, y = mean(pop)))

Если вам нужно среднее значение только для зимы, чтобы по-прежнему была динамика по дням, я думаю, вам, вероятно, следует сначала добавить это во фрейм данных, прежде чем вызывать ggplot.

#aggregate the mean population over years but not days
yearagg.df <- aggregate(data = df, pop ~ t, mean)

#make plot
ggplot(data = df, aes(x = t, y = pop, colour = year, na.rm=T)) + 
    geom_line() + 
    facet_wrap(~year, ncol = 3) + 
    geom_line(data = yearagg.df, aes(y = pop, x=t), color = 'black')

Этот второй фрагмент кода приводит к следующему графику:

График второго фрагмента кода только со средним значением за годы

ОБНОВЛЕНИЕ: вам, вероятно, будет проще строить графики, если вы поместите усредненные данные обратно во фрейм данных, чтобы вы могли отображать все слои из одного фрейма данных вместо смешивания/сопоставления. данные из нескольких кадров в один график.

df.m <- merge(df, yearagg.df, by = 't', suffixes = c('.raw', '.mean'))
ggplot(data = df.m, aes(x = t, colour = year, na.rm=T)) + 
    geom_line(aes(y = pop.raw)) + 
    facet_wrap(~year, ncol = 3) + 
    geom_line(aes(y = pop.mean), color = 'gray')
person Curt F.    schedule 17.02.2015
comment
это то, что я искал, но почему-то получаю ошибку: Ошибка: ggplot2 не знает, как обращаться с данными класса uneval - person Miguel; 17.02.2015
comment
Первое решение просто делает горизонтальную линию, я искал что-то вроде второго решения: чтобы я мог напрямую сравнивать среднее значение за все годы с данным годом. - person Miguel; 17.02.2015
comment
У меня была опечатка в последней строке кода, которую я отредактировал, чтобы исправить. Вместо 'black' должно было быть color = 'black'. Надеюсь, это и было причиной ошибки. - person Curt F.; 17.02.2015
comment
Ok! Я исправил это, но теперь у меня другая ошибка!! Ошибка: Эстетика должна быть либо длины один, либо той же длины, что и dataProblems:inv это код ggplot (data=a, aes(pentada, ika, color = inv, group=inv, na.rm=T)) + geom_line() + facet_wrap(~inv, ncol = 3)+ geom_line(data=yearagg.df, aes(pentada, mean(ika)), color=black) Любая подсказка? (извините за плохое редактирование) - person Miguel; 17.02.2015
comment
Все переменные в вызове aes() внутри вызова geom_line() на yearagg.df фактически должны существовать в yearagg.df. Или вы можете использовать merge для добавления данных yearagg.df в исходный фрейм данных, чтобы вам не приходилось вызывать geom_line() для совершенно другого фрейма данных, чтобы получить нужные строки. Я обновлю свой ответ с помощью этого подхода merge. - person Curt F.; 17.02.2015
comment
Ух ты!!! именно то, что мне было нужно (в коде после цвета отсутствует group=inv. Спасибо за обучение!. - person Miguel; 17.02.2015
comment
Не стесняйтесь принять мой ответ, если он удовлетворил все ваши потребности. В дополнение к приятному для меня бонусу за репутацию, это не позволит другим пользователям добавлять больше ответов, которые вы, вероятно, не найдете полезными, и укажет будущим браузерам, что этот вопрос решен. - person Curt F.; 17.02.2015