CumSum со временем в сравнении с Total в ggplot2 - PullRequest
2 голосов
/ 29 июня 2019

Самый простой способ объяснить это с помощью этого изображения: enter image description here

Я хотел бы создать составной ggplot, который показывает (в значениях, а не в процентах) кумулятивную сумму значениясо временем и одновременно, общий «потенциал» для этого значения на заднем плане.

I представьте себе набор данных должен выглядеть примерно так:

+------------+-------+------------------+-----------------+
|    Date    | Value | Cumulative Value | Potential Value |
+------------+-------+------------------+-----------------+
| 2017-01-01 |   100 |              100 |             500 |
| 2018-01-01 |   100 |              200 |             500 |
| 2019-01-01 |   100 |              300 |             500 |
+------------+-------+------------------+-----------------+

#example set:
df <- data.frame(
"Date" = as.Date( c("2017-01-01","2018-01-01","2019-01-01") ), 
"Value" = c(100,100,100),
"Cumulative Value" = c(100,200,300), 
"Potential Value" = c(500,500,500)
)

Моя основная попытка заключалась в следующем:

ggplot(df, aes(y=`Cumulative.Value`, x=Date)) +
     geom_bar( stat="identity")

А потом я начал читать опцию position_stack - Просто немного запутался в направлении здесь.

1 Ответ

3 голосов
/ 29 июня 2019

Вот несколько слегка откорректированных данных примера, чтобы сделать фигуру более четкой:

df <- data.frame(
  "Date" = as.Date( c("2017-01-01","2018-01-01","2019-01-01") ), 
  "Value" = c(100,150,100),
  "Cumulative Value" = c(100,250,350), 
  "Potential Value" = c(500,500,500)
)

Один подход с использованием geom_area + geom_ribbon:

ggplot(df, aes(y=`Cumulative.Value`, x=Date)) +
  geom_area() +
  geom_ribbon(aes(ymin = `Cumulative.Value`,
                  ymax = `Potential.Value`), fill = "gray80")

enter image description here

Или два geom_cols, потенциальный один позади:

ggplot(df, aes(y=`Cumulative.Value`, x=Date)) +
  geom_col(aes(y = Potential.Value), fill = "gray80") +
  geom_col( stat="identity")

enter image description here

Или используйте geom_rect, который покажет области между известными значениями x. Здесь я устанавливаю дату окончания 30 дней спустя, чтобы мы могли видеть конечное значение. Сначала я нанесу «Потенциал» так, чтобы, если совокупный показатель превысил его, он был нанесен поверх него, как в вашем примере в крайнем правом углу.

ggplot(df, aes(xmin = Date, 
               xmax = lead(Date, default = max(df$Date) + 30))) +
  geom_rect(aes(ymin = Cumulative.Value, ymax = Potential.Value), fill = "gray80") 
  geom_rect(aes(ymin = 0, ymax = Cumulative.Value)) +

enter image description here

...