Daniel
Daniel

Reputation: 7832

R - strange order of geoms in ggplot2

I have written a small function that plots multiple glm's as forest plots with ggplot. Each model shares the same predictors, but have different dependent variables.

The function requires at least all glm-objects as parameter. Then a data frame is created which is used for the ggplot-procedure.

In my example, I have following data frame with the predictors "sex", "age" (alter3gr), socio-economic status ("ses") and experience ("f0103"). After "transforming" the glm's into a data frame, the results look like this example:

                   OR     lower     upper        p pa shape grp xpos
sex1        1.3253832 1.0735041 1.6372096  "1.33 **"  s     3   1    7
alter3gr1   1.0544569 0.8078543 1.3747014     "1.05" ns     1   1    6
alter3gr2   0.7042160 0.5372706 0.9212466    "0.7 *"  s     2   1    5
ses3_neu21  1.3270242 1.0274121 1.7129088   "1.33 *"  s     2   1    4
ses3_neu22  2.0043975 1.4394807 2.8009534    "2 ***"  s     4   1    3
f01031      1.5953467 1.2783964 1.9944690  "1.6 ***"  s     4   1    2
f01032      2.3780514 1.7175161 3.3307287 "2.38 ***"  s     4   1    1
sex11       0.9841822 0.7684196 1.2605188     "0.98" ns     1   2    7
alter3gr11  1.1778530 0.8731799 1.5964175     "1.18" ns     1   2    6
alter3gr21  0.7633293 0.5513314 1.0588159     "0.76" ns     1   2    5
ses3_neu211 0.9536030 0.7048865 1.3010905     "0.95" ns     1   2    4
ses3_neu221 1.1891460 0.8171171 1.7327086     "1.19" ns     1   2    3
f010311     1.4651668 1.1290179 1.9002631  "1.47 **"  s     3   2    2
f010321     1.7943022 1.2683576 2.5200254 "1.79 ***"  s     4   2    1
sex12       1.1614532 0.9089319 1.4852303     "1.16" ns     1   3    7
alter3gr12  1.1143240 0.8228899 1.5159289     "1.11" ns     1   3    6
alter3gr22  1.0179194 0.7411147 1.4032116     "1.02" ns     1   3    5
ses3_neu212 1.2271544 0.9002163 1.6913440     "1.23" ns     1   3    4
ses3_neu222 1.6178685 1.1085687 2.3713724   "1.62 *"  s     2   3    3
f010312     1.5175505 1.1722055 1.9637617  "1.52 **"  s     3   3    2
f010322     2.0459773 1.4624682 2.8472016 "2.05 ***"  s     4   3    1
sex13       0.6712958 0.4647907 0.9638335   "0.67 *"  s     2   4    7
alter3gr13  1.2343442 0.7809696 1.9911347     "1.23" ns     1   4    6
alter3gr23  1.1335450 0.7068902 1.8517144     "1.13" ns     1   4    5
ses3_neu213 1.1521867 0.7230082 1.9049441     "1.15" ns     1   4    4
ses3_neu223 1.8294885 1.0694548 3.1988430   "1.83 *"  s     2   4    3
f010313     1.2280278 0.8363800 1.7952537     "1.23" ns     1   4    2
f010323     1.8262125 1.1282033 2.8955135   "1.83 *"  s     2   4    1

'data.frame':   42 obs. of  8 variables:
 $ OR   : num  1.325 1.054 0.704 1.327 2.004 ...
 $ lower: num  1.074 0.808 0.537 1.027 1.439 ...
 $ upper: num  1.637 1.375 0.921 1.713 2.801 ...
 $ p    : Factor w/ 40 levels "0.7 *","0.89",..: 5 3 1 4 7 6 8 12 13 10 ...
 $ pa   : Factor w/ 2 levels "ns","s": 2 1 2 2 2 2 2 1 1 1 ...
 $ shape: chr  "3" "1" "2" "2" ...
 $ grp  : Factor w/ 6 levels "1","2","3","4",..: 1 1 1 1 1 1 1 2 2 2 ...
 $ xpos : Factor w/ 8 levels "1","2","3","4",..: 7 6 5 4 3 2 1 7 6 5 ...

The different models are identified by the "grp" column, the predictors by the "xpos" column.

This is how I draw the ggplot:

plotHeader <- ggplot(finalodds, aes(y=OR, x=xpos, alpha=pa, colour=grp))+
  geom_point(position=position_dodge(-modelPlotSpace)) +
  geom_errorbar(aes(ymin=lower, ymax=upper), position=position_dodge(-modelPlotSpace)) +
  geom_text(aes(label=p, y=upper), position=position_dodge(width=-modelPlotSpace), hjust=-0.1) +
  scale_x_discrete(labels=axisLabels.y) +
  scale_y_log10(limits=c(lower_lim, upper_lim), breaks=ticks, labels=ticks) +
  coord_flip()

However, in the plot, the order of the models change for almost every x-position (predictor). Does anybody know why? I'd like to have the same order of my OR-values for each x-position...

Multiple glm's with changing order of ORs

In case you like to reproduce any examples, you can download the R-script sjPlotOddsMultiple.R here. In the script header is an example. If you run that example with sjp.glmm(fitOR1, fitOR2, fitOR3) everything looks fine. However, if you change the order of parameters to sjp.glmm(fitOR1, fitOR3, fitOR2), the problem occurs.

Thanks in advance Daniel

Upvotes: 2

Views: 1254

Answers (1)

tonytonov
tonytonov

Reputation: 25638

Here's the minimal example (finalodds taken as above):

ggplot(finalodds, aes(y=OR, x=xpos, alpha=pa, colour=as.factor(grp))) +
  geom_errorbar(aes(ymin=lower, ymax=upper), position=position_dodge(-0.4), width=0, size=0.8) +
  scale_alpha_manual(values=c(1,1), guide="none")

enter image description here

The correct order is restored by changing the alpha and colour aes:

ggplot(finalodds, aes(y=OR, x=xpos, colour=as.factor(grp)), alpha=pa) +
  geom_errorbar(aes(ymin=lower, ymax=upper), position=position_dodge(-0.4), width=0, size=0.8) +
  scale_alpha_manual(values=c(1,1.0), guide="none")

enter image description here

Upvotes: 2

Related Questions