web-dev-qa-db-ja.com

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")
13
eddi

これを試して:

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

enter image description here

不要な場合は、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")
_

enter image description here

「日付」には複数のvalがあると言うので、たとえばplyrを使用して最初にそれらを集約できます。

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

次に、_x = 1:5_をx = seq_len(nrow(dd))に置き換えることにより、同じコマンドを続行できます。

28
Arun

数年後、私は次のことを行うことに決めました。

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

Jan Boyer この問題のより簡潔な解決策を この質問 で見つけたようです。これを少し短くして 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 によって提案されているように、すでにグループ化されていることに注意してください。

1
Lukas