【问题标题】:Remove outliers from a ggplotly() boxplot从 ggplotly() 箱线图中删除异常值
【发布时间】:2019-12-18 02:20:48
【问题描述】:

我有下面的数据框:

etf_id<-c("a","b","c","d","e","a","b","c","d","e","a","b","c","d","e")
factor<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C")
normalized<-c(-0.048436801,2.850578601,2.551666490,0.928625186,-0.638111793,
              -0.540615895,-0.501691539,-1.099239823,-0.040736139,-0.192048665,
              0.198915407,-0.092525810,0.214317734,2.550478998,0.024613778)
df<-data.frame(etf_id,factor,normalized)

我试图用 2 种方法去除异常值。首先我尝试outlier.color = NA,outlier.size = 0,outlier.shape = NA:

library(ggplot2)
library(plotly)
ggplotly(df %>% 
  ggplot(aes(factor, normalized, color = factor)) +
  geom_boxplot(outlier.color = NA,outlier.size = 0,outlier.shape = NA) +
  coord_cartesian(ylim = quantile(df$normalized, c(0.01, 0.99), na.rm = T)))

钻石数据集的第二个示例。

p<-ggplotly(diamonds %>% 
  ggplot(aes(cut,price, color = cut)) +
  geom_boxplot(outlier.color = NA,outlier.size = 0,outlier.shape = NA))

然后我尝试:

ggplotly(df %>% 
  ggplot(aes(factor, normalized, color = factor)) +
  geom_boxplot(outlier.color = NA,outlier.size = 0,outlier.shape = NA) +
  coord_cartesian(ylim = quantile(boxplot.stats(df$normalized)$stats[c(1, 5)]*1.5, c(0.01, 0.99), na.rm = T)))

但这种方式似乎减少了我的情节限制,我需要一个通用的解决方案。

【问题讨论】:

    标签: r ggplot2 ggplotly


    【解决方案1】:

    我们可以深入 ggplotly 对象的底层,让异常值不可见。但请注意,将鼠标悬停在不可见的异常值上仍会显示异常值测量的 hoverinfo。

    p<-ggplotly(diamonds %>% 
                ggplot(aes(cut,price, color = cut)) +
                geom_boxplot(outlier.color = NA,outlier.size = 0,outlier.shape = 
    NA))
    
    for(i in 1:length(p)){
    p$x$data[[i]]$marker$opacity = 0 
    }
    
    p
    

    【讨论】:

      【解决方案2】:

      我不完全确定您要使用第二种方法做什么。但是,无论如何,您面临的问题植根于代码的这一部分:boxplot.stats(df$normalized)$stats[c(1, 5)]*1.5

      具体来说,boxplot.stats(df$normalized)$stats 返回这个向量:

      [1] -1.09923982 -0.34687010 -0.04073614  0.57147146  0.92862519
      

      这些是所有数据的箱线图统计数据(即下须线、下铰链、中值、上铰链和上须线)。但由于您正在绘制的图表通过factor 变量进一步对数据进行子分类,所有数据的boxplot.stats 值不会为您提供良好的界限。

      回到你原来在箱线图中隐藏异常值的问题:ggplotly 不尊重你传递给 ggplot 的 outlier.shape = NA 参数。相反,您应该专门隐藏异常值。一种解决方案可以在on plotly's GitHub issue tracker here 找到。

      【讨论】:

      • 另一个问题是它抑制了每个点,而不仅仅是异常点。
      • 在您提供的示例中,只有一个点,即异常点。请更新示例,以便我了解问题所在。
      • 是的,应该删除一点 (2.55)。如果其他 2 个箱线图有异常值,则同样适用
      • 我添加了另一个带有 diamonds 数据集的示例
      猜你喜欢
      • 2017-12-03
      • 1970-01-01
      • 2023-03-05
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多