如何通过位置箱绘制所有出现的NA

Posted

技术标签:

【中文标题】如何通过位置箱绘制所有出现的NA【英文标题】:How to graph all the occurences of NA by bins of positions 【发布时间】:2022-01-21 08:22:07 【问题描述】:

我对 R 有点陌生,我希望将所有出现的NA 绘制成直方图的位置变化。我开始使用ggplot,但我不知道从哪里开始?

df <- data.frame(position=c(3, 5, 6, 7, 16, 17, 19, 20, 21, 35, 46, 78, 98, 100, 
                            145, 146, 147), 
                 petal15=c(0, 1, 1, 1, 0, NA, 1, NA, NA, NA, 1, 0, 0, 1, NA, 
                           0, NA), 
                 petal20=c(1, 0, 0, 1, 1, 1, 1, 1, NA, NA, 1, 1, NA, NA, 0, 
                           0, 0))

【问题讨论】:

您能否详细说明“在位置变化时出现 NA”? @jay.sf 对不起,我忘了添加位置数据,我想要做的是每当petal15或petal20出现NA时,我想将其绘制为具有bin大小的直方图(稍后确定)。忽略 1 和 o 【参考方案1】:

如果我理解正确,您正在寻找这个。

hist(rowSums(is.na(df)), xlab='occurrences', col=4, main="NA's")

编辑

为了在评论中实现您的想法,我们首先需要一份职位列表。

(pos <- lapply((0:14)*10 + 1, \(x) (0:9) + x))
# [[1]]
# [1]  1  2  3  4  5  6  7  8  9 10
# 
# [[2]]
# [1] 11 12 13 14 15 16 17 18 19 20
#
# [...]
#
# [[15]]
# [1] 141 142 143 144 145 146 147 148 149 150

使用sapply,我们创建所需的矩阵并将其通过管道传递给barplot()

sapply(pos, \(i) colSums(is.na(df[df$position %in% i, -1]))) |>
  barplot(beside=TRUE, xlim=c(1, 48), ylim=c(0, 2.5), col=3:4,
          xlab='Occurences', ylab='Freq', main="NA's",
          legend.text=names(df[-1]), args.legend=list(x='topright'),
          names.arg=Reduce(\(x, y) paste0(x, '-', y), 
                           as.data.frame(t(sapply(pos, range)))),
          cex.names=.8) 
box()

注意:

R.version.string
# [1] "R version 4.1.2 (2021-11-01)"

数据:

df <- structure(list(position = c(3, 5, 6, 7, 16, 17, 19, 20, 21, 35, 
46, 78, 98, 100, 145, 146, 147), petal15 = c(0, 1, 1, 1, 0, NA, 
1, NA, NA, NA, 1, 0, 0, 1, NA, 0, NA), petal20 = c(1, 0, 0, 1, 
1, 1, 1, 1, NA, NA, 1, 1, NA, NA, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-17L))

【讨论】:

有点,我试图根据位置绘制它......所以在 0-10 之间有 0 次出现 NA 的花瓣 15 或花瓣 20,但位置 11-20 将出现 2 次 NA花瓣 15 但花瓣 20 为 0,因此花瓣 15 的条形为 freq=2,而花瓣 20 的条形为 freq=0。重复直到位置 141 到 150。 @James 哇,这有点复杂。请参阅编辑。 天哪,谢谢你,我知道这很复杂,谢谢你帮助我! 不客气@James【参考方案2】:

一个 tidyverse 解决方案 - 旋转更长的时间,然后过滤所有 NA,然后按照上面的建议绘制直方图,但使用 ggplot 代替。

library(tidyverse)

df_na <- 
  df %>%
  pivot_longer(-position) %>%
  filter(is.na(value)) 
  
ggplot(df_na, aes(position, fill = name)) +
  geom_histogram(binwidth = 5, position = position_dodge()) +
  scale_x_continuous(breaks = seq(0,150,10))

由reprex package (v2.0.1) 于 2021 年 12 月 19 日创建

【讨论】:

以上是关于如何通过位置箱绘制所有出现的NA的主要内容,如果未能解决你的问题,请参考以下文章

可视化实验十二:利用Python绘制箱线图折线图

R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置添加箱图位置参数调整)实战

如何绘制一个矩形到脸部的位置?

R初级数据管理——缺失值NA的处理

如何在组箱图中绘制标签

在ggplot2中绘制两个具有相同y变量但不同x变量的箱线图