Передача `top_n` и `range` в ggplot (dplyr)
В TidyText Mining Section 3.3 есть прекрасный кусок кода, который я пытаюсь воспроизвести в своем собственном наборе данных. Однако в моих данных я не могу заставить ggplot "запомнить", что я хочу получить данные в порядке убывания, и что я хочу определенный top_n
,
Я могу запустить код из TidyText Mining и получить те же графики, что и в книге. Однако, когда я запускаю это в своем собственном наборе данных, в обертках фасетов не отображается top_n (кажется, они показывают случайное количество категорий), и данные в каждом фасете не сортируются в порядке убывания.
Я могу повторить эту проблему с некоторыми случайными текстовыми данными и полным кодом, но я также могу повторить проблему с mtcars
- что действительно смущает меня.
Я ожидаю, что следующий график покажет мне mpg в порядке убывания для каждого аспекта, и для каждого аспекта, чтобы дать мне только топ 1 категорию. Это не для меня.
require(tidyverse)
mtcars %>%
arrange (desc(mpg)) %>%
mutate (gear = factor(gear, levels = rev(unique(gear)))) %>%
group_by(am) %>%
top_n(1) %>%
ungroup %>%
ggplot (aes (gear, mpg, fill = am)) +
geom_col (show.legend = FALSE) +
labs (x = NULL, y = "mpg") +
facet_wrap(~am, ncol = 2, scales = "free") +
coord_flip()
Но то, что я действительно хочу, это иметь диаграмму, подобную этой, как в книге TidyText (данные только для примера).
require(tidyverse)
require(tidytext)
starwars <- tibble (film = c("ANH", "ESB", "ROJ"),
text = c("It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire. During the battle, Rebel spies managed to steal secret plans to the Empire's ultimate weapon, the DEATH STAR, an armored space station with enough power to destroy an entire planet. Pursued by the Empire's sinister agents, Princess Leia races home aboard her starship, custodian of the stolen plans that can save her people and restore freedom to the galaxy.....",
"It is a dark time for the Rebellion. Although the Death Star has been destroyed, Imperial troops have driven the Rebel forces from their hidden base and pursued them across the galaxy. Evading the dreaded Imperial Starfleet, a group of freedom fighters led by Luke Skywalker has established a new secret base on the remote ice world of Hoth. The evil lord Darth Vader, obsessed with finding young Skywalker, has dispatched thousands of remote probes into the far reaches of space....",
"Luke Skywalker has returned to his home planet of Tatooine in an attempt to rescue his friend Han Solo from the clutches of the vile gangster Jabba the Hutt. Little does Luke know that the GALACTIC EMPIRE has secretly begun construction on a new armored space station even more powerful than the first dreaded Death Star. When completed, this ultimate weapon will spell certain doom for the small band of rebels struggling to restore freedom to the galaxy...")) %>%
unnest_tokens(word, text) %>%
mutate(film = as.factor(film)) %>%
count(film, word, sort = TRUE) %>%
ungroup()
total_wars <- starwars %>%
group_by(film) %>%
summarize(total = sum(n))
starwars <- left_join(starwars, total_wars)
starwars <- starwars %>%
bind_tf_idf(word, film, n)
starwars %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word)))) %>%
group_by(film) %>%
top_n(10) %>%
ungroup %>%
ggplot(aes(word, tf_idf, fill = film)) +
geom_col(show.legend = FALSE) +
labs (x = NULL, y = "tf-idf") +
facet_wrap(~film, ncol = 2, scales = "free") +
coord_flip()
1 ответ
Я верю, что тебя здесь сбивает с толку то, что top_n()
по умолчанию используется последняя переменная в таблице, если вы не укажете ей, какую переменную использовать для упорядочения. В примерах в нашей книге последняя переменная в кадре данных tf_idf
так что это то, что используется для заказа. В примере с mtcars top_n()
использует последний столбец в кадре данных для упорядочения; это случается carb
,
Вы всегда можете сказать top_n()
какую переменную вы хотите использовать для упорядочения, передавая ее в качестве аргумента. Например, проверьте этот похожий рабочий процесс, используя набор данных diamonds.
library(tidyverse)
diamonds %>%
arrange(desc(price)) %>%
group_by(clarity) %>%
top_n(10, price) %>%
ungroup %>%
ggplot(aes(cut, price, fill = clarity)) +
geom_col(show.legend = FALSE, ) +
facet_wrap(~clarity, scales = "free") +
scale_x_discrete(drop=FALSE) +
coord_flip()
Создано в 2018-05-17 пакетом представлением (v0.2.0).
Эти примеры наборов данных не являются идеальными параллелями, потому что они не имеют одной строки на комбинацию характеристик, как это делают фреймы аккуратных текстовых данных. Я уверен, что проблема с top_n()
это проблема, хотя.