1 #!/usr/bin/gnuplot -persist
5 # Version 4.6 patchlevel 6 last modified September 2014
6 # Build System: Linux x86_64
8 # Copyright (C) 1986-1993, 1998, 2004, 2007-2014
9 # Thomas Williams, Colin Kelley and many others
11 # gnuplot home: http://www.gnuplot.info
12 # faq, bugs, etc: type "help FAQ"
13 # immediate help: type "help" (plot window: hit 'h')
15 set title "Seasonal phenomenon, highlighted using a polar graph"
18 set timefmt "%Y-%m-%d"
21 # Dummy plot to gather some stats from the dataset
23 plot 'data.dat' using 1:2
25 xmin = GPVAL_DATA_X_MIN
26 xmax = GPVAL_DATA_X_MAX
27 ymin = GPVAL_DATA_Y_MIN
28 ymax = GPVAL_DATA_Y_MAX
32 set grid polar back lw 1
41 # XXX: offsets may need to be adjusted for a different data set
42 set offsets 0, 0.2, 0.1, 0.1
44 set rrange [ymin:ymax + 0.5]
46 # XXX: rtics may need to be adjusted for a different data set
49 year_min = tm_year(xmin)
50 year_max = tm_year(xmax)
52 set cbrange [year_min:year_max + 1]
54 # Generate colorbox labels programmatically
55 cblabels = 'set cbtics ( '
56 do for [i=year_min:year_max] {
57 cblabels = cblabels . '"' . i .'" ' . i .','
59 cblabels = cblabels . '"" ' . (i + 1) .','
60 cblabels = cblabels . ' )'
63 # The value 12 works well with the default colorbox height
64 cbtics_offset = 12 / (year_max - year_min)
65 set cbtics offset 0,+cbtics_offset
67 set palette rgbformulae 31,-11,32
68 set palette maxcolors (year_max - year_min + 1)
70 # The radius below places the labels outside of the grid.
72 # XXX: It depends on the magnitude of the data values tho, and it may need to
73 # be adjusted for a different data set.
75 set_label(x, text) = sprintf("set label '%s' at (%f*cos(%f)), (%f*sin(%f)) center", text, r, x, r, x)
77 # Create labels for the months, apparently gnuplot does not allow to set ttics
78 month_angle(x) = x * 2 * pi / 12 + pi / 12
79 eval set_label(month_angle(0), "Jan")
80 eval set_label(month_angle(1), "Feb")
81 eval set_label(month_angle(2), "Mar")
82 eval set_label(month_angle(3), "Apr")
83 eval set_label(month_angle(4), "May")
84 eval set_label(month_angle(5), "Jun")
85 eval set_label(month_angle(6), "Jul")
86 eval set_label(month_angle(7), "Aug")
87 eval set_label(month_angle(8), "Sep")
88 eval set_label(month_angle(9), "Oct")
89 eval set_label(month_angle(10), "Nov")
90 eval set_label(month_angle(11), "Dec")
92 # Scale the data so that one year covers one circumference,
93 # this allows samples in the same time of the year to be at the same angles.
94 one_year = 60 * 60 * 24 * 365.25
95 scale_date_to_month_polar(x) = (int(x) % int(one_year)) / one_year * (2 * pi)
97 # With this hacky-ish wrap() function we loose some points when the data wraps
98 # around, but AFAIK this is unavoidable without preprocessing the data.
99 year_wrap(old, new) = tm_year(old) == tm_year(new) ? scale_date_to_month_polar(new) : NaN
101 if (GPVAL_VERSION < 5.0) \
102 tcol(x) = timecolumn(x); \
104 tcol(x) = timecolumn(x, "%Y-%m-%d")
107 #set terminal png notransparent nocrop truecolor rounded enhanced font "arial,8" fontscale 1.0
108 #set output 'modular_polar.png'
112 'data.dat' using (prev=saved, saved=tcol(1), year_wrap(prev, saved)):2:(tm_year(tcol(1))) with lines lc palette lw 1.5