How to plot timelines with R or Gnuplot

蓝咒 提交于 2019-12-10 11:14:09

问题


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


回答1:


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 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!




回答2:


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




回答3:


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")

or, alternatively,

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



来源:https://stackoverflow.com/questions/12941949/how-to-plot-timelines-with-r-or-gnuplot

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!