Как сделать граненую вафельную таблицу, заполняя каждую корзину сверху слева

Я пытаюсь создать сетку ячеек 3x4 с подсчетом наблюдений из моих данных в каждой ячейке. Я на полпути:

library(ggplot2)
type <- c('daily', 'daily', 'habit', 'habit', 'habit', 'seasonal', 'seasonal', 'year-long', 'year-long', 'year-long', 'year-long', 'year-long')
status <- c('complete', 'incomplete', 'push', 'push', 'incomplete', 'complete', 'complete', 'complete', 'complete', 'push', 'push', 'incomplete')
results <- data.frame(type, status)

ggplot(results) +
  geom_dotplot(aes(x=status, y=type), binwidth=.2) +
  facet_grid(vars(type))

Ясно, что ось Y сейчас бессмысленна - я не уверен, что geom_dotplotэто то, что нужно использовать. Я могу получить аналогичные результаты сgeom_histogram или geom_bar также.

Я бы хотел, чтобы точки начинались в верхнем левом углу каждой корзины. Это возможно? Я пробовал использоватьwaffle пакет, но не могу понять. В идеале каждая точка должна быть квадратом, что невозможно при использованииgeom_dotplot, поэтому я бы предпочел использовать waffle если я могу.

1 ответ

Решение

В настоящее время существует открытая проблема с этим пакетом waffle, из-за которой я не смог создать диаграмму так, как я хотел (получение ошибки "недопустимый аргумент 'times'"), используя facet_grid как для статуса, так и для типа.

В качестве альтернативы мы можем провести некоторую подготовку данных, чтобы создать нечто подобное.

rows <- 4
cols <- 4

results %>%
  arrange(status, type) %>%
  group_by(status, type) %>%
  mutate(num = row_number(),
         x_pos = (num - 1) %/% rows,
         y_pos = rows - (num - 1) %% rows - 1) %>%

  ggplot(aes(x = x_pos, y = y_pos)) +
  geom_tile(fill = "black", color = "white") +
  coord_equal(xlim = c(0, cols) - 0.5,
              ylim = c(0, rows) - 0.5) +
  facet_grid(vars(type), vars(status)) +
  theme_light() +
  theme(panel.grid = element_blank(),
        axis.text = element_blank())

Другие вопросы по тегам