首页 > 解决方案 > 在R中按两个变量分组后使用fct_reorder时如何指定要使用的变量值

问题描述

我想通过他们报告的头衔和性别来绘制对调查做出回应的人数,并且我想根据列出该头衔的人数对条形图进行排序。问题是,情节似乎是按“其他”报告的值排序的,而我更愿意根据“男性”报告的值对它们进行排序(仅仅是因为更多的男性做出了回应,这使得可视化效果更好)。这是我的数据:

structure(list(title = c("Penetration Tester", "Penetration Tester", 
"Application Security", "Infrastructure Security", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Security Engineer", "Security Engineer", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Audit", "Penetration Tester", 
"Research", "Penetration Tester", "Penetration Tester", "Security Consultant", 
"Sr. Security Consultant", "Security Engineer", "Compliance", 
"Penetration Tester", "Penetration Tester", "Red Team", "Penetration Tester", 
"Cloud Security", "Incident Response", "Penetration Tester", 
"Penetration Tester", "Incident Response", "Director", "Support", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Red Team", "Audit", "Security Consultant", 
"Incident Response", "Infrastructure Security", "Red Team", "Red Team", 
"Penetration Tester", "Senior Security Architect", "Penetration Tester", 
"Red Team", "Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Managing Consultant", "Incident Response", "Security Analyst", 
"Penetration Tester", "Penetration Tester", "Compliance", "Red Team", 
"Incident Response", "Penetration Tester", "Penetration Tester", 
"Infrastructure Security", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Research", "Application Security", "Penetration Tester", 
"Penetration Tester", "Application Security", "Penetration Tester", 
"Penetration Tester", "Security Engineer", "Red Team", "Penetration Tester", 
"Penetration Tester", "Red Team", "Security Engineer", "Incident Response", 
"Infrastructure Security", "Red Team", "Penetration Tester", 
"Research", "InfoSec Intern", "Incident Response", "Incident Response", 
"Research", "Penetration Tester", "Red Team", "Security Engineer", 
"Penetration Tester", "Incident Response", "Penetration Tester", 
"Penetration Tester", "Red Team", "Incident Response", "Penetration Tester", 
"Penetration Tester", "Infrastructure Security", "Red Team", 
"Penetration Tester", "Penetration Tester", "Threat Intel/Analyst", 
"Penetration Tester", "SOC Analyst", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Infrastructure Security", "Security Consultant", 
"Penetration Tester", "Penetration Tester", "Red Team", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Threat Intel/Analyst", "Application Security", "Penetration Tester", 
"Compliance", "Security Architect", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Security Architect", "Penetration Tester", 
"Penetration Tester", "Red Team", "Red Team", "Security Engineer", 
"Research", "Security Engineer", "Incident Response", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Red Team", "Security Engineer", 
"Incident Response", "Penetration Tester", "Penetration Tester", 
"Security Engineer", "Penetration Tester", "Security Engineer", 
"Penetration Tester", "Penetration Tester", "Security Engineer", 
"Penetration Tester", "Threat Hunter", "Penetration Tester", 
"Penetration Tester", "Red Team", "Penetration Tester", "Incident Response", 
"Penetration Tester", "Red Team", "Penetration Tester", "Infrastructure Security", 
"Compliance", "Info Security Manager & Data Protection Officer", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Infrastructure Security", "Penetration Tester", 
"Security Engineer", "Security Engineer", "Penetration Tester", 
"Incident Response", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Red Team", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Defensive Efficacy Testing", "Incident Response", "Information Security Analyst", 
"Penetration Tester", "Penetration Tester", "Threat Hunter", 
"Penetration Tester", "Penetration Tester", "Penetration Tester", 
"Security Engineer", "Cyber Consultant", "Security Engineer", 
"Application Security", "Research", "Research", "Research", "Red Team", 
"Application Security", "Penetration Tester", "Security Engineer", 
"Red Team", "Information Security Analyst", "Sales Engineer", 
"Penetration Tester", "Red Team", "Infrastructure Security", 
"Penetration Tester", "Security Engineer", "Incident Response", 
"Incident Response", "Penetration Tester", "Incident Response", 
"Penetration Tester", "Incident Response", "Application Security", 
"Incident Response", "Incident Response", "Security Engineer", 
"Penetration Tester", "Incident Response", "Infrastructure Security", 
"SOC Analyst", "Penetration Tester", "Penetration Tester", "Senior Software Engineer ", 
"Red Team", "Audit", "Incident Response", "Senior Security Engineer", 
"Application Security", "Research", "Penetration Tester", "Governance", 
"Penetration Tester", "Penetration Tester", "Threat Intel/Analyst", 
"Threat Intel/Analyst", "SOC Analyst", "Application Security", 
"Application Security", "Security Engineer", "Penetration Tester", 
"Incident Response", "Incident Response", "Security Architect", 
"Incident Response", "Security Engineer", "Research", "Red Team", 
"Penetration Tester", "Application Security", "Penetration Tester", 
"Research", "Application Security", "Penetration Tester", "Threat Intel/Analyst", 
"Infrastructure Security", "SOC Analyst", "CISO", "Incident Response", 
"Red Team", "Infrastructure Security", "Compliance", "Security Engineer", 
"Penetration Tester", "Incident Response", "Penetration Tester", 
"Incident Response", "SOC Analyst", "Penetration Tester", "Research", 
"Incident Response", "Application Security", "Threat Intel/Analyst", 
"SOC Analyst", "Application Security", "Penetration Tester", 
"Penetration Tester", "Security Engineer", "Security Architect", 
"Penetration Tester", "Incident Response", "Incident Response", 
"Penetration Tester", "Application Security", "Penetration Tester", 
"Security Engineer", "Incident Response", "Penetration Tester", 
"Incident Response", "Penetration Tester", "Penetration Tester", 
"Security Engineer", "Penetration Tester", "Incident Response", 
"SOC Analyst", "Penetration Tester", "Penetration Tester", "Red Team", 
"Red Team", "Red Team", "Cloud Security", "Penetration Tester", 
"Security Engineer", "Incident Response", "CISO", ".", "Penetration Tester", 
"Incident Response", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Penetration Tester", "Compliance", "Security Architect", 
"SOC Analyst", "Application Security", "Incident Response", "SOC Analyst", 
"Security Operations", "Incident Response", "Security Engineer", 
"Penetration Tester", "Security Architect", "Application Security", 
"Security Specialist", "Security Architect", "Compliance", "Incident Response", 
"Penetration Tester", "IT Security Administrator", "Penetration Tester", 
"Application Security", "Red Team", "Penetration Tester", "Penetration Tester", 
"Penetration Tester", "Security Consultant", "Incident Response", 
"Red Team", "Penetration Tester", "Penetration Tester", "CISO", 
"Penetration Tester", "Security Engineer", "Security Engineer", 
"Penetration Tester", "Security Engineer", "Application Security", 
"Penetration Tester", "Senior It Manager", "Penetration Tester", 
"Research", "Infrastructure Security", "Penetration Tester", 
"Incident Response", "Product Manager", "Penetration Tester", 
"Incident Response", "Incident Response", "Penetration Tester", 
"Application Security", "Penetration Tester", "Penetration Tester", 
"Incident Response", "Product Manager", "Red Team", "Threat Intel/Analyst", 
"Penetration Tester", "SOC Analyst", "Penetration Tester", "Penetration Tester", 
"Incident Response", "Penetration Tester", "Infrastructure Security", 
"Threat Intel/Analyst", "Penetration Tester", "Incident Response", 
"Penetration Tester", "Security Engineer", "Penetration Tester", 
"Penetration Tester", "Incident Response", "Penetration Tester", 
"Security Architect", "Penetration Tester", "Application Security", 
"Security Engineer", "Security Architect", "Infrastructure Security", 
"Incident Response", "Threat Intel/Analyst", "Application Security", 
"Incident Response", "Security Engineer", "Incident Response", 
"Incident Response", "Penetration Tester", "Security Engineer", 
"Security Engineer", "Infrastructure Security", "Incident Response", 
"Security Engineer", "Application Security", "Incident Response", 
"Penetration Tester", "Penetration Tester", "Incident Response", 
"Security Engineer", "Penetration Tester", "Red Team", "Application Security", 
"Incident Response", "Penetration Tester", "Security Engineer", 
"Incident Response", "Penetration Tester", "Audit", "Infrastructure Security", 
"Penetration Tester", "Threat Intel/Analyst", "Audit", "Security Architect", 
"Threat Hunter", "Application Security", "SOC Analyst", "Penetration Tester", 
"Incident Response", "Security Engineer", "Penetration Tester", 
"Penetration Tester", "Information security officer", "Incident Response", 
"Incident Response", "Incident Response", "Compliance", "Penetration Tester", 
"Security Engineer", "Incident Response", "Threat Hunter", "Penetration Tester", 
"Incident Response", "Penetration Tester", "Incident Response", 
"Penetration Tester", "Security Engineer", "Governance", "Security Engineer"
), sex = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 1L, 2L, 3L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 3L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L, 1L, 1L, 3L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 3L, 1L, 1L, 3L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 3L, 2L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 3L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 3L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 1L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 1L, 3L, 2L, 1L, 2L, 2L, 1L), .Label = c("Male", 
"Female", "Other"), class = c("ordered", "factor"))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -469L))

这是我用来尝试生成绘图的代码:

library(ggplot2)
library(dplyr)
library(forcats)

df %>%
    count(title, sex) %>%
    filter(!is.na(sex) & nchar(title) > 1) %>%
    ggplot() +
    geom_bar(aes(x=fct_reorder(title, n), y=n), stat="identity") +
    facet_wrap(~ sex, nrow=1, scales="fixed") +
    scale_y_continuous(expand=c(0, 0)) +
    labs(x="", y="No. People Reporting", 
         title="Significantly more men than women reported their salaries",
         subtitle="Red teamers appear to be much more likely to report their salaries") +
    coord_flip() +
    theme(panel.background=element_blank(),
          axis.line=element_line(color="black"))

我的预期输出将从左到右依次为“男性”、“女性”和“其他”,前三个标题是“渗透测试员”、“事件响应”和“安全工程师”。

如何告诉 Rtitle根据“男性”子集中的值重新排序?

标签: rggplot2

解决方案


我会按性别对行进行排序(以便sex = "Male"首先对行进行排序)/ count & use fct_inorder,而不是fct_reorder在这种情况下:

df %>%
  count(title, sex) %>%
  filter(!is.na(sex) & nchar(title) > 1) %>%

  tidyr::complete(sex, title, fill = list(n = 0)) %>% # add missing combinations so that
                                                      # every title appears for every gender
  arrange(sex, n) %>% 
  mutate(title = fct_inorder(title)) %>%

  ggplot() +
  geom_bar(aes(x=title, y=n), stat="identity") +
  facet_wrap(~ sex, nrow=1, scales="fixed") +
  scale_y_continuous(expand=c(0, 0)) +
  labs(x="", y="No. People Reporting", 
       title="Significantly more men than women reported their salaries",
       subtitle="Red teamers appear to be much more likely to report their salaries") +
  coord_flip() +
  theme(panel.background=element_blank(),
        axis.line=element_line(color="black"))

阴谋


推荐阅读