ggplot2 position_dodge会影响错误栏宽度

时间:2017-03-10 10:44:58

标签: 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)

首先是没有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

plot without 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

Plot with position_dodge

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

2 个答案:

答案 0 :(得分:5)

正如@aosmith建议的那样,解决方法是将错误栏的宽度缩放到x的点数。但是,这不需要手动完成。下面我使用dplyr根据data.frame的点数在x中创建新列。我还删除了groupfill映射,因为这里都不需要(假设形状更改为由colour而不是{{1}着色的实心圆的版本}})。最后,为了避免重复,我已经定义了fill一次,然后为每个position使用了一个变量。

geom

Final image

答案 1 :(得分:1)

我过去使用的一个有点尴尬的解决方法是使用width内的aes手动设置每个错误栏的宽度。每个组中的值数量可以告诉您缩放每个错误栏的数量。

例如,如果我有一个具有单个值的组和一个具有3个值的组,则3 width的组必须比1 width的组大3倍。

你的情况要复杂得多,因为你有一组1,一组6和3组4.你可以先弄清楚单组的宽度是多少。我选择.1。因此,6人小组需要.6宽,4人小组需要.4宽。

然后诀窍是确定绘制线条以获得宽度的顺序。对于更简单的情况,这更容易。

绘图代码:

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 = c(rep(.4, 8), rep(.6, 4), rep(.4, 4), .6, .6, .1)), 
                position = position_dodge(width = 0.2))

enter image description here