кумулятивный график с использованием ggplot2

Я учусь использовать ggplot2 и ищу ggplot2 наименьший код, который воспроизводит base::plot результат ниже. Я пробовал несколько вещей, и все они оказались ужасно длинными, поэтому я ищу наименьшее выражение и в идеале хотел бы, чтобы даты на оси x (которых там нет в plot ниже).

df = data.frame(date = c(20121201, 20121220, 20130101, 20130115, 20130201),
                val  = c(10, 5, 8, 20, 4))
plot(cumsum(rowsum(df$val, df$date)), type = "l")

person eddi    schedule 05.04.2013    source источник


Ответы (3)


Попробуй это:

ggplot(df, aes(x=1:5, y=cumsum(val))) + geom_line() + geom_point()

введите описание изображения здесь

Просто удалите geom_point(), если он вам не нужен.

Изменить: поскольку вам необходимо построить данные как таковые с метками x - датами, вы можете построить график с x=1:5 и использовать scale_x_discrete, чтобы установить labels новый data.frame. Принимая df:

ggplot(data = df, aes(x = 1:5, y = cumsum(val))) + geom_line() + 
        geom_point() + theme(axis.text.x = element_text(angle=90, hjust = 1)) + 
        scale_x_discrete(labels = df$date) + xlab("Date")

введите описание изображения здесь

Поскольку вы говорите, что у вас будет более 1 val для "date", вы можете сначала объединить их, используя, например, plyr.

require(plyr)
dd <- ddply(df, .(date), summarise, val = sum(val))

Затем вы можете продолжить с той же командой, заменив x = 1:5 на x = seq_len(nrow(dd)).

person Arun    schedule 05.04.2013
comment
Спасибо, это довольно долго по сравнению с plot. Может ли ggplot искупить себя, добавив даты на оси x, вероятно повернутой на 90 градусов? :) - person eddi; 08.04.2013
comment
quote: и в идеале хотелось бы иметь даты на оси x (которых нет на графике ниже). - person eddi; 09.04.2013
comment
Я также попытался отредактировать ваш пост, чтобы исправить это для случая, когда на дату более 1 val, но редактирование не прошло. - person eddi; 09.04.2013
comment
Спасибо! Просто добавьте еще одну запись в df с той же датой и некоторыми val и посмотрите результат plot. Это будет совокупная дневная сумма val. - person eddi; 09.04.2013
comment
Я отмечу это как ответ, но, пожалуйста, исправьте бит rowsum для использования в будущем. Не могу сказать, что это красиво, но спасибо :) - person eddi; 09.04.2013
comment
Я не уверен, в чем ваше замешательство. Это два разных значения для одной и той же даты, и меня интересует график совокупной суммы значений, но индексированных по дате, в отличие от наблюдения (что вы и сделали). Я обновил свой пост, добавив немного измененную версию вашего ответа, и эта проблема исправлена. Хорошо, я укушу, в чем суть ggplot2 на самом деле? - person eddi; 09.04.2013
comment
позвольте нам продолжить это обсуждение в чате - person eddi; 09.04.2013

Через пару лет я решил заняться:

ggplot(df, aes(as.Date(as.character(date), '%Y%m%d'), cumsum(val))) + geom_line()
person eddi    schedule 07.06.2016

Ян Бойер, похоже, нашел более краткое решение этой проблемы в этот вопрос, который я немного сократил и объединил с ответами Prradep, чтобы предоставить (надеюсь) актуальный ответ:

ggplot(data = df, 
   aes(x=date)) +
geom_col(aes(y=value)) +
geom_line(aes(x = date, y = cumsum((value))/5, group = 1), inherit.aes = FALSE) +
ylab("Value") + 
theme(axis.text.x = element_text(angle=90, hjust = 1))

Обратите внимание, что date находится не в формате даты, а в character, и что value уже сгруппированы, как было предложено Prradep в его ответе выше.

person Lukas    schedule 28.06.2018
comment
Возможно, я что-то упускаю - но как это кратче? - person eddi; 28.06.2018