带计数的 R 图
R plot with counting
对于这样排列的一系列数据:
Class 1 Class 2
1 1
2 2
3 3
4 4
5 5
. .
. .
. .
1,000,000 2,000,000
我如何构建一个条形图,它有两个 classes 作为轴标签,我有两组独立的条形图,每个条形图一组 class,其中每个条形图的高度显示如何我数据中的许多值都大于该值?
我们可以循环'5:7'(sapply
),通过检查第一列即'class1'是否大于(>
)每个元素来得到一个逻辑矩阵,执行 colSums
,使用 setNames
命名频率并使用 barplot
.
绘制条形图
barplot(setNames(colSums(sapply(5:7, '<',df1[,1])), paste0('>', 5:7)))
注意:图基于 OP 的评论。
更新
如果我们希望 'Class1' 和 'Class2' 条在每次与 5、6 和 7 进行比较时彼此相邻,我们对 sapply
执行相同的循环,比较使用完整数据集 ('df1'),获取 colSums
,使用 paste
更改带有标签“>5”、“>6”、“>7”的输出矩阵的列名然后用 barplot
绘图
m1 <- sapply(5:7, function(x) colSums(df1 >x))
colnames(m1) <- paste0('>', 5:7)
barplot(m1, beside=TRUE, legend=TRUE)
数据
set.seed(24)
df1 <- data.frame(Class1= sample(0:20, 100, replace=TRUE),
Class2= sample(4:10, 100, replace=TRUE))
因为我认为您指的是所有值,而不是某些选定的值。
使用来自@akrun 的数据:
set.seed(24)
df1 <- data.frame(Class1= sample(0:20, 100, replace=TRUE),
Class2= sample(4:10, 100, replace=TRUE))
library(ggplot2)
library(dplyr)
library(reshape2)
然后我们制作一个累积量列,为 ggplot 添加 0 以了解我们不只是缺少数据。
z <- df1 %>% melt %>%
group_by(variable, value) %>%
summarise(number = n()) %>%
left_join(expand.grid("value" = unique(.[["value"]]), "variable" = levels(.[["variable"]])), .) %>%
mutate(number = ifelse(is.na(number), 0, number)) %>%
group_by(variable) %>%
mutate(above = 1-cumsum(number/sum(number)))
ggplot(z, aes(x = factor(value), weight = above, fill = variable)) +
geom_bar(position= "dodge")
对于这样排列的一系列数据:
Class 1 Class 2
1 1
2 2
3 3
4 4
5 5
. .
. .
. .
1,000,000 2,000,000
我如何构建一个条形图,它有两个 classes 作为轴标签,我有两组独立的条形图,每个条形图一组 class,其中每个条形图的高度显示如何我数据中的许多值都大于该值?
我们可以循环'5:7'(sapply
),通过检查第一列即'class1'是否大于(>
)每个元素来得到一个逻辑矩阵,执行 colSums
,使用 setNames
命名频率并使用 barplot
.
barplot(setNames(colSums(sapply(5:7, '<',df1[,1])), paste0('>', 5:7)))
注意:图基于 OP 的评论。
更新
如果我们希望 'Class1' 和 'Class2' 条在每次与 5、6 和 7 进行比较时彼此相邻,我们对 sapply
执行相同的循环,比较使用完整数据集 ('df1'),获取 colSums
,使用 paste
更改带有标签“>5”、“>6”、“>7”的输出矩阵的列名然后用 barplot
m1 <- sapply(5:7, function(x) colSums(df1 >x))
colnames(m1) <- paste0('>', 5:7)
barplot(m1, beside=TRUE, legend=TRUE)
数据
set.seed(24)
df1 <- data.frame(Class1= sample(0:20, 100, replace=TRUE),
Class2= sample(4:10, 100, replace=TRUE))
因为我认为您指的是所有值,而不是某些选定的值。
使用来自@akrun 的数据:
set.seed(24)
df1 <- data.frame(Class1= sample(0:20, 100, replace=TRUE),
Class2= sample(4:10, 100, replace=TRUE))
library(ggplot2)
library(dplyr)
library(reshape2)
然后我们制作一个累积量列,为 ggplot 添加 0 以了解我们不只是缺少数据。
z <- df1 %>% melt %>%
group_by(variable, value) %>%
summarise(number = n()) %>%
left_join(expand.grid("value" = unique(.[["value"]]), "variable" = levels(.[["variable"]])), .) %>%
mutate(number = ifelse(is.na(number), 0, number)) %>%
group_by(variable) %>%
mutate(above = 1-cumsum(number/sum(number)))
ggplot(z, aes(x = factor(value), weight = above, fill = variable)) +
geom_bar(position= "dodge")