3

What is the best and easy way to plot, with R or Gnuplot, timelines like in this picture:

enter image description here

Thiago Vieira
  • 126
  • 4
  • 16
  • 2
    Sample data would be nice! :) dput() please or create dummy data. – Brandon Bertelsen Oct 17 '12 at 19:49
  • 1
    [this question](http://stackoverflow.com/questions/10017853/how-to-produce-non-standard-plot-type-with-ggplot/10018187#10018187) has a similar plot. using a stacked bar chart with "blanks". – Justin Oct 17 '12 at 20:14

3 Answers3

2

My solution uses the 'candlestick' plotting style, which seems to be fixed in terms of X and Y column inputs. As a result the output image has to be manually rotated, but this seems to be the only option for generating bars which 'float' off the base axis. Probably you will want to tweak the styles a bit, but this should get you started.

sample project timeline plot

Sample input data; note I had to add the arbitrary Y-axis (rotated X-axis) coordinates in column 1:

1 proj1     768.83      2011-05-12 2013-06-19
2 proj2     426.79      2011-06-15 2012-08-15
3 proj3     429.89      2011-06-17 2012-08-20
4 proj4     318.02      2012-01-06 2012-11-19
5 proj5     278.72      2011-11-10 2012-08-15
6 proj6     231.16      2011-11-14 2012-07-02
7 proj7     230.27      2011-11-15 2012-07-02
8 proj8     230.23      2011-11-15 2012-07-02
9 proj9     581.81      2011-11-15 2013-06-19
10 proj10   230.08      2011-11-15 2012-07-02

(saved as 'dates4.dat' for script below.)

gnuplot script:

# horizontal timelines / time bars with gnuplot ; manually rotate result image at end

# size specification controls landscape vs. portrait, this is for A4 paper size
set terminal pdf size 21cm,29.7cm
set output 'dates.pdf'

# margins get confused so set explicitly
set lmargin at screen 0.04
set bmargin at screen 0.07
set tmargin at screen 0.97

# rotation will swap Y and X axis

# input Y data as date values
set ydata time
set timefmt "%Y-%m-%d"

# y coordinates now specified in time values
set yrange ['2011-03-01':'2014-01-01']

# normal Y axis labels end up on top of graph, don't want that
unset ytics

# format y2 axis for time scale, this will appear along bottom of graph
set y2data time
set format y2 "%b %Y"
set y2tics font "Courier, 8"
set y2tics rotate by 90 

# y2tics 'incr' measured in seconds for y2data time, this is 4 months = 4*30*24*60*60
set y2tics '2011-05-12',10368000,'2013-12-01'

set xrange [-1:28]
set xtics font "Courier, 8"
set xtics rotate by 90 offset 0,-5 out nomirror

# cannot rotate key (dataset label), so must create manually
unset key
set label 'elapsed project time' at 0,'2013-06-15' rotate font "Courier, 8"
set object 1 rect from -0.1,'2013-11-01' to 0,'2013-12-01' fillstyle solid noborder fillcolor rgb "red"

# note duplication of date columns 4 and 5 so don't get whiskers
plot "dates4.dat" using 1:4:4:5:5:xticlabels(2) with candlesticks fillcolor rgb "red"

hope that helps!

robm
  • 1,303
  • 1
  • 16
  • 24
1

Not sure about r, but in gnuplot you can declare an axis as time formatted. To achieve your y axis example:

set ydata time # tells gnuplot that y is a time series
set ylabel 'Submission day in August'
set timefmt '%Y-%m-%d' # this should be set to the format of your date series
set format y '%d' # sets the axis labels format

Other than that, gnuplot supports multiple series, grid and arbitrary shapes, so you should be fine.

Hope this helps

Achilles
  • 766
  • 4
  • 13
0

Using example data by @robm and package vistime, you'll get

install.packages("vistime")
library(vistime)
data<-read.csv(text="proj1,768.83,2011-05-12,2013-06-19
                proj2,426.79,2011-06-15,2012-08-15
                proj3,429.89,2011-06-17,2012-08-20
                proj4,318.02,2012-01-06,2012-11-19
                proj5,278.72,2011-11-10,2012-08-15
                proj6,231.16,2011-11-14,2012-07-02
                proj7,230.27,2011-11-15,2012-07-02
                proj8,230.23,2011-11-15,2012-07-02
                proj9,581.81,2011-11-15,2013-06-19
                proj10,230.08,2011-11-15,2012-07-02", header=F, sep=",")
data$tooltip=paste(data$V1, data$V2)
vistime(data, events="V1", start="V3", end="V4")

enter image description here

or, alternatively,

vistime(data, events="V2", start="V3", end="V4", groups="V1")

enter image description here

shosaco
  • 5,915
  • 1
  • 30
  • 48