R 中多个分类变量除以一个分类变量的条形图

Barplot for several categorical variables divided by one categorical variable in R

我想可视化一个分类变量如何随其他几个分类变量变化。

我的数据是这样的

  Species Class species2
1   setosa     1        0
2   setosa     1        1
3   setosa     1        0
4   setosa     1        1
5   setosa     1        0
6   setosa     1        1
7   setosa     0        0
8   setosa     0        1
9   setosa     1        1
10  setosa     1        1

在我的真实 dataset 中,我有 13 个分类变量,我想将它们除以 class,如下所示。

R 中有没有更简单的方法来使用 lattice 或其他包来做到这一点?理想情况下,我想要一个图,每个变量都有一个面板,显示每个级别的计数或百分比,由变量 'class'.

着色

对于此示例,我使用了以下代码。

library(lattice)
data <- iris
data <- as.data.frame(data)
data <- data[-c(1,2,3,4)]
data$Class <- as.factor(c(rbinom(50,1,0.7),rbinom(100,1,0.1)))
data$species2 <- as.factor(rbinom(150,1,0.85))

data2 <- as.data.frame(table(data$Species,data$Class))
barchart(Var1~Freq,groups=Var2,data=data2,stack=TRUE,
         auto.key=list(title = "Class",columns=2))
data3 <- as.data.frame(table(data$species2,data$Class))
barchart(Var1~Freq,groups=Var2,data=data3,stack=TRUE,
         auto.key=list(title = "Class",columns=2))

也许您正在寻找这个。我建议你使用 ggplot2。接下来描述的代码可以根据需要为每个变量构建一个图。它被称为受感染的阴谋。获得它的关键是将数据重塑为long。根据您的代码,您必须根据每个变量进行拆分,然后使用 lattice 来创建每个分开的图。优点是 tidyverse (pivot_longer()) 中的函数允许您以可以轻松调整绘图函数的方式转换数据。这里是为每个变量生成绘图的代码。在您的情况下,如果您有更多分类变量,则可以使用 ncolnrow 选项调整构面。接下来的解决方案:

library(tidyverse)
#Data
data <- iris
data <- as.data.frame(data)
data <- data[-c(1,2,3,4)]
data$Class <- as.factor(c(rbinom(50,1,0.7),rbinom(100,1,0.1)))
data$species2 <- as.factor(rbinom(150,1,0.85))
#Code
data %>% pivot_longer(-Class) %>%
  group_by(name,Class,value) %>%
  summarise(N=n()) %>%
  ggplot(aes(y=value,x=N,fill=Class))+
  geom_bar(stat = 'identity',color='black',alpha=0.2)+
  facet_wrap(.~name,scales='free')+
  theme_bw()+
  theme(legend.position = 'top')

输出:

在百分比的情况下,你可以试试这个:

#Code 2
data %>% pivot_longer(-Class) %>%
  group_by(name,Class,value) %>%
  summarise(N=n()) %>%
  ggplot(aes(y=value,x=N,fill=Class))+
  geom_bar(stat = 'identity',color='black',alpha=0.2,position = 'fill')+
  scale_x_continuous(labels = scales::percent)+
  facet_wrap(.~name,scales='free')+
  theme_bw()+
  theme(legend.position = 'top')

输出: