Как наложить гистограммы друг на друга - PullRequest
0 голосов
/ 23 апреля 2020

Предположим, у меня есть следующие данные

set.seed(85)
test <- factor(replicate(10,sample(0:3,5,rep=TRUE)))
set.seed(108)
test2 <- factor(replicate(10,sample(0:3,5,rep=TRUE)))

и следующие гистограммы:

barplot(table(test), col=rgb(0,1,0,.5))
barplot(table(test2), col=rgb(1,0,0,.5))

Как объединить их в 1 график с наложенным 1 гистограммой с другой? Нечто похожее на это:

enter image description here

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Это объединяет две гистограммы, как указано в вопросе.


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

tib <- 
  tibble(t1 = table(test),
         t2 = table(test2)) %>% 
  mutate(group = 1:4)

ggplot()+
  geom_bar(data = select(tib, -2), aes(group, t1), stat = "identity", fill = "red", alpha = 0.25, width = 1)+
  geom_bar(data = select(tib, -1), aes(group, t2), stat = "identity", fill = "green", alpha = 0.25,width = 1)

Что приводит к:

enter image description here

Однако Я думаю, вы действительно ищете:

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

set.seed(85)
test <- replicate(10,sample(0:3,5,rep=TRUE))

set.seed(108)
test2 <- replicate(10,sample(0:3,5,rep=TRUE))


tib1(tibble)


tib1 <-
  tibble(t1 = c(test),
         t2 = c(test2)) %>% 
  pivot_longer(cols = c(t1, t2), names_to = "test", values_to = "score")

ggplot(tib1, aes(score, fill = test))+
  geom_histogram(bins = 4, alpha = 0.5, position = "identity")


Что дает вам:

enter image description here

Если число наблюдения для каждого теста различны, и вы хотите построить гистограмму: создайте два кадра данных и объедините их для построения графика

set.seed(85)
test1 <- tibble(score = c(replicate(20, sample(0:3, 5, rep = TRUE))),
                test = "t1")

set.seed(108)
test2 <- tibble(score = c(replicate(10, sample(0:3, 5, rep = TRUE))),
                test = "t2")


tib1 <-
  test1 %>% 
  bind_rows(test2)

ggplot(tib1, aes(score, fill = test))+
  geom_histogram(bins = 4, alpha = 0.5, position = "identity")

Если вы предпочитаете версию geom_bar, вы можете адаптировать предыдущий код следующим образом:

ggplot()+
  geom_bar(data = test1, aes(score), stat = "count", fill = "red", alpha = 0.25, width = 1)+
  geom_bar(data = test2, aes(score), stat = "count", fill = "green", alpha = 0.25,width = 1)

Кстати, вы, вероятно, могли бы упростить свой код, если у вас нет других причин для использования репликации как: c(replicate(10, sample(0:3, 5, rep = TRUE))) == sample(0:3, 50, rep = TRUE)

set.seed(108)
s1 <-  c(replicate(10, sample(0:3, 5, rep = TRUE)))

set.seed(108)
s2 <-  sample(0:3, 50, rep = TRUE)

tib <- 
  tibble(t1 = s1,
         t2 = s2) %>% 
  pivot_longer(t1:t2, names_to = "test", values_to = "score")

ggplot(tib, aes(score, fill = test))+
  geom_histogram(bins = 4, alpha = 0.5, position = "identity") +
  facet_wrap(~test)
0 голосов
/ 23 апреля 2020

Здесь и далее рабочий код для получения примерно того, что вы ищете. Как упоминалось в комментариях, вы должны использовать функцию hist вместо функции barplot при построении распределений.

set.seed(1234)
a <- rnorm(n = 1000, mean = 0, sd = 1)
b <- rnorm(n = 1000, mean = 3, sd = 2)

min_x <- min(c(a, b))
max_x <- max(c(a, b)) # we want the first plot to have the right "size" on the x-axis

#First plot:
hist(a, breaks = 100, 
     col = rgb(red = 0, blue = 0, green = 1, alpha = .5), 
     border = NA, xlim = c(min_x , max_x ))

#Surimposing the second plot:
hist(b, breaks = 100, 
col = rgb(red = 0, blue = 1, green = 0, alpha = .5,), 
border = NA, add = T)

Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...