Отдельные двоичные значения в фасетной гистограмме на ggplot2

#r #ggplot2

#r #ggplot2

Вопрос:

Я создаю серию гистограмм с помощью facet_grid и я хочу, чтобы каждая гистограмма в сетке имела одинаковое количество классов, в примере ниже, например, 6 классов. Проблема в приведенном ниже примере заключается в том, что binwidth = diff(range(x$data))/6) определяет классы в соответствии с общим диапазоном значений a, b и c, т.е. определяет одну ширину ячеек для всех трех фасетов.

Как мне определить ширину ячеек индивидуально для фасетов a, b и c?

 require("ggplot2")

a <- c(1.21,1.57,1.21,0.29,0.36,0.29,0.93,0.26,0.28,0.48,
       0.12,0.38,0.83,0.82,0.41,0.69,0.25,0.98,0.52,0.11)
b <- c(0.42,0.65,0.17,0.38,0.44,0.01,0.01,0.03,0.15,0.01)
c <- c(1.09,3.55,1.07,4.55,0.55,0.11,0.72,0.66,1.22,3.04,
       2.01,0.64,0.47,1.33,3.44)

x <- data.frame(data = c(a,b,c), variable = c(rep("a",20),rep("b",10),rep("c",15)),area="random")

qplot(data, data = x, geom = "histogram", binwidth = diff(range(x$data))/6)  
  facet_grid(area~variable, scales = "free")
  

Ответ №1:

Это не оптимально, но вы можете создать гистограмму в разных слоях:

 ggplot(x, aes(x=data))  
   geom_histogram(data=subset(x, variable=="a"), binwidth=.1)  
   geom_histogram(data=subset(x, variable=="b"), binwidth=.2)  
   geom_histogram(data=subset(x, variable=="c"), binwidth=.5)  
   facet_grid(area~variable, scales="free")
  

Комментарии:

1. Этот метод «грубой силы» может быть не оптимальным, но работает очень хорошо. Спасибо!

Ответ №2:

Один из способов — предварительно суммировать ваши данные так, как вы этого хотите, а затем создать график.

В вашем случае вам нужно объединить ваши переменные с помощью функции cut() . Пакет dplyr удобен для этого, поскольку позволяет указать функцию изменения для каждой группы ваших данных:

 library(dplyr)

zz <- x %>%
  group_by(variable) %>%
  mutate(
    bins = cut(data, breaks=6)
  )

qplot(bins, data = zz, geom = "histogram", fill=I("blue"))  
  facet_grid(area~variable, scales = "free")  
  theme(axis.text.x = element_text(angle=90))
  

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

Комментарии:

1. Хотя этот метод в принципе работает хорошо, он создает только ряд графиков с одинаковыми диапазонами по оси x. Поскольку у меня разные диапазоны, я выбрал метод «грубой силы» wije. Тем не менее, спасибо вам за ваш вклад!