8

Building on my previous question I'd like to add second axis label on the opposite side of the plot.

The data frame looks like:

test <- structure(list(characteristic = structure(c(1L, 2L, 3L, 1L, 2L
), .Label = c("Factor1", "Factor2", "Factor3"), class = "factor"), 
    es = c(1.2, 1.4, 1.6, 1.3, 1.5), ci_low = c(1.1, 1.3, 1.5, 
    1.2, 1.4), ci_upp = c(1.3, 1.5, 1.7, 1.4, 1.6), label = structure(c(1L, 
    3L, 5L, 2L, 4L), .Label = c("1.2 (1.1, 1.3)", "1.3 (1.2, 1.4)", 
    "1.4 (1.3, 1.5)", "1.5 (1.4, 1.6)", "1.6 (1.5, 1.7)"), class = "factor"), 
    set = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("H", "S"
    ), class = "factor")), .Names = c("characteristic", "es", 
"ci_low", "ci_upp", "label", "set"), class = "data.frame", row.names = c(NA, 
-5L))

Using Tyler's solution, a graph of it looks like that at the moment:

enter image description here

In a similar way to a forest plot I'd like to add a second set of labels (label variable in my data frame) representing graphed values, preferably on the right side of panels. So that it all mimics forest plot similar to this example:

enter image description here

I know that second axis seems to be frowned upon. However these are just another set of labels.. ant it seems to be a custom among forest plots.

How can I do that in ggplot?

Community
  • 1
  • 1
radek
  • 7,240
  • 8
  • 58
  • 83
  • 1
    the answers here will maybe give you a starting point: http://stackoverflow.com/questions/4867597/can-you-easily-plot-rugs-axes-on-the-top-right-in-ggplot2/4868130#4868130 – Chase Apr 17 '12 at 02:02
  • @Chase: Thanks for that. Indeed much easily hackable using `plot`. Still wondering if one could do that in ggplot2? – radek Apr 18 '12 at 16:12
  • 1
    The second axis is only frowned upon when it is a totally different variable (e.g. temperature and sediment concentration). A second axis which is a transformed version of the first is perfectly acceptable (e.g. temperature in C, or in K, or in F). – Paul Hiemstra May 04 '12 at 08:45

2 Answers2

7

EDIT updating to ggplot2 0.9.3

Adding your set of labels in your test dataframe to the faceted chart is straightforward. Use geom_text with aesthetics for the labels, and the x and y positions of the labels. In the code below, xlim creates a little more space for the labels. The following code:

library(gridExtra)
library(ggplot2)

p <- ggplot(test, aes(y = characteristic, x = es, xmin = ci_low, xmax = ci_upp)) + 
  geom_point() +   
  geom_errorbarh(height = 0) +
  geom_text(aes(label = label, x = 2, y = characteristic)) + 
  scale_x_continuous(limits = c(1, 2.2), breaks = c(1, 1.2, 1.4, 1.6, 1.8),
    labels=c("1.0", "1.2", "1.4", "1.6", "1.8")) +
  facet_grid(set ~ ., scales = "free", space = "free") +
  theme_bw() + 
  theme(strip.text.y = element_text(angle = 0),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank())
p

grid.text(expression(paste("ES " %+-% " ci")), x = 0.78,   y = .92,
   gp = gpar(fontsize = 18))

produces:

enter image description here

Sandy Muspratt
  • 31,719
  • 12
  • 116
  • 122
1

Here is my answer: ( I am undeading the post due to not a complete answer found. I am still searching to add "diamond" Summary )

It is a lot "automated".

  • lgOR = Data with Estimates and CI 95%.

  • ci_lower = 95% CI lower

  • ci_upper = 95% CI upper

  • author = Authors / dates

  • Model_pars <- paste( orH2, ort2, orI2, orModel, orModel_sig, sep=" | ") # These are the Heterogeneity stats - as subtitle.

     min_v     <- floor(min(lgOR$ci_lower))
     max_v     <- ceiling(max(lgOR$ci_upper))
     OR_v      <- as.matrix( round(lgOR$OR,2) )
     ORci      <- paste("(", round(lgOR$ci_lower,2), "|", round(lgOR$ci_upper,2), ")" )
    
     ggplot(data=lgOR, aes(y=1:nrow(lgOR), x=OR, xmin=ci_lower, xmax=ci_upper)) +
       geom_point() + 
       geom_errorbarh(height=.3) +
       scale_y_continuous(name = "", breaks=1:nrow(lgOR), labels=lgOR$author ) +
       scale_x_continuous(limits = c( min_v, max_v + 3 ), 
                          breaks = c( min_v:max_v, max_v + 3 ),
                          expand = c(0,0) )+
       labs(title='Effect Size by Study', x=Model_pars, y = 'Study') +
       geom_vline(xintercept=0, color='black', linetype='dashed', alpha=.5) +
       theme( axis.title.x = element_text(size = 8),
              axis.text.x = element_text(size = 7),
              axis.title.y = element_text(size = 1)) +
       geom_text(aes(x=9, label= paste(OR_v, ORci ))) 
    
Estatistics
  • 874
  • 9
  • 24