作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的可重现数据包含每个动物(猫和狗)在每个季节(夏季和冬季)的两个协变量(cov1 和 cov2)及其各自的误差估计值 (SE) 的 50 个观察值。
library(ggplot2); library(dplyr); library(tidyr)
set.seed(123)
dat <- data.frame(Season = rep(c("Summer", "Winter"), each = 100),
Species = rep(c("Dog", "Cat", "Dog", "Cat"), each = 50),
cov1 = sample(1:100, 200, replace = TRUE),
cov1SE = rnorm(200),
cov2 = sample(1:100, 200, replace = TRUE),
cov2SE = rnorm(200))
head(dat)
Season Species cov1 cov1SE cov2 cov2SE
1 Summer Dog 29 -0.71040656 24 -0.07355602
2 Summer Dog 79 0.25688371 69 -1.16865142
3 Summer Dog 41 -0.24669188 23 -0.63474826
4 Summer Dog 89 -0.34754260 32 -0.02884155
5 Summer Dog 95 -0.95161857 18 0.67069597
6 Summer Dog 5 -0.04502772 81 -1.65054654
下面我将数据收集成 ggplot 的长格式
EstLong <- dat %>% gather(Cov, Estimate, c(cov1, cov2))
SE <- dat %>% gather(Cov, SE, c(cov1SE, cov2SE))
datLong <- EstLong[ , c(1,2,5,6)]
datLong$SE <- SE[ , 6]
head(datLong)
Season Species Cov Estimate SE
1 Summer Dog cov1 29 -0.71040656
2 Summer Dog cov1 79 0.25688371
3 Summer Dog cov1 41 -0.24669188
4 Summer Dog cov1 89 -0.34754260
5 Summer Dog cov1 95 -0.95161857
6 Summer Dog cov1 5 -0.04502772
我正在尝试绘制所有点并使用 position_jitterdodge
来躲避和抖动这些点(如 this SO post 中所建议),但无法将误差线与相应的点正确对齐,如下所示. position_dodge
正确对齐点和误差条,但需要 jitter
来减少沿 x 轴的重叠。任何建议将不胜感激。
Jit <- position_jitterdodge(dodge.width=0.4)
ggplot(datLong, aes(y = Estimate, x = Cov, color = Species)) +
geom_point(position = Jit, size = 1) +
geom_errorbar(aes(ymin = Estimate-SE, ymax = Estimate+SE), width = 0.2, position = Jit) +
theme_bw() +
facet_wrap(~ Season, ncol = 1, scales = "free") +
scale_color_manual(values = c("blue", "red"))
最佳答案
您可以扩展 position_dodge
来为数据生成修复 jitter
:
myjit <- ggproto("fixJitter", PositionDodge,
width = 0.3,
dodge.width = 0.1,
jit = NULL,
compute_panel = function (self, data, params, scales)
{
#Generate Jitter if not yet
if(is.null(self$jit) ) {
self$jit <-jitter(rep(0, nrow(data)), amount=self$dodge.width)
}
data <- ggproto_parent(PositionDodge, self)$compute_panel(data, params, scales)
data$x <- data$x + self$jit
#For proper error extensions
if("xmin" %in% colnames(data)) data$xmin <- data$xmin + self$jit
if("xmax" %in% colnames(data)) data$xmax <- data$xmax + self$jit
data
} )
ggplot(datLong, aes(y = Estimate, x = Cov, color = Species, group=Species)) +
geom_point(position = myjit, size = 1) +
geom_errorbar(aes(ymin = Estimate-SE, ymax = Estimate+SE), width = 0.2, position = myjit)+
theme_bw() +
facet_wrap(~ Season, ncol = 1, scales = "free") +
scale_color_manual(values = c("blue", "red"))
请注意,您必须为每个绘图创建一个新对象 fixJitter
。
剧情如下:
关于r - 使用 `jitterdodge` 时在 ggplot 中对齐点和误差线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44595920/
我是一名优秀的程序员,十分优秀!