# position_dodge with geom_point, geom_linerange and categorical x

I'm trying to display estimates and confidence intervals from different regression models. (I recreated a similar dataset in the post.)

How can I use position_dodge, so that the points and lines have the same distance for different numbers of groups. (Notice the points and lines are farther apart in the first plot in the example.)

For now I can manually calculate the width argument of position dodge, by constant * nlevels(x) but I'd like to have a solution that does not require this.

I tried with different values of preserve, but I'm not quite sure what the parameter does. Also I did not find out what the width of points and lines is, if they have one at all, in geom_bar the width is more clear. (Compare this question: What is the width argument in position_dodge? )

require(ggplot2)

set.seed(42)

N_x     <- 3
N_group <- 4

testdata <- data.frame(
a = rep(LETTERS[1:N_x], each=N_group),
b = rep(letters[1:N_group], N_x),
c = c(rep(1, N_group), exp(rnorm(N_group*(N_x-1))))
)

testdata\$ci_width <- c(rep(NA, N_group), exp(rt(N_group*(N_x-1), 10)))
testdata\$c_lower <- testdata\$c - testdata\$ci_width
testdata\$c_upper <- testdata\$c + testdata\$ci_width

testdata <- testdata[order(testdata\$b), ]

testdata

ggplot(testdata[1:6, ], aes(x=a, y=c, ymin=c_lower, ymax=c_upper, group=b, shape=b)) +
geom_point(position = position_dodge(.125), size=3) +
geom_linerange(position = position_dodge(.125)) +
geom_hline(yintercept = 1)

ggplot(testdata, aes(x=a, y=c, ymin=c_lower, ymax=c_upper, group=b, shape=b)) +
geom_point(position = position_dodge(.125), size=3) +
geom_linerange(position = position_dodge(.125)) +
geom_hline(yintercept = 1)