Нормализация гистограммы в ggplot2 - PullRequest
0 голосов
/ 04 июня 2018

Дайте фрейм данных.

x <- runif(1000, 0, 10)
y <- c(rep("success", 500), rep("failure", 500))
z <- data.frame(x, y)

Возможно ли сгенерировать гистограмму, аналогичную

ggplot(z, aes(x, fill = y)) + geom_histogram()

, но с .. count .. , нормализованным до * 1009?*

попытки = успех + неудача

в каждом бине с использованием ggplot?Большое спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Большое спасибо за все ответы!Извините, я думаю, я упростил вопрос, который у меня есть.Кадр данных, который намного ближе к данным, с которыми я работаю, это

df <- data.frame(
v1 = runif(128000, 0, 10),
v2 = factor(rep(rep(1:5, c(1,10,8,4,2)), 5120)),
v3 = factor(rep(rep(1:12, c(2,4,4,6,6,6,6,6,6,6,6,6)), 2000)),
v4 = c(rep("success", 64000), rep("failure", 64000)))

, просто данные распределены неравномерно.Чтобы найти определенные паттерны между v1-v4, я визуально изучаю эти данные, например, по

ggplot(df, aes(v1, fill = v2)) +
geom_histogram(binwidth = 0.2, position = "stack") +
facet_wrap("v3")

и

ggplot(df %>% filter(v4 == "success"), aes(v1, fill = v2)) +
geom_histogram(binwidth = 0.2, position = "stack") +
facet_wrap("v3")

Основываясь на том, что я видел до сих порТеперь я хотел бы сделать еще один шаг, нормализуя ..count .. на последнем графике, то есть успехов или неудач, к общему количеству попыток в каждой ячейке, т.е. попыток = (успехов + неудач), чтобыполучить какой-то частотный график.Например, в v3 фасет x, v2 группа y, v1 bin z я хотел бы видеть 0.25 (из 100 успехов / 400 попыток) вместо 100 успехов.

РЕДАКТИРОВАТЬ 2: График, который я имею в виду, выглядит следующим образом:

df <- df %>% mutate(v1_bins = cut(v1, breaks = 5))

df_successes <- df %>% group_by(v1_bins, v2, v3, v4) %>% 
filter(v4 == "success") %>% summarise(successes = n()) %>% 
ungroup() %>% select(-v4)

df_attempts <- df %>% group_by(v1_bins, v2, v3) %>% 
summarise(attempts = n()) %>% ungroup()

df_freq <- left_join(df_attempts, df_successes, by = c("v1_bins", "v2", "v3")) %>% 
mutate(success_freq = successes / attempts)

который составляет

ggplot(df_freq, aes(x = v1_bins, y = success_freq, group = v2)) +
geom_col(aes(fill = v2), position = "identity", alpha = "0.5") +
facet_wrap("v3")

или

ggplot(df_freq, aes(x = v1_bins, y = success_freq, group = v2)) +
geom_line(aes(colour = v2)) +
facet_wrap("v3")

1 Ответ

0 голосов
/ 04 июня 2018

Я думаю, что вы ищете, чтобы получить пропорции успеха и неудач в каждой ячейке гистограммы.Один из способов сделать это - создать точки среза в данных и создать гистограмму с position = "fill"

z %>% 
  mutate(bins = cut(x, breaks = 30)) %>% 
  ggplot(aes(bins, fill = y)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5))

enter image description here

РЕДАКТИРОВАТЬ: Судя по вашим правкам, вы пытаетесь получить долю успехов для каждой комбинации binned_v1, v2 и v3.Начиная с ваших данных, следующая диаграмма показывает это.Это довольно занято.Я уменьшил бункеры до 10, потому что 30 было слишком много, чтобы смотреть на.

df <- data.frame(
  v1 = runif(128000, 0, 10),
  v2 = factor(rep(rep(1:5, c(1,10,8,4,2)), 5120)),
  v3 = factor(rep(rep(1:12, c(2,4,4,6,6,6,6,6,6,6,6,6)), 2000)),
  v4 = c(rep("success", 64000), rep("failure", 64000)))

df %>% 
  mutate(bins = cut(v1, breaks = 10)) %>% 
  group_by(bins, v2, v3) %>% 
  summarise(success_prop = mean(v4 == "success")) %>% 
  ggplot(aes(bins, success_prop, fill = v2)) +
  geom_col(position = "dodge") + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5)) +
  facet_wrap(~ v3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...