具有重复因素的 ggplot 组的绘图顺序
Plotting order for ggplot groups with repeated factors
我正在尝试进行一些文本分析,并尝试使用反向文档频率(数值)显示每本书的热门词。我主要关注 TidyText 挖掘,但使用的是哈利波特。
有些书之间的前几个词(使用 IDF)是相同的(例如 Lupin 或 Griphook),并且在绘图时,顺序使用该词的最大 IDF。例如,拉钩是《魔法石》和《死亡圣器》中的关键词。它在死亡圣器中的价值为 .0007,但只有 .0002,但被列为魔法石的最高价值。
hp.plot <- hp.words %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word))))
##For correct ordering of books
hp.plot$book <- factor(hp.plot$book, levels = c('Sorcerer\'s Stone', 'Chamber of Secrets',
'Prisoner of Azkhaban', 'Goblet of Fire',
'Order of the Phoenix', 'Half-Blood Prince',
'Deathly Hallows'))
hp.plot %>%
group_by(book) %>%
top_n(10) %>%
ungroup %>%
ggplot(aes(x=word, y=tf_idf, fill = book, group = book)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~book, scales = "free") +
coord_flip()
和 here's 数据帧图像供您参考。
我事先尝试过排序,但似乎不起作用。有什么想法吗?
编辑:CSV is here
reorder()
函数将按指定变量对因子重新排序(参见 ?reorder
)。
在绘图之前的最后一个块中的 ungroup()
之后插入 mutate(word = reorder(word, tf_idf))
应该按 tf_idf
重新排序。我没有你的数据样本,但使用 janeaustenr
包,这样做是一样的:
library(tidytext)
library(janeaustenr)
library(dplyr)
book_words <- austen_books() %>%
unnest_tokens(word, text) %>%
count(book, word, sort = TRUE) %>%
ungroup()
total_words <- book_words %>%
group_by(book) %>%
summarize(total = sum(n))
book_words <- left_join(book_words, total_words)
book_words <- book_words %>%
bind_tf_idf(word, book, n)
library(ggplot2)
book_words %>%
group_by(book) %>%
top_n(10) %>%
ungroup() %>%
mutate(word = reorder(word, tf_idf)) %>%
ggplot(aes(x = word, y = tf_idf, fill = book, group = book)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~book, scales = "free") +
coord_flip()
如果您想手动更改因子水平的顺序,您可以尝试:
word = factor(word, levels = word[c(grep("griphook", word)[1], grep("quirrell", word)[1], ...)]);
如果因子水平应按 tf_idf 排序,您可以使用以下内容:
level_ordered =rep(0, l)
for (i in 0: (l-1))
{
level_ordered = c(level_ordered, grep(as.character((sort(tf_idf, partial=l-i)[l-i])), tf_idf)[1])
}
word = factor(word, levels=word[level_ordered])
问的是一个以前已经回答过的问题,但我不熟悉 ggplot 的术语。它在下面的 SO 线程中得到了回答。
我正在尝试进行一些文本分析,并尝试使用反向文档频率(数值)显示每本书的热门词。我主要关注 TidyText 挖掘,但使用的是哈利波特。
有些书之间的前几个词(使用 IDF)是相同的(例如 Lupin 或 Griphook),并且在绘图时,顺序使用该词的最大 IDF。例如,拉钩是《魔法石》和《死亡圣器》中的关键词。它在死亡圣器中的价值为 .0007,但只有 .0002,但被列为魔法石的最高价值。
hp.plot <- hp.words %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word))))
##For correct ordering of books
hp.plot$book <- factor(hp.plot$book, levels = c('Sorcerer\'s Stone', 'Chamber of Secrets',
'Prisoner of Azkhaban', 'Goblet of Fire',
'Order of the Phoenix', 'Half-Blood Prince',
'Deathly Hallows'))
hp.plot %>%
group_by(book) %>%
top_n(10) %>%
ungroup %>%
ggplot(aes(x=word, y=tf_idf, fill = book, group = book)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~book, scales = "free") +
coord_flip()
和 here's 数据帧图像供您参考。
我事先尝试过排序,但似乎不起作用。有什么想法吗?
编辑:CSV is here
reorder()
函数将按指定变量对因子重新排序(参见 ?reorder
)。
在绘图之前的最后一个块中的 ungroup()
之后插入 mutate(word = reorder(word, tf_idf))
应该按 tf_idf
重新排序。我没有你的数据样本,但使用 janeaustenr
包,这样做是一样的:
library(tidytext)
library(janeaustenr)
library(dplyr)
book_words <- austen_books() %>%
unnest_tokens(word, text) %>%
count(book, word, sort = TRUE) %>%
ungroup()
total_words <- book_words %>%
group_by(book) %>%
summarize(total = sum(n))
book_words <- left_join(book_words, total_words)
book_words <- book_words %>%
bind_tf_idf(word, book, n)
library(ggplot2)
book_words %>%
group_by(book) %>%
top_n(10) %>%
ungroup() %>%
mutate(word = reorder(word, tf_idf)) %>%
ggplot(aes(x = word, y = tf_idf, fill = book, group = book)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~book, scales = "free") +
coord_flip()
如果您想手动更改因子水平的顺序,您可以尝试:
word = factor(word, levels = word[c(grep("griphook", word)[1], grep("quirrell", word)[1], ...)]);
如果因子水平应按 tf_idf 排序,您可以使用以下内容:
level_ordered =rep(0, l)
for (i in 0: (l-1))
{
level_ordered = c(level_ordered, grep(as.character((sort(tf_idf, partial=l-i)[l-i])), tf_idf)[1])
}
word = factor(word, levels=word[level_ordered])
问的是一个以前已经回答过的问题,但我不熟悉 ggplot 的术语。它在下面的 SO 线程中得到了回答。