【问题标题】:NA's are being plotted in boxplot ggplot2NA 被绘制在 boxplot ggplot2 中
【发布时间】:2013-06-17 11:17:24
【问题描述】:

我正在尝试在 ggplot2 中绘制一个简单的箱线图。我有物种丰富度与土地利用类别。但是,我的数据中有 2 个 NA。出于某种奇怪的原因,它们正在被绘制,即使它们被 R 理解为 NA。有什么建议可以删除它们吗?

我使用的代码是:

ggplot(data, aes(x=luse, y=rich))+
  geom_boxplot(mapping = NULL, data = NULL, stat = "boxplot", position = "dodge", outlier.colour = "red", outlier.shape = 16, outlier.size = 2, notch = F, notchwidth = 0.5)+
  scale_x_discrete("luse", drop=T)+
  geom_smooth(method="loess",aes(group=1))

但是,该图包括 2 个用于 luse 的 NA。不幸的是,我无法发布图片,但想象一下我的图表中添加了一个 NA 条。

【问题讨论】:

  • ggplot(na.omit(data), aes(x=luse, y=rich)) + ...
  • 非常感谢!
  • 对于更一般的情况:如果数据包含除被绘制的两个变量之外的变量,na.omit(data) 将删除任何变量缺失的观察值。这可能会对您的图表和/或分析产生意想不到的后果。可以使用data=na.omit(data[,c("var1","var2",...)]),其中 var1、var2、... 是图表所需的变量。
  • +1 for @Maxim.K,我遇到了一个大数据框的确切问题,其中一个变量具有极高比例的 NA 值。我无法完全锻炼语法以摆脱我感兴趣的变量中的 NA 。但请注意,如果您只对一个变量感兴趣,就像我一样,上面的代码返回一个向量,您必须在 data.frame 中选择至少 2 列才能使其按编写方式工作。

标签: r ggplot2 boxplot na


【解决方案1】:

您可以尝试在代码的第一行使用subset() 函数

ggplot(data=subset(data, !is.na(luse)), aes(x=luse, y=rich))+

如建议:Eliminating NAs from a ggplot

【讨论】:

    【解决方案2】:

    这是使用上面的 cmets 将 !is.na() 与来自 tidyverse/dplyr 的 filter() 合并的正式答案。如果您有基本的 tidyverse 操作,例如过滤 NA,您可以按照建议在 ggplot 调用中直接执行,以避免创建新的数据框:

    ggplot(data %>% filter(!is.na(luse)), aes(x = luse, y = rich)) + geom_boxplot()

    【讨论】:

    • 这与之前的答案有何不同?
    • 它没有使用is.na() == FALSE或不那么直接的子集
    • subset 怎么不那么直接了?此外,您使用的管道与此问题无关。
    【解决方案3】:

    你也可以在dplyr/tidyverse中使用filter()函数:

    data %>% filter(is.na(luse) == FALSE) %>% 
       ggplot(aes(x=luse, y=rich)) +
       geom_boxplot()
    

    这样您就不必创建新对象。

    【讨论】:

    • 你的意思是! is.na() 吗?或者你想要所有的NA? ;) 此外,您不一定需要指定 is.na (x) == TRUE ,因为它无论如何都会评估为一个逻辑向量,然后 filter() 将使用它......欢迎来到 SOF
    • 哦,是的。笔误,对不起。谢谢你抓住那个。还有,酷。我不知道你可以直接投is.na()
    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多