【问题标题】:Cannot place count label at boxplot whisker with outliers present无法在存在异常值的箱线图晶须处放置计数标签
【发布时间】:2017-12-10 15:42:57
【问题描述】:

我试图在箱线图须的末端放置观察计数的标签,但是当存在异常值时它似乎不起作用。

我试图将最大/最小值与我认为计算出的晶须长度 [四分位 1(或四分位 3)+(或 -)1.5 * 四分位间距] 进行比较。但是标签既没有放置在最大值/最小值处,也没有放置在晶须末端。

示例使用mtcars和y轴反转来演示:

library(ggplot2,dplyr)

  mtcars %>%
    select(qsec, cyl,am) %>%

    ggplot(aes(factor(cyl),qsec,fill=factor(am))) + 
    stat_boxplot(geom = "errorbar") + ## Draw horizontal lines across ends of whiskers
    geom_boxplot(outlier.shape=1, outlier.size=3, 
                 position =  position_dodge(width = 0.75)) +
    scale_y_reverse() +
    geom_text(data = mtcars %>%
                select(qsec,cyl,am) %>%
                group_by(cyl, am) %>%
                summarize(min_qsec = min(qsec),Count = n(),med = median(qsec),
                          q1 = quantile(qsec,0.25), 
                          q3 = quantile(qsec,0.75), iqr = IQR(qsec),
                          qsec = mean(qsec),
                          lab_pos = max(min_qsec, q1-1.5*iqr)),
              aes(y=lab_pos,label = Count), position = position_dodge(width = 0.75))

产生:

am(1)cyl(4)am(0)cyl(8) 的标签未对齐。

我对@9​​87654329@ 的计算是否不正确,或者是否有更好的方法在晶须末端放置标签,而不管异常值如何?如果可能的话,我想使用ggplot2dplyr 来完成它

【问题讨论】:

  • 看起来胡须延伸到上下栅栏内的最远点 (Q1/Q3 -/+ 1.5 * IQR)。您应该能够计算这些点的位置,尽管可能必须在 ggplot aes 语句之外执行此操作。
  • 这就是我正在计算(或试图计算)的 lab_pos 变量。如果最大值是异常值,则应该将胡须的末端设置为 lab_pos

标签: r ggplot2 dplyr


【解决方案1】:

如果我理解正确,这就是你想要的:

label_data <- mtcars %>%
  select(qsec, cyl, am) %>%
  group_by(cyl, am) %>%
  summarize(min_qsec = min(qsec),
            Count = n(),
            med = median(qsec),
            q1 = quantile(qsec, 0.25), 
            q3 = quantile(qsec, 0.75),
            iqr = IQR(qsec),
            lab_pos = min(ifelse(qsec > q1-1.5*iqr, qsec, NA), na.rm = TRUE),
            qsec = mean(qsec))

mtcars %>%
  select(qsec, cyl,am) %>%
  ggplot(aes(factor(cyl),qsec,fill=factor(am))) + 
  stat_boxplot(geom = "errorbar") + ## Draw horizontal lines across ends of whiskers
  geom_boxplot(outlier.shape=1, outlier.size=3, 
               position =  position_dodge(width = 0.75)) +
  scale_y_reverse() +
  geom_text(data = label_data, aes(y = lab_pos,label = Count),
            position = position_dodge(width = 0.75), vjust = 0, fontface = "bold")

胡须延伸到栅栏内的最远点,而不是栅栏本身。

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 2021-11-06
    • 2020-08-27
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多