Как эффективно переупорядочить коэффициенты в ggplot? - PullRequest
1 голос
/ 12 марта 2019

Моя проблема заключается в том, что я хочу изменить порядок факторов в выводе ggplot, полученном с использованием geom_bar(position = "fill"), чтобы наибольшая доля положительного класса была ближе всего к оси Y.Мне удалось найти рабочее решение, но из моих исследований кажется, что есть более эффективное решение, хотя я не могу его найти.

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

У меня естьвзглянул на раздел Порядок модифицирующего фактора в книге, R для Data Science , и предлагается решение, в котором создается сводный фрейм данных со столбцом «prop» и линейным графиком, созданным из этих значений с использованиемfct_reorder2().Однако я не могу применить подобную логику к «заполненной» гистограмме.

Решение, на которое я наконец наткнулся, пришло из этого источника # 267 ЗАПИСЬ ПЕРЕМЕННОЙ В GGPLOT2 , посредством чегоВы просто устанавливаете новые уровни факторов, используя mutate().Однако вместо того, чтобы самому определять порядок, я создал фрейм данных, упорядочивающий коэффициент по пропорции положительного класса.

Я хотел бы знать, есть ли более эффективный способ сделать это, возможно, в одной операции с длинным каналом?

Вот воспроизводимый пример:

library(ggplot2)
library(dplyr)

variable <- c(rep("alpha", 4),
              rep("beta", 4),
              rep("gamma", 4),
              rep("delta", 4))

class <- c(rep("1", 4),
           "1", "1", "0", "0",
           rep("0", 3), "1",
           rep("1", 3), "0")

dframe <- data.frame(variable, class)

plot_order <- dframe %>%
  count(variable, class) %>%
  group_by(variable) %>%
  mutate(prop = prop.table(n)) %>%
  filter(class == "1") %>%
  arrange(prop)

lvls <- as.character(plot_order$variable)

dframe %>%
  mutate(variable = factor(variable, levels = lvls)) %>%
  ggplot(aes(x = variable, fill = class)) +
  geom_bar(position ="fill") +
  labs(y = "Proportion")

Вот вывод plot_order:

# A tibble: 4 x 4
# Groups:   variable [4]
  variable class     n  prop
  <fct>    <fct> <int> <dbl>
1 alpha    1         4  1   
2 delta    1         3  0.75
3 beta     1         2  0.5 
4 gamma    1         1  0.25

И результат:

Гистограмма с упорядоченными коэффициентами, основанными на позиции "fill"

Bar graph with ordered factors based on position

Заранее спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете использовать fct_reorder из пакета forcats.Этот пакет также упоминался несколько раз в первом вопросе, который вы связали:

# data
dframe <- data.frame(
  variable = rep(c("alpha", "beta", "gamma", "delta"), each = 4),
  class = c(rep("1", 4),
            "1", "1", "0", "0",
            rep("0", 3), "1",
            rep("1", 3), "0"))

dframe %>%
  # convert variable to a factor, ordered (in descending order) by the proportion of
  # rows where the class == "1"
  mutate(variable = forcats::fct_reorder(.f = variable, 
                                         .x = class,
                                         .fun = function(.x) mean(.x == "1"),
                                         .desc = TRUE)) %>%
  ggplot(aes(x = variable, fill = class)) +
  geom_bar(position = "fill") +
  labs(y = "Proportion")

plot

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