Как создать масштабированные и фасетированные кластерные гистограммы обобщенного фрейма данных в ggplot2? - PullRequest
2 голосов
/ 14 июля 2020

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

Я суммировал данные, превратил их в длинную форму и попытался использовать facet_wrap.

iris %>%
  group_by(Species) %>%
  summarise(M.Sepal.Length=mean(Sepal.Length),
            M.Sepal.Width=mean(Sepal.Width),
            M.Petal.Length= mean(Petal.Length),
            M.Petal.Width=mean(Petal.Width)) %>%
  gather(key = Part, value = Value,  M.Sepal.Length:M.Petal.Width) %>%
ggplot(., aes(Part, Value, group = Species, fill=Species)) +
  geom_col(position = "dodge") + 
  facet_grid(cols=vars(Part)) + 
  facet_grid(cols = vars(Part))

Однако График, который я получаю, имеет метки x.axis, которые нанизаны на каждую сетку фасетов. Кроме того, кластеризованные графики не центрируются в каждом блоке фасета. Вместо этого они появляются на месте соответствующей метки оси X. Я бы хотел избавиться от меток оси x, центрировать графики и масштабировать графики в пределах каждого аспекта.

Вот изображение полученного графика, размеченного моим ожидаемым результатом: Моя попытка

1 Ответ

1 голос
/ 14 июля 2020

Возможно, это то, что вы ищете?

Ключевые изменения:

  1. Удаление Part как переменной, сопоставленной с x, таким образом данные отображается в одном месте в каждом фасете
  2. Переключитесь на facet_wrap, чтобы вы могли использовать scales = "free_y"
  3. Используйте labs, чтобы вручную добавить x заголовок
  4. Добавить theme, чтобы избавиться от меток на оси X и меток.
library(ggplot2)
library(dplyr) # Version >= 1.0.0
iris %>%
    group_by(Species) %>%
    summarise(across(1:4, mean, .names = "M.{col}")) %>%
    gather(key = Part, value = Value,  M.Sepal.Length:M.Petal.Width) %>%
ggplot(., aes(x = 1, y = Value, group = Species, fill=Species)) +
  geom_col(position = "dodge") + 
  facet_wrap(.~Part, nrow = 1, scales = "free_y") +
  labs(x = "Part") + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

enter image description here

I also took the liberty of switching out your manual call to summarise with the new across functionality.

Here's how you might also calculate error bars:

library(tidyr)
iris %>%
    group_by(Species) %>%
    summarise(across(1:4, list(M = mean, SE = ~ sd(.)/sqrt(length(.))),
                     .names = "{fn}_{col}")) %>%
    pivot_longer(-Species, names_to = c(".value","Part"),
                 names_pattern = "([SEM]+)_(.+)") %>% 
ggplot(., aes(x = 1, y = M, group = Species, fill=Species)) +
  geom_col(position = "dodge") + 
  geom_errorbar(aes(ymin = M - SE, ymax = M + SE), width = 0.5,
                position = position_dodge(0.9)) +
  facet_wrap(.~Part, nrow = 1, scales = "free_y") +
  labs(x = "Part", y = "Value") + 
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank()) 

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

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