Расположите факторы в порядке возрастания

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

#preparing the data to resemble actual data
test <- data.frame(HairEyeColor) %>%
  mutate(combi = paste(Hair,Eye)) %>%
  group_by(Sex) %>%
  mutate(prop = Freq / sum(Freq))  %>%
  ungroup() 
test$combi <- factor(test$combi)
freq_test_count <- test %>%
  setorder(Freq)

#creating the plot
freq_test_plot <- freq_test_count %>%
  ggplot(aes(x = reorder(combi,prop),y = prop, label = Freq)) +
  geom_col(show.legend = FALSE) +
  geom_text(check_overlap = TRUE, nudge_y = 0.005, size = 3) + 
  facet_wrap(~Sex, scales = "free") +
  labs(y = "Proportion",
       x = NULL) +
  coord_flip()

Когда я рисую freq_test_plot, он показывает график, но выход не в порядке убывания

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

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


person Abhishek Sourabh    schedule 03.01.2018    source источник
comment
Выглядит в общем порядке убывания. Вы имеете в виду, что вам нужны шкалы в разном порядке для мужчин и женщин? Это может ввести в заблуждение, поскольку потребуется внимательный наблюдатель, чтобы понять, что метки расположены в разном порядке.   -  person Gregor Thomas    schedule 03.01.2018
comment
Идея состоит в том, чтобы показать, что метки расположены в разном порядке для самцов и самок. Я не уверен, как здесь решается порядок. Я не могу понять, почему Blond Blue 30 предшествует Brown Blue 50.   -  person Abhishek Sourabh    schedule 04.01.2018
comment
Ваш заказ проигнорировал секс. Всего светло-голубой имеет 30 + 64 = 94, поэтому он опережает коричнево-синий, который составляет 50 + 34 = 84. Я думаю, что эта диаграмма полезна, потому что она упорядочивает население в целом и где столбцы для определенного пола находятся. не для того, чтобы подчеркнуть различия между полами. Диаграмма, которую вы запрашиваете, значительно усложняет сравнение половых различий, потому что вам приходится переключаться между чтением и сравнением этикеток.   -  person Gregor Thomas    schedule 04.01.2018
comment
Например, в этой версии становится очевидным, что комбинация Blond Blue гораздо чаще встречается у женщин, чем у мужчин — она бросается в глаза, как только вы смотрите на график. Однако диаграммы в ответах скрывают это понимание, если вы не прочитаете их внимательно. Точно так же диаграмма в вашем вопросе показывает, что коричневый синий встречается чаще, чем у женщин, но если вы взглянете на диаграммы в ответах, я бы предположил, что метки расположены в том же порядке, и, поскольку распределения выглядят примерно одинаково, я бы пришел к выводу, что нет реальной разницы между мужским и женским распределением.   -  person Gregor Thomas    schedule 04.01.2018


Ответы (3)


Обходной путь — создать два разных графика и расположить их в сетке. Но вы должны быть осторожны, потому что, как упомянул Грегор, это определенно может ввести в заблуждение .

library(grid)
p1 = freq_test_count[freq_test_count$Sex == "Male",] %>%
    ggplot(aes(x = reorder(combi,prop),y = prop, label = Freq)) +
    geom_col(show.legend = FALSE) +
    geom_text(check_overlap = TRUE, nudge_y = 0.005, size = 3) + 
    facet_wrap(~Sex, scales = "free") +
    labs(y = "Proportion",
         x = NULL) +
    coord_flip()

p2 = freq_test_count[freq_test_count$Sex == "Female",] %>%
    ggplot(aes(x = reorder(combi,prop),y = prop, label = Freq)) +
    geom_col(show.legend = FALSE) +
    geom_text(check_overlap = TRUE, nudge_y = 0.005, size = 3) + 
    facet_wrap(~Sex, scales = "free") +
    labs(y = "Proportion",
         x = NULL) +
    coord_flip()

graphics.off()
grid.newpage()
grid.draw(ggarrange(p1, p2, ncol = 2))

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

person d.b    schedule 03.01.2018
comment
Спасибо. Я надеялся, что мне не придется добавлять еще одну библиотеку, так как код может быть передан другим. Но, кажется, это единственный путь. Я приму это как ответ, если ничего лучшего не появится. - person Abhishek Sourabh; 04.01.2018

Другим обходным решением является создание мужских и женских уровней для фактора. Здесь я добавляю пробел " " перед метками Мужские волосы/глаза. Это позволяет определить порядок, учитывающий пол:

test <- data.frame(HairEyeColor) %>%
  mutate(combi = paste(Hair,Eye)) %>%
  group_by(Sex) %>%
  mutate(prop = Freq / sum(Freq))  %>%
  ungroup() %>%
  mutate(combi = factor(test$combi),
         sex_combi = factor(paste(ifelse(Sex == "Male", " ", ""), Hair, Eye)),
         sex_combi = reorder(sex_combi, prop))

#creating the plot

ggplot(test, aes(x = sex_combi,y = prop, label = Freq)) +
  geom_col(show.legend = FALSE) +
  geom_text(check_overlap = TRUE, nudge_y = 0.005, size = 3) + 
  facet_wrap(~Sex, scales = "free") +
  labs(y = "Proportion",
       x = NULL) +
  coord_flip()

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

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

person Gregor Thomas    schedule 03.01.2018
comment
Спасибо. Я проверю, приемлемо ли введение ведущего символа в мои фактические данные. - person Abhishek Sourabh; 04.01.2018

Вы хотите, чтобы значения были отсортированы по мужскому или женскому полу?

library(tidyverse)

#preparing the data to resemble actual data
test <- data.frame(HairEyeColor) %>%
  mutate(combi = paste(Hair,Eye)) %>%
  group_by(Sex) %>%
  mutate(prop = Freq / sum(Freq))  %>%
  ungroup() 
test$combi <- factor(test$combi)


test$combi<- factor(test$combi, levels = unique(test$combi)[order(test$Freq)],)

#creating the plot

  ggplot(test,aes(x = combi,y = prop, label = Freq))+
  geom_col(show.legend = FALSE)+
  geom_text(check_overlap = TRUE, nudge_y = 0.005, size = 3) + 
  facet_wrap(~Sex, scales = "free")+ 
  labs(y = "Proportion",
   x = NULL) +
  coord_flip()

обновлен, чтобы включить полный код из вопроса.

person jsimpsno    schedule 03.01.2018
comment
Это не создает для меня отсортированную гистограмму. - person Gregor Thomas; 03.01.2018
comment
Согласен с @Грегором. Этот код не создает для меня отсортированную гистограмму. - person Abhishek Sourabh; 04.01.2018
comment
Смысл диаграммы в том, чтобы показать сортировку по мужскому или женскому полу, а не по мужскому и женскому полу. Запуск кода покажет мужчину, отсортированную в порядке убывания. - person jsimpsno; 08.01.2018