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()
) 中的函数允许您以可以轻松调整绘图函数的方式转换数据。这里是为每个变量生成绘图的代码。在您的情况下,如果您有更多分类变量,则可以使用 ncol
和 nrow
选项调整构面。接下来的解决方案:
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')
输出:
我想可视化一个分类变量如何随其他几个分类变量变化。
我的数据是这样的
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()
) 中的函数允许您以可以轻松调整绘图函数的方式转换数据。这里是为每个变量生成绘图的代码。在您的情况下,如果您有更多分类变量,则可以使用 ncol
和 nrow
选项调整构面。接下来的解决方案:
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')
输出: