绘制多个类别
Plot many categories
我的数据如下,每次实验都会出现一个作文,每个作文属于一个或多个类别。我想绘制每个组合的出现次数:
DF <- read.table(text = " Comp Category
Comp1 1
Comp2 1
Comp3 4,2
Comp4 1,3
Comp1 1,2
Comp3 3 ", header = TRUE)
barplot(table(DF$Comp))
所以这对我来说非常有效。
之后,as composition属于一个或多个类别。在 categories.I 之间有逗号分隔想要绘制 X 中的组合和 Y 中组合的 nb,以及每个条形图每个类别的百分比。
我的想法是复制有逗号的行,所以要重复 N+1 个逗号。
DF = table(DF$Category,DF$Comp)
cats <- strsplit(rownames(DF), ",", fixed = TRUE)
DF <- DF[rep(seq_len(nrow(DF)), sapply(cats, length)),]
DF <- as.data.frame(unclass(DF))
DF$cat <- unlist(cats)
DF <- aggregate(. ~ cat, DF, FUN = sum)
它会给我例如:对于 Comp1
1 2 3 4
Comp1 2 1 0 0
但是如果我应用这个方法,类别(3)的总数将不会对应于作文总数(comp1=2)。
遇到这种情况怎么办?解决方案是通过逗号 +1 的 nb 来划分吗?如果是,如何在我的代码中执行此操作,有没有最简单的方法?
非常感谢!
正如您已经注意到的那样,制作您的情节需要两个步骤。首先,需要准备数据,然后才能创建绘图。
正在准备数据
您已经展示了将数据转换为合适形式的努力,但让我提出另一种方法。
首先,我必须确保数据框的 Category
列是字符而不是因子。我还存储了数据框中出现的所有类别的向量:
DF$Category <- as.character(DF$Category)
cats <- unique(unlist(strsplit(DF$Category, ",")))
然后我需要总结数据。为此,我需要一个函数,为 Comp
中的每个值给出每个类别缩放的百分比,值的总和给出原始数据中具有 Comp
的行数。
下面的函数returns这个信息以另一个数据框的形式获取整个数据框(输出需要是一个数据框,因为我想用do()
的函数稍后)。
cat_perc <- function(cats, vec) {
# percentages
nums <- sapply(cats, function(cat) sum(grepl(cat, vec)))
perc <- nums/sum(nums)
final <- perc * length(vec)
df <- as.data.frame(as.list(final))
names(df) <- cats
return(df)
}
运行 完整数据框上的函数给出:
cat_perc(cats, DF$Category)
## 1 4 2 3
## 1 2.666667 0.6666667 1.333333 1.333333
这些值总和为 6,这确实是原始数据框中的总行数。
现在我们想要 运行 每个值 Comp
的函数,这可以使用 dplyr
包来完成:
library(dplyr)
plot_data <-
group_by(DF, Comp) %>%
do(cat_perc(cats, .$Category))
plot_data
## plot_data
## Source: local data frame [4 x 5]
## Groups: Comp [4]
##
## Comp 1 4 2 3
## (fctr) (dbl) (dbl) (dbl) (dbl)
## 1 Comp1 1.333333 0.0000000 0.6666667 0.0000000
## 2 Comp2 1.000000 0.0000000 0.0000000 0.0000000
## 3 Comp3 0.000000 0.6666667 0.6666667 0.6666667
## 4 Comp4 0.500000 0.0000000 0.0000000 0.5000000
这首先按 Comp
对数据进行分组,然后将函数 cat_perc
仅应用于具有给定 Comp
.
的数据帧的子集
我将使用 ggplot2
包绘制数据,这要求数据采用所谓的长格式。这意味着要绘制的每个数据点应对应于数据框中的一行。 (现在,每行包含 4 个数据点。)这可以使用 tidyr
包完成,如下所示:
library(tidyr)
plot_data <- gather(plot_data, Category, value, -Comp)
head(plot_data)
## Source: local data frame [6 x 3]
## Groups: Comp [4]
##
## Comp Category value
## (fctr) (chr) (dbl)
## 1 Comp1 1 1.333333
## 2 Comp2 1 1.000000
## 3 Comp3 1 0.000000
## 4 Comp4 1 0.500000
## 5 Comp1 4 0.000000
## 6 Comp2 4 0.000000
如您所见,现在每行有一个数据点,其特征为 Comp
、Category
和相应的 value
.
绘制数据
现在所有内容都已读取,我们可以使用 ggplot
:
绘制数据
library(ggplot2)
ggplot(plot_data, aes(x = Comp, y = value, fill = Category)) +
geom_bar(stat = "identity")
我的数据如下,每次实验都会出现一个作文,每个作文属于一个或多个类别。我想绘制每个组合的出现次数:
DF <- read.table(text = " Comp Category
Comp1 1
Comp2 1
Comp3 4,2
Comp4 1,3
Comp1 1,2
Comp3 3 ", header = TRUE)
barplot(table(DF$Comp))
所以这对我来说非常有效。
之后,as composition属于一个或多个类别。在 categories.I 之间有逗号分隔想要绘制 X 中的组合和 Y 中组合的 nb,以及每个条形图每个类别的百分比。
我的想法是复制有逗号的行,所以要重复 N+1 个逗号。
DF = table(DF$Category,DF$Comp)
cats <- strsplit(rownames(DF), ",", fixed = TRUE)
DF <- DF[rep(seq_len(nrow(DF)), sapply(cats, length)),]
DF <- as.data.frame(unclass(DF))
DF$cat <- unlist(cats)
DF <- aggregate(. ~ cat, DF, FUN = sum)
它会给我例如:对于 Comp1
1 2 3 4
Comp1 2 1 0 0
但是如果我应用这个方法,类别(3)的总数将不会对应于作文总数(comp1=2)。
遇到这种情况怎么办?解决方案是通过逗号 +1 的 nb 来划分吗?如果是,如何在我的代码中执行此操作,有没有最简单的方法?
非常感谢!
正如您已经注意到的那样,制作您的情节需要两个步骤。首先,需要准备数据,然后才能创建绘图。
正在准备数据
您已经展示了将数据转换为合适形式的努力,但让我提出另一种方法。
首先,我必须确保数据框的 Category
列是字符而不是因子。我还存储了数据框中出现的所有类别的向量:
DF$Category <- as.character(DF$Category)
cats <- unique(unlist(strsplit(DF$Category, ",")))
然后我需要总结数据。为此,我需要一个函数,为 Comp
中的每个值给出每个类别缩放的百分比,值的总和给出原始数据中具有 Comp
的行数。
下面的函数returns这个信息以另一个数据框的形式获取整个数据框(输出需要是一个数据框,因为我想用do()
的函数稍后)。
cat_perc <- function(cats, vec) {
# percentages
nums <- sapply(cats, function(cat) sum(grepl(cat, vec)))
perc <- nums/sum(nums)
final <- perc * length(vec)
df <- as.data.frame(as.list(final))
names(df) <- cats
return(df)
}
运行 完整数据框上的函数给出:
cat_perc(cats, DF$Category)
## 1 4 2 3
## 1 2.666667 0.6666667 1.333333 1.333333
这些值总和为 6,这确实是原始数据框中的总行数。
现在我们想要 运行 每个值 Comp
的函数,这可以使用 dplyr
包来完成:
library(dplyr)
plot_data <-
group_by(DF, Comp) %>%
do(cat_perc(cats, .$Category))
plot_data
## plot_data
## Source: local data frame [4 x 5]
## Groups: Comp [4]
##
## Comp 1 4 2 3
## (fctr) (dbl) (dbl) (dbl) (dbl)
## 1 Comp1 1.333333 0.0000000 0.6666667 0.0000000
## 2 Comp2 1.000000 0.0000000 0.0000000 0.0000000
## 3 Comp3 0.000000 0.6666667 0.6666667 0.6666667
## 4 Comp4 0.500000 0.0000000 0.0000000 0.5000000
这首先按 Comp
对数据进行分组,然后将函数 cat_perc
仅应用于具有给定 Comp
.
我将使用 ggplot2
包绘制数据,这要求数据采用所谓的长格式。这意味着要绘制的每个数据点应对应于数据框中的一行。 (现在,每行包含 4 个数据点。)这可以使用 tidyr
包完成,如下所示:
library(tidyr)
plot_data <- gather(plot_data, Category, value, -Comp)
head(plot_data)
## Source: local data frame [6 x 3]
## Groups: Comp [4]
##
## Comp Category value
## (fctr) (chr) (dbl)
## 1 Comp1 1 1.333333
## 2 Comp2 1 1.000000
## 3 Comp3 1 0.000000
## 4 Comp4 1 0.500000
## 5 Comp1 4 0.000000
## 6 Comp2 4 0.000000
如您所见,现在每行有一个数据点,其特征为 Comp
、Category
和相应的 value
.
绘制数据
现在所有内容都已读取,我们可以使用 ggplot
:
library(ggplot2)
ggplot(plot_data, aes(x = Comp, y = value, fill = Category)) +
geom_bar(stat = "identity")