使用ggplot2 facet_grid优化分类变量的绘图-二分变量仅两个值之一的绘图比例

问题描述 投票:0回答:1

我有一个大型数据集,其中包含150多个分类变量和连续变量。每个观察(行)都属于A组或B组。例如:

set.seed(16)
mydf <- data.frame(ID = 1:500, group = sample(c("A", "B", "B", "B"), 500, replace = TRUE), 
length = rnorm(n = 500, mean = 0, sd = 1), 
weight = runif(500, min=0, max=1), 
color = sample(c("red", "orange", "yellow", "green", "blue"), 500,  replace = TRUE), 
size = sample(c("big", "small"), 500, replace = TRUE), 
age = sample(c("old", "young"), 500, replace = T))

我正在努力优化图的布局,以可视化类别变量的组计数和比例计数之间的关系。到目前为止,在上一篇文章(https://stackoverflow.com/a/59562290/1905571)的帮助下,我使用ggplot2 facet-grid进行了绘制,但是遇到了两个问题。

问题A:条形图按值(例如,大,旧,小,年轻)的字母顺序排列,而不是按类别(年龄:年轻紧挨着;大小:大紧挨着小,等等)进行分组。问题B:对于只有两个可能值的类别变量,我只想绘制其中一个值在A组与B组中的比例。例如,仅绘制“旧”组A与B组的比例,因为绘制“年轻”比例将不会提供任何新信息。其他分类变量(例如具有多个值的color)应针对每种可能性使用条形图。

我已经通过以“ mutate(value = factor(value,level = c(“ big”,“ small”,“ young”,“ old”,“ red” ,“橙色”,“黄色”,“绿色”,“蓝色”)))”,现在按指定的顺序显示,年龄组彼此相邻,颜色彼此相邻,等等。

data_cat <- 
  mydf %>% select(-ID) %>%
  mutate_if(.predicate = is.factor, .funs = as.character) %>%
  mutate(group = factor(group)) %>%
  pivot_longer(cols = which(sapply(., is.character)), names_to = 'key', values_to =  'value')%>%
  count(group, key, value) %>%
  group_by(group, key) %>%
  mutate(percent =  n/ sum(n)) %>%
  mutate(value = factor(value, levels=c("big", "small", "young", "old", "red", "orange", "yellow", "green", "blue"))) %>%

ggplot(data_cat) +
  geom_col(aes(group, percent, fill = key)) +
  facet_grid(~ value)

我仍然面临问题B,抑制了二分分类变量的两个结果之一的绘制。我认为我必须找到一种方法来从每个变量中提取“因子水平”,然后使用该值== 2的子集进行搜索,但尚未找到一种方法来执行此操作。

r ggplot2 bar-chart categorical-data
1个回答
0
投票

这是您正在寻找的与问题B有关的解决方案吗?我在数据管理步骤的末尾添加了一个过滤器,删除了两个分离的情况,即等于“年轻”和“小的”的值。现在,该图显示了“大”,“旧”的条形以及5个颜色类别。

mydf %>% select(-ID) %>%
  mutate_if(.predicate = is.factor, .funs = as.character) %>%
  mutate(group = factor(group)) %>%
  pivot_longer(cols = which(sapply(., is.character)), names_to = 'key', values_to =  'value')%>%
  count(group, key, value) %>%
  group_by(group, key) %>%
  mutate(percent =  n/ sum(n)) %>%
  mutate(value = factor(value, levels=c("big", "small", "young", "old", "red", "orange", "yellow", "green", "blue"))) %>%
  filter(value != "young" & value != "small") -> data_cat

ggplot(data_cat) +
  geom_col(aes(group, percent, fill = key)) +
  facet_grid(~ value)
© www.soinside.com 2019 - 2024. All rights reserved.