首页 > 解决方案 > 使用 geom_segment 指示超出 log10 比例限制的 geom_errorbar

问题描述

我有一些数据,其中一些估计有很大的误差线。我想通过对图表设置限制来绘制有意义的比例。但是,我还想指出误差线超出限制的位置。最好使用箭头,如果可能的话,不要使用geom_segment,因为它似乎与 log10 比例不匹配。下面的红色箭头是之后绘制的。geom_errorbar解决方案是在 ggplot中添加超出绘图限制的箭头或其他指示。

set.seed(12345)
data <- data.frame(A = rnorm(10), 
                   group = c(rep("Dog", 5), rep("Cat", 5)),
                   Time = c(rep(1:5), rep(1:5)))
data <- data %>% mutate(
  SE = abs(rnorm(10)),
  B = A + SE,
  C = A - SE
  )

upper <- (with(data, max(B)) - 0.5) %>% exp()
lower <- (with(data, min(C)) + 0.5) %>% exp()

data <- data %>% mutate_at(vars(A, B, C), funs(exp))

library (ggplot2)
ggplot(data = data, aes(y = A, x = Time, color = group)) +
  geom_point(position = position_dodge(width = 0.2), size = 2) +
  geom_errorbar(aes(ymin = C, ymax = B), position = "dodge", width = 0.2, size = 0.8) +
  coord_cartesian(ylim = c(lower, upper)) +
  scale_y_log10()

在此处输入图像描述

标签: rggplot2

解决方案


我找到了一个不太精确的解决方案。您可以为向上的三角形调用一次 geom_point,然后再为向下的三角形调用一次。唯一的问题是 coord_cartesian 似乎没有将限制完全设置为指定的值,因此您必须在每个限制上加上或减去才能使三角形处于正确的位置。此外,由于 position_dodge 已被使用,因此 position_nudge 不可用。它涉及猜测要添加或减去 geom_point 的 y 坐标的值。

如果有更好的解决方案,请发表评论。

    library(ggplot2)
    library(tidyverse)

    set.seed(12345)
    data <- data.frame(A = rnorm(10), 
                       group = c(rep("Dog", 5), rep("Cat", 5)),
                       Time = c(rep(1:5), rep(1:5)))
    data <- data %>% mutate(
      SE = abs(rnorm(10)),
      B = A + SE,
      C = A - SE
      )

    upper <- (with(data, max(B)) - 0.5) %>% exp()
    lower <- (with(data, min(C)) + 0.5) %>% exp()

    data <- data %>% mutate_at(vars(A, B, C), funs(exp))

    data <- data %>% 
      mutate(upper_out = ifelse(B > upper, upper, NA),
             lower_out = ifelse(C < lower, lower, NA))

    ggplot(data = data, aes(y = A, x = Time, color = group, fill = group)) +
      geom_point(position = position_dodge(width = 0.2), size = 2) +
      geom_errorbar(aes(ymin = C, ymax = B), position = "dodge", width = 0.2, size = 0.8) +
      geom_point(aes(y = upper_out + 1.02), shape = 24, 
          position = position_dodge(width = 0.2), size = 4, show.legend = F) +
      geom_point(aes(y = lower_out - 0.013), shape = 25, 
          position = position_dodge(width = 0.2), size = 4, show.legend = F) +
      scale_y_log10() +
      coord_cartesian(ylim = c(lower, upper))

在此处输入图像描述


推荐阅读