Как сгенерировать вложенные сюжеты с сгруппированной категориальной переменной, отсортированной по числовой переменной c в ggplot? - PullRequest
1 голос
/ 02 мая 2020

У меня есть фрейм данных text с числом n из word, появляющимся в каждом файле file_num = 1 or 2 or 3. Я хотел бы использовать ggplot для генерации трех вспомогательных участков, по одному для каждого значения file_num, с word по оси Y и частотой n по оси X. Я хочу, чтобы каждый подзаголовок сортировался в соответствии с увеличением или уменьшением значения n, наблюдаемого при каждом file_num. Я пробовал много разных способов решить эту, казалось бы, тривиальную проблему, но безуспешно.

Вот dput моих тестовых данных:

structure(list(file_num = c("1", "1", "1", "1", "2", "2", "2", 
"2", "2", "3", "3", "3", "3", "3"), word = c("test", "quality", 
"page", "limit", "information", "limit", "test", "instruments", 
"quality", "limit", "test", "effective", "page", "system"), n = c(5, 
35, 55, 75, 20, 30, 40, 60, 70, 101, 201, 301, 401, 501)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -14L), spec = structure(list(
    cols = list(file_num = structure(list(), class = c("collector_character", 
    "collector")), word = structure(list(), class = c("collector_character", 
    "collector")), n = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

Вот что я пробовал:

library(tidytext)
library(stringr)
library(pdftools)
library(dplyr)
library(purrr)
library(ggplot2)
library(forcats)
text %>% group_by(file_num) %>% arrange(file_num, desc(n)) %>%
    ggplot(.,aes(factor(word,levels = unique(word)), n, fill = file_num)) + 
    geom_bar(stat = "identity", position = "dodge") +
    scale_x_discrete("Word") +
    scale_y_continuous("n")  + coord_flip() +
    facet_grid(rows = vars(file_num), scales = "free")

Вот график, который генерируется с использованием код выше на фрейме данных text, созданный с использованием данных dput. Он показывает желаемый результат (word, отсортированный с увеличением значения n) для file_num = 1, но не для file_num = 2 или 3: enter image description here

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Спасибо @Tjebo за указание в правильном направлении. Вот рабочее решение, основанное на ggplot. Требуется сохранить один измененный фрейм данных text перед его использованием в ggplot.

Дайте мне знать, если есть способ напрямую передать измененный фрейм данных в ggplot

text1 <- text %>% ungroup %>% arrange(file_num, n) %>%
            mutate(order = row_number()) # create variable order 

ggplot(text1,aes(order, n, fill = file_num)) + 
    geom_bar(stat = "identity", show.legend = FALSE) +
    scale_x_continuous(
        breaks = text1$order,
        labels = text1$word,
        expand = c(0,0),
        xlab("Word")) +
    facet_grid(file_num ~ ., scales = "free") +
    coord_flip() 

Выходной участок: enter image description here

0 голосов
/ 02 мая 2020

Вы можете достичь этого "упорядоченного по фасету" довольно просто с помощью пакета ggcharts, используя следующий код для ваших данных:

library(ggcharts)
bar_chart(data = text, x = word, y = n, 
  fill = file_num,
  facet = file_num,
  horizontal = TRUE
)

Это дает следующий график:

enter image description here

Пожалуйста, дайте мне знать, хотите ли вы этого.

Обновление:

Объект, созданный bar_chart, имеет класс ggplot, как можно видеть ниже:

class(chart)
[1] "gg"     "ggplot"

Это означает, что можно использовать функции ggplot2 для изменения графика, например:

chart + 
  guides(fill=FALSE) +      ## remove legend 
  ggtitle("My new title") + ## add title
  theme_linedraw() +
  theme(strip.background = element_rect(colour = "red", size = 2))

, получая следующее пи c (только для иллюстрации):

enter image description here

...