Как исправить ограненные диаграммы geom_col, чтобы они выглядели как оригинальные диаграммы? - PullRequest
0 голосов
/ 08 октября 2019

Я создаю geom_col() диаграммы в ggplot гранях по группируемым переменным. Когда группы отображаются в индивидуальном порядке, диаграммы выглядят так, как я ожидаю. Но при одновременном отображении многие столбцы (столбцы) исчезают, а остальные отображаются уже, чем раньше.

Кстати, числа, которые я пытаюсь построить, являются выходными данными dbplot::db_compute_binsТак что я пытаюсь собрать эти столбцы вместе, чтобы они выглядели как гистограмма.

Является ли это поведение разработанным?

Мой ожидаемый график - это тот же график, показанный рядом, масштабированныйвниз, чтобы соответствовать. Как получить ожидаемый график?

Данные:

test.dataframe = data.frame(
  group = rep(c('A', 'B'), each= 5),
  bins = c(-9000, -4400, 200, 4800, 9400,
             -2360, -1084.8, 190.4, 1465.6, 2740.8),
  counts = c(2, 6259, 2950, 8, 6, 
             22, 609, 543, 62, 5
             )
)

Первая группа:

ggplot(test.dataframe %>%
         filter(group == 'A')) +
  geom_col(aes(x= bins, y= counts)) +
  scale_y_log10()

Диаграмма:

Group A's Column Chart

Вторая группа:

ggplot(test.dataframe %>%
         filter(group == 'B')) +
  geom_col(aes(x= bins, y= counts)) +
  scale_y_log10()

Диаграмма:

Group B's Column Chart

Теперь собираем их вместе:

ggplot(test.dataframe) +
  geom_col(aes(x= bins, y= counts)) +
  scale_y_log10()+
  facet_wrap(vars(group),
             ncol = 2,
             scales = "free")

Диаграмма:

Chart with both groups faceted by group, column-wise

Построение по строкам приводит к другому графику, но все же не так, как я ожидал:

ggplot(test.dataframe) +
  geom_col(aes(x= bins, y= counts)) +
  scale_y_log10()+
  facet_wrap(vars(group),
             nrow = 2,
             scales = "free")

Результат:

Chart with both groups faceted by group, row-wise

1 Ответ

2 голосов
/ 08 октября 2019

Редактировать: рассуждения добавлены ниже.

Вот один подход, где мы вручную вычисляем ширину стержня и подаем его в ggplot:

library(dplyr)
test.dataframe %>%
  group_by(group) %>%
  mutate(bin_count = n(), range = max(bins) - min(bins)) %>%
  mutate(bin_width = 0.9 * range / (bin_count - 1)) %>%
  # not sure what to assume when there's only one bin...
  ungroup() %>%

ggplot() +
  geom_col(aes(x= bins, y= counts, width = bin_width)) +
  scale_y_log10()+
  facet_wrap(vars(group),
             ncol = 2,
             scales = "free")

enter image description here

Причина, по которой это происходит, заключается в том, что ggplot выполняет некоторую подготовку данных, чтобы показать вам данные с разумными (или предполагаемыми) значениями по умолчанию. В этом случае он вычисляет подразумеваемое разрешение вашей оси X и использует его для определения ширины стержня.

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

test.dataframe = data.frame(
  group = rep(c('A', 'B'), each= 5),
  bins = c(-9000, -4400, 200, 4800, 9400,
           -13600, -9000, -4400, 200, 4800),
  counts = c(2, 6259, 2950, 8, 6, 
             22, 609, 543, 62, 5
  )
)

Тогда ваш исходный ограненный код выдаст:

enter image description here

Проблема возникает из-за вычисления «разрешения данных»быть определенным на основе полных данных, так что ggplot предполагает, что ваши данные гораздо более детализированы, чем на самом деле. В настоящее время, вероятно, проще всего схватить колесо и указать ширину, которую вы действительно хотите, поскольку этот случай плохо работает с эвристикой по умолчанию.

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