带有有序条形图并使用分面
Graph with ordered bars and using facets
我正在尝试根据频率制作一个带有有序条形图的图表,并且还使用一个变量使用两个独立的两个变量使用方面。 单词必须按 'n' 变量中给定的值排序。 所以,我的图表应该看起来像 this one which appears in tidytext book:
我的图表如下,单词没有按值排序,我的错误是什么?:
我的数据看起来像示例中的数据:
> d
# A tibble: 20 x 3
word u_c n
<chr> <chr> <dbl>
1 apples candidate 0.567
2 apples user 0.274
3 melon user 0.191
4 curcuma candidate 0.105
5 banana user 0.0914
6 kiwi candidate 0.0565
...
按照书上提供的代码,根据我的资料修改,代码如下:
d %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n, fill = u_c)) +
geom_col(show.legend = F) +
facet_wrap(~u_c, scales = "free_y") +
coord_flip()
这是 d
的 dput
:
d <- structure(list(word = c("apples", "apples", "melon", "curcuma",
"banana", "kiwi", "grape", "curcuma", "grape",
"wood", "satsuma", "melon", "raisin", "papaya", "plum",
"plum", "papaya", "banana", "satsuma", "peach"), u_c = c("candidate",
"user", "user", "candidate", "user", "candidate", "user", "user",
"candidate", "user", "user", "candidate", "user", "candidate",
"candidate", "user", "user", "candidate", "candidate", "candidate"
), n = c(0.56704584625991, 0.273789875549109, 0.190633674260422,
0.105308514305412, 0.0914084706627656, 0.0565322302654257, 0.0562029558128485,
0.0547338017954938, 0.0498104102033781, 0.0439600056682254, 0.0393399851625864,
0.0380903136849362, 0.0370685271783074, 0.0370561875215443, 0.035849706997587,
0.0352763676677753, 0.0325506180866405, 0.0206825232678387, 0.0198207514650121,
0.0113753877973113)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -20L))
GordonShumway 旁边的非常相关的评论(因为那里提供的解决方案有点黑魔法) - 您可以创建一个临时值来重新排序您的方面 - 注意我使用的是 forcats::fct_reorder
而不是 reorder
library(tidyverse)
d %>%
mutate(temp = paste0(word, u_c)) %>%
ggplot(aes(x = fct_reorder(temp, n), y = n, fill = u_c)) +
geom_col(show.legend = F) +
facet_wrap(~u_c, scales = "free_y") +
coord_flip()
鉴于@GordonShumway 提供的信息并遵循@CPak 给出的答案,下面我提供了解决此问题的完整且“棘手”且不优雅的方法。几乎完整的答案(来自@CPak)和另外一行终于解决了问题:
d %>%
mutate(temp = paste(word, u_c, sep = "_")) %>%
ggplot(aes(x = fct_reorder(temp, n), y = n, fill = u_c)) +
geom_col(show.legend = F) +
scale_x_discrete(labels = function(x) str_replace(x,"_candidate|_user", "")) +
facet_wrap(~u_c, scales = "free_y") +
coord_flip()
感谢您的回答!
我正在尝试根据频率制作一个带有有序条形图的图表,并且还使用一个变量使用两个独立的两个变量使用方面。 单词必须按 'n' 变量中给定的值排序。 所以,我的图表应该看起来像 this one which appears in tidytext book:
我的图表如下,单词没有按值排序,我的错误是什么?:
> d
# A tibble: 20 x 3
word u_c n
<chr> <chr> <dbl>
1 apples candidate 0.567
2 apples user 0.274
3 melon user 0.191
4 curcuma candidate 0.105
5 banana user 0.0914
6 kiwi candidate 0.0565
...
按照书上提供的代码,根据我的资料修改,代码如下:
d %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n, fill = u_c)) +
geom_col(show.legend = F) +
facet_wrap(~u_c, scales = "free_y") +
coord_flip()
这是 d
的 dput
:
d <- structure(list(word = c("apples", "apples", "melon", "curcuma",
"banana", "kiwi", "grape", "curcuma", "grape",
"wood", "satsuma", "melon", "raisin", "papaya", "plum",
"plum", "papaya", "banana", "satsuma", "peach"), u_c = c("candidate",
"user", "user", "candidate", "user", "candidate", "user", "user",
"candidate", "user", "user", "candidate", "user", "candidate",
"candidate", "user", "user", "candidate", "candidate", "candidate"
), n = c(0.56704584625991, 0.273789875549109, 0.190633674260422,
0.105308514305412, 0.0914084706627656, 0.0565322302654257, 0.0562029558128485,
0.0547338017954938, 0.0498104102033781, 0.0439600056682254, 0.0393399851625864,
0.0380903136849362, 0.0370685271783074, 0.0370561875215443, 0.035849706997587,
0.0352763676677753, 0.0325506180866405, 0.0206825232678387, 0.0198207514650121,
0.0113753877973113)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -20L))
GordonShumway 旁边的非常相关的评论(因为那里提供的解决方案有点黑魔法) - 您可以创建一个临时值来重新排序您的方面 - 注意我使用的是 forcats::fct_reorder
而不是 reorder
library(tidyverse)
d %>%
mutate(temp = paste0(word, u_c)) %>%
ggplot(aes(x = fct_reorder(temp, n), y = n, fill = u_c)) +
geom_col(show.legend = F) +
facet_wrap(~u_c, scales = "free_y") +
coord_flip()
鉴于@GordonShumway 提供的信息并遵循@CPak 给出的答案,下面我提供了解决此问题的完整且“棘手”且不优雅的方法。几乎完整的答案(来自@CPak)和另外一行终于解决了问题:
d %>%
mutate(temp = paste(word, u_c, sep = "_")) %>%
ggplot(aes(x = fct_reorder(temp, n), y = n, fill = u_c)) +
geom_col(show.legend = F) +
scale_x_discrete(labels = function(x) str_replace(x,"_candidate|_user", "")) +
facet_wrap(~u_c, scales = "free_y") +
coord_flip()
感谢您的回答!