title: How to run R scripts on servers without X11
body: <p>I want to run R scripts and save the plots using <code>png()</code>. X11 is not supported on the Unix servers and I get the following error message:</p>
  
  <pre><code>Error in X11(paste("png::", filename, sep = ""), g$width, g$height, pointsize,  : 
    unable to start device PNG
  Calls: png
  In addition: Warning message:
  In png("test.png", width = 900, height = 400) :
    unable to open connection to X11 display ''
  Execution halted
  </code></pre>
  
  <p>Setting environment variables</p>
  
  <pre><code>Sys.setenv("DISPLAY"=":0.0")
  </code></pre>
  
  <p>or </p>
  
  <pre><code>Sys.setenv("DISPLAY"=":0")
  </code></pre>
  
  <p>in the R scripts didn't solve the problem. </p>
  
  <p>This code example produces the error above:</p>
  
  <pre><code>library(ggplot2)
  library(grid)
  
  # Some data
  df = data.frame(x = c(1.2,5,3,5.3,2,9,4,6,8,0), y = c(1.5,6,2.5,5.1,2.3,8.7,4.1,6,8,0))
  
  
  # Base plot
  p &lt;- ggplot(df, aes(x,y)) + geom_point() +
     scale_x_continuous(limits = c(0, 8), expand = c(0,0)) +
     scale_y_continuous(limits = c(0, 8), expand = c(0,0)) +
     geom_smooth(method="lm", se=FALSE, formula=y~x, aes(colour="2"), show_guide=TRUE, fill=NA, size=1.2) +
     geom_vline(xintercept = 3) + geom_vline(xintercept = 7) +
     opts(plot.margin = unit(c(1,1,4,1), "lines"))
  
  # Create the text Grobs
  Text1 = textGrob("Part 1")
  Text2 = textGrob("Part 2")
  Text3 = textGrob("Part 3")
  
  # Add the annotations
  # Segment 1
  p1 = p +
       annotation_custom(grob = linesGrob(), xmin = 0, xmax = 0, ymin = 
  -1, ymax = -.75) +
       annotation_custom(grob = linesGrob(), xmin = 0, xmax = 3, ymin = 
  -1, ymax = -1) +
       annotation_custom(grob = linesGrob(), xmin = 3, xmax = 3, ymin = 
  -1, ymax = -.75) +
       annotation_custom(grob = Text1,  xmin = 0, xmax = 3, ymin = -1.25, 
  ymax = -1.25)
  
  # Segment 2
  p1 = p1 +
       annotation_custom(grob = linesGrob(), xmin = 3, xmax = 7, ymin = 
  -1, ymax = -1) +
       annotation_custom(grob = linesGrob(), xmin = 7, xmax = 7, ymin = 
  -1, ymax = -.75) +
       annotation_custom(grob = Text2,   xmin = 3, xmax = 7, ymin = -1.25, 
  ymax = -1.25)
  
  # Segment 3
  p1 = p1 +
       annotation_custom(grob = linesGrob(), xmin = 7, xmax = 8, ymin = 
  -1, ymax = -1) +
       annotation_custom(grob = linesGrob(), xmin = 8, xmax = 8, ymin = 
  -1, ymax = -.75) +
       annotation_custom(grob = Text3,  xmin = 7, xmax = 8, ymin = -1.25, 
  ymax = -1.25)
  
  png("test.png", width=900, height=400)
  
  # Code to override clipping
  gt &lt;- ggplot_gtable(ggplot_build(p1))
  gt$layout$clip[gt$layout$name=="panel"] &lt;- "off"
  grid.draw(gt)
  
  dev.off()
  </code></pre>
  
  <p>The outcome of <code>capabilities()</code> is:</p>
  
  <pre><code>   jpeg      png     tiff    tcltk      X11     aqua http/ftp  sockets 
     FALSE    FALSE    FALSE     TRUE    FALSE    FALSE     TRUE     TRUE 
  
    libxml     fifo   cledit    iconv      NLS  profmem    cairo 
      TRUE     TRUE    FALSE     TRUE     TRUE    FALSE    FALSE
  </code></pre>
  
  <p>I am running the scripts via a sun grid engine.</p>