Заполнение гистограммы не соответствует всем существующим уровням фактора в определенных ячейках - PullRequest
0 голосов
/ 31 мая 2019

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

Настройка должна быть довольно простой; Я установил geom_histogram с x = ценой, назначил заливку (cpm.bins) и изменил масштаб оси x. Как уже упоминалось ранее, я добавил geom_text для отображения среднего числа оборотов в минуту для каждого бина. Я заметил, что что-то было не так, и запутался во фрейме данных.

Это небольшой пример фрейма данных, который я использую, но я считаю, что этого будет достаточно, чтобы продемонстрировать проблему.

library(lemon)
library(ggplot2)

df1 <- data.table::fread(
  "id   size price         cpm.bin int.ave.cpm p.int
    420  12ounce  2.39            Good       32.50   2.4
    629  12ounce  2.78 Underperforming       18.00   2.8
    940  12ounce  2.49  Non-purchasing       22.00   2.5
    1653 12ounce  2.45            Good       22.00   2.5
    1660 12ounce  2.45            Good       22.00   2.5
    2561 20ounce  2.59 Underperforming       13.65   2.6
    2578 20ounce  2.39 Underperforming       26.02   2.4
    2580 20ounce  2.39 Underperforming       26.02   2.4
    2581 20ounce  2.39            Good       26.02   2.4
    2582 20ounce  2.39            Good       26.02   2.4
    2583 20ounce  2.39            Good       26.02   2.4
    2584 20ounce  2.39            Good       26.02   2.4
    2587 20ounce  2.49  Non-purchasing       20.05   2.5
    2589 20ounce  2.99 Underperforming       18.13   3.0
    2599 20ounce  2.49  Non-purchasing       20.05   2.5
    2600 20ounce  2.49 Underperforming       20.05   2.5
    2606 20ounce  2.59  Non-purchasing       13.65   2.6
    2607 20ounce  2.39            Good       26.02   2.4
    2609 20ounce  2.39 Underperforming       26.02   2.4
    2629 20ounce  2.49  Non-purchasing       20.05   2.5
  "
)

df2 <- data.table::fread(
  "id size price         cpm.bin int.ave.cpm p.int
  629  12ounce  2.78 Underperforming       18.00   2.8
  940  12ounce  2.49  Non-purchasing       22.00   2.5
  1653 12ounce  2.45            Good       22.00   2.5
  1660 12ounce  2.45            Good       22.00   2.5
  2561 20ounce  2.59 Underperforming       13.65   2.6
  2587 20ounce  2.49  Non-purchasing       20.05   2.5
  2589 20ounce  2.99 Underperforming       18.13   3.0
  2599 20ounce  2.49  Non-purchasing       20.05   2.5
  2600 20ounce  2.49 Underperforming       20.05   2.5
  2606 20ounce  2.59  Non-purchasing       13.65   2.6
  2629 20ounce  2.49  Non-purchasing       20.05   2.5
  2634 20ounce  2.59  Non-purchasing       13.65   2.6
  2658 20ounce  2.49 Underperforming       20.05   2.5
  2665 20ounce  2.59  Non-purchasing       13.65   2.6
  2671 20ounce  2.69  Non-purchasing       21.18   2.7
  2673 20ounce  2.69            Good       21.18   2.7
  2674 20ounce  2.69            Good       21.18   2.7
  2675 20ounce  2.69 Underperforming       21.18   2.7
  2676 20ounce  2.69            Good       21.18   2.7
  2677 20ounce  2.69            Good       21.18   2.7"
)

при использовании этих фреймов данных для следующего ggplot, в бункере «12 унций» есть другое заполнение для бинара за 2,50 $.

ggplot(df1, aes(x = price)) +
  geom_histogram(aes(fill = cpm.bin), binwidth = 0.1, position = position_fill(), stat = "bin") +
  facet_rep_wrap(~size, nrow = 3, repeat.tick.labels = TRUE, scales = "free") +
  scale_x_continuous(breaks = seq(0, 10, by = 0.1), labels = scales::dollar) +
  geom_text(aes(x = p.int, y = 0.5, label=int.ave.cpm), size=4)

enter image description here

единственная разница этих подмножеств - минимально возможное значение для p.int. Для df1 минимум составляет 2,4, а для df2 минимум составляет 2,5.

Для корзины стоимостью 2,50 долл. США в разделе «12 унций» заливка должна быть 2/3 «хорошая» (синяя) и 1/3 «Непокупаемая» (красная) независимо от того, какое минимальное значение p. int is. Что происходит и как я могу это исправить, чтобы мои графики отображали значения точно и пропорционально, когда я использую весь свой фрейм данных?

Спасибо.

1 Ответ

0 голосов
/ 31 мая 2019

Я бы использовал geom_bar() вместо geom_histogram() для этого. Я изменил код, чтобы показать, как я буду строить сюжет. Вы по-прежнему можете использовать пакет lemon для аккуратной маркировки и т. Д.

# plot_1 <-
ggplot(df1) +
  geom_bar(aes(x = round(price, 1), fill = cpm.bin), width = 0.09) +
  facet_grid(~size) + 
  scale_fill_manual(values = c("dodgerblue2", "coral1", "mediumseagreen")) +
  xlim(2.3, 3.1) + ylim(0, 10) +
  #theme(legend.position = "none") +
  labs(title = "df1")

# plot_2 <-
ggplot(df2) +
  geom_bar(aes(x = round(price, 1), fill = cpm.bin), width = 0.09) +
  facet_grid(~size) +
  scale_fill_manual(values = c("dodgerblue2", "coral1", "mediumseagreen")) +
  xlim(2.3, 3.1) + ylim(0, 10) +
  labs(title = "df2")

# gridExtra::grid.arrange(plot_1, plot_2, nrow = 2)

enter image description here

...