ggplot2 position_dodge会影响错误栏宽度

Mar*_*nka 10 r ggplot2

我正在尝试使用错误栏创建一个直线和点图.它有不同的因素,但有些因素只有一个值.我发现如果我使用position_dodge,其中一个单值因子与图中的其他误差条相比具有更宽的误差条.不知何故,position_dodge对错误栏的宽度有影响.我之前没有找到任何有同样问题的人,所以我希望有人可以帮助我.

虚拟数据:

require(ggplot2)

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,3,3,5)
y <- c(3,5,6,3,5,3,5,6,2,6,3,7,3,6,2,1,5,8,7)
se <- x*0.2
treatment <- c("A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","A",    "B","C", "D","E", "F", "G" )
data <- data.frame(x, y, se ,treatment)
data$treatment <- as.factor(data$treatment)
Run Code Online (Sandbox Code Playgroud)

首先是没有position_dodge的情节 - 一切都很好

# Without position dodge
myplot <- ggplot(data, aes(x=x, y=y, group= treatment,  fill = treatment, colour = treatment)) +
  geom_line(stat="identity", size = 1) +
  geom_point(stat="identity", size = 3, shape = 21) + 
  geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2)

myplot
Run Code Online (Sandbox Code Playgroud)

没有position_dodge的情节

现在是一个位置躲闪的情节:

# With position dodge
myplot <- ggplot(data, aes(x=x, y=y, group= treatment,  fill = treatment, colour = treatment)) +
  geom_line(stat="identity", size = 1, position=position_dodge(width=0.2)) +
  geom_point(stat="identity", size = 3, shape = 21, position=position_dodge(width=0.2)) + 
  geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2, position=position_dodge(width=0.2))

myplot
Run Code Online (Sandbox Code Playgroud)

用position_dodge绘图

如您所见,最右侧的误差条与其他误差条相比具有更大的宽度.这可能是因为此点没有重叠的x变量,并且误差条可以具有正常大小.我仍然想知道如何让错误条具有相同的宽度.

Nic*_*edy 5

正如@aosmith所建议的,解决此问题的方法是将误差线的宽度缩放到具有的点的数量x。但是,这不需要手动完成。下面,我根据该点的数量dplyr在中创建一个新列。我也删除了和映射,因为这里不需要了(只要形状更改为而不是用上色的实心圆的版本)。最后,为避免重复,我定义了一次,然后为每个变量使用一个变量。data.framexgroupfillcolourfillpositiongeom

library(dplyr)
data <- data %>%
  group_by(x) %>%
  mutate(
    width = 0.1 * n()
  )

pos <- position_dodge(width = 0.2)
myplot <-
  ggplot(data,
         aes(
           x = x,
           y = y,
           colour = treatment,
           width = width
         )) +
  geom_line(size = 1, position = pos) +
  geom_point(size = 3, shape = 16, position = pos) +
  geom_errorbar(aes(ymin = y - se, ymax = y + se), position = pos)

myplot
Run Code Online (Sandbox Code Playgroud)

最终影像