带计数的 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")