Кумулятивный подсчет дискретной переменной в ggplot2

Это связано с построением кумулятивных счетчиков в ggplot2, но этот вопрос касался непрерывного переменная (а не дискретная).

Вот у меня есть гистограмма

set.seed(2021)
dat <- data.frame(x = c(rpois(100, 1), 7, 10))
ggplot(dat) + geom_bar(aes(x, ..count..))

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

Я пытаюсь построить совокупный счет с

ggplot(dat) + geom_bar(aes(x, cumsum(..count..)))

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

Есть пробелы, когда есть «отсутствующие значения» (т.е. когда x равно 5, 6, 7, 9).

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


person Kenyon Ng    schedule 06.02.2021    source источник


Ответы (3)


Вы можете преобразовать переменную в коэффициент при построении графика.

ggplot(dat) + geom_bar(aes(factor(x), cumsum(..count..)))

person David P    schedule 06.02.2021
comment
Спасибо за ваш ответ Дэвид. Я должен был уточнить свой вопрос, что я ищу график с промежутками, заполненными столбцами (т.е. график с 11 столбцами). - person Kenyon Ng; 06.02.2021

Я бы не назвал это простым подходом, но единственным, который я мог бы придумать, решить ваш вопрос:

  1. Предварительно обобщите свой набор данных, используя, например. dplyr::count

  2. Заполните свой набор данных недостающими категориями, используя, например. tidyr::complete (Для этого я сначала преобразую x в множитель).

  3. Участок через geom_col

library(ggplot2)
library(dplyr)
library(tidyr)

set.seed(2021)
dat <- data.frame(x = c(rpois(100, 1), 7, 10))
dat <- dat %>% 
  count(x) %>% 
  mutate(x = factor(x, levels = seq(range(x)[1], range(x)[2], by = 1))) %>% 
  tidyr::complete(x, fill = list(n = 0))

ggplot(dat) + geom_col(aes(x, cumsum(n)))

person stefan    schedule 06.02.2021
comment
Спасибо за код, Стефан. Это подход, который я использую сейчас, но я очень ценю ваш код для создания графического фрейма данных. Он намного чище моего! Надеюсь, есть более быстрое решение для этого с помощью всего лишь ggplot. - person Kenyon Ng; 07.02.2021

Если вы будете использовать stat_bin вместо geom_bar, может быть, это может помочь..

ggplot(dat) + stat_bin(aes(x, cumsum(..count..)))

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

person AnilGoyal    schedule 07.02.2021
comment
Спасибо за ваше решение AnilGoyal. Это работает, хотя я предпочитаю решение, которое работает с категорией x. Я, вероятно, также буду использовать ggplot(dat) + stat_bin(aes(x, cumsum(..count..)), breaks = seq(-0.5, 10.5), col = 'white'), чтобы сделать его более эстетичным. - person Kenyon Ng; 07.02.2021
comment
Да, я собирался предложить это, но после проверки - person AnilGoyal; 07.02.2021