r - 使用 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()
解决方案
我找到了一个不太精确的解决方案。您可以为向上的三角形调用一次 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))
推荐阅读
- python - Selenium 找不到元素/表,即使它在屏幕上
- ios - GoogleUtilities.framework:errSecInternalComponent
- python - Woocommerce 订单导出 API 为同一订单 Python 的每个项目单独的行
- docker - 当包收到(安全)更新时重建 Docker 镜像
- c - 你可以在 C 中将两个这样的二维数组相乘吗?
- ios - 如何关闭多个当前视图控制器?
- git - SSH 密钥问题 Git-CPanel - 权限被拒绝(公钥)。致命:无法从远程存储库中读取
- group-policy - 组策略在一些加入域的客户端计算机上完全失败
- java - Java 8:如何为 POST 请求分块多部分文件
- reactjs - TypeError:无法读取 ReactJS Mapbox-GL 中未定义的属性“easeTo”