【问题标题】:Ordering Axis Labels using reorder_within使用 reorder_within 对轴标签进行排序
【发布时间】:2023-03-20 10:43:01
【问题描述】:

我正在尝试使用此链接中描述的“内部重新排序”功能对我的轴标签进行排序:https://juliasilge.com/blog/reorder-within/ 稍作更改 - 将 2 个人的值设置为相同。

这是我正在使用的代码:

library(tidytext)
library(babynames)
library(tidyverse)

top_names <- babynames %>%
  filter(year >= 1950,
         year < 1990) %>%
  mutate(decade = (year %/% 10) * 10) %>%
  group_by(decade) %>%
  count(name, wt = n, sort = TRUE) %>%
  ungroup() %>%
  mutate(n = ifelse(decade == "1950" & name == "Michael", 846042, n)) #Added to create 2 rows with a tie. 


top_names %>%
  group_by(decade) %>%
  top_n(15) %>%
  ungroup %>%
  mutate(decade = as.factor(decade),
         name = reorder_within(name, n, decade)) %>%
  ggplot(aes(name, n, fill = decade)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~decade, scales = "free_y") +
  coord_flip() +
  scale_x_reordered() +
  scale_y_continuous(expand = c(0,0)) +
  labs(y = "Number of babies per decade",
       x = NULL,
       title = "What were the most common baby names in each decade?",
       subtitle = "Via US Social Security Administration")

我能够完美地运行代码,但我的问题是我想颠倒 y 轴上的名称顺序(顶部最不常见,底部最常见)。我可以通过将带有 reorder_within 的行更改为:

  mutate(decade = as.factor(decade),
         name = reorder_within(name, -n, decade))

但是,这颠倒了“迈克尔和约瑟夫”名字的顺序,我不希望发生这种情况。

如何指定当出现平局时,我希望名称仍按字母顺序排列?

【问题讨论】:

  • 或者,更好的是,在您绘制之前保存您过滤的top_names 并与我们分享dput(filtered_top_names)。然后我们可以在不安装babynames 包的情况下为您提供帮助。

标签: r ggplot2 axis-labels facet-wrap


【解决方案1】:

TBMK reorder_within 不提供不同的选项来处理关系。但是,一种选择是在应用reorder_within 后以所需顺序重新排列数据集,并使用forcats::fct_inorder (重新)设置因子水平:

library(tidytext)
library(babynames)
library(tidyverse)

top_names %>%
  group_by(decade) %>%
  top_n(15) %>%
  ungroup %>%
  mutate(decade = as.factor(decade),
         name = reorder_within(name, -n, decade)) %>%
  arrange(decade, desc(n), desc(name)) %>% 
  mutate(name = fct_inorder(name)) %>% 
  ggplot(aes(name, n, fill = decade)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = n), hjust = 1) +
  facet_wrap(~decade, scales = "free_y") +
  coord_flip() +
  scale_x_reordered() +
  scale_y_continuous(expand = c(0,0)) +
  labs(y = "Number of babies per decade",
       x = NULL,
       title = "What were the most common baby names in each decade?",
       subtitle = "Via US Social Security Administration")
#> Selecting by n

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 2019-07-20
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多