visualisation-utils 0.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -14,7 +14,7 @@ scatter-plot
14
14
  ============
15
15
 
16
16
  Prints scatter plots of one or more columns of whitespace separated data using
17
- gnuplot as a backend
17
+ gnuplot as a backend.
18
18
 
19
19
 
20
20
  ~~~ .bash
@@ -31,16 +31,41 @@ This incantation will bring up the gnuplot gui with the following graph:
31
31
 
32
32
  ![gui](https://raw.github.com/programmiersportgruppe/visualisation-utils/master/doc/gnuplot-gui.png)
33
33
 
34
+ heat-map
35
+ =====-==
36
+
37
+ Prints a heat map visualising the distribution of
38
+ geo coordinate samples.
39
+
40
+ ~~~ .bash
41
+ cat | < | heat-map <<'END'
42
+ 38.6,-90.5
43
+ 38.6,-90.5
44
+ 40.5,-74.3
45
+ 34.4,-92.2
46
+ 42.5,-83.0
47
+ 34.1,-92.0
48
+ 33.3,-111.9
49
+ 34.1,-91.8
50
+ 34.2,-86.8
51
+ END
52
+ ~~~
53
+
54
+ This will render to the following visualisation:
55
+
56
+ ![map](https://raw.github.com/programmiersportgruppe/visualisation-utils/master/doc/heat-map.png)
57
+
58
+
34
59
  TODO
35
60
  ====
36
61
 
37
- * Overriding of autoscale
38
- * Create nice PNGs
39
- * Line plots
40
- * Changing changing the size of the dots
41
- * Secondary y-axis
42
- * Bar chart single series
43
- * Bar chart multiple series
44
- * Discrete y-values, e.g. to visualise events over time
45
- * Histogram plotting
62
+ [X] Overriding of autoscale
63
+ [X] Create nice PNGs
64
+ [X] Line plots
65
+ [ ] Changing changing the size of the dots
66
+ [X] Secondary y-axis
67
+ [ ] Bar chart single series
68
+ [ ] Bar chart multiple series
69
+ [ ] Discrete y-values, e.g. to visualise events over time
70
+ [ ] Histogram plotting
46
71
 
data/bin/heat-map ADDED
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env ruby
2
+ require 'trollop'
3
+
4
+ DATA_FILE_NAME="/tmp/plot-"+`date "+%s"`.strip+".dat"
5
+ PLOT_FILE_NAME="/tmp/plot-"+`date "+%s"`.strip+".plt"
6
+
7
+
8
+ @opts = Trollop::options do
9
+ banner "heat-map takes comma and newline separated table of coordinate from stdin and renders them using gnuplot"
10
+ opt :outfile, "Output file name", :type => String, :short => 'o'
11
+ opt :debug, "debug"
12
+ opt :title, "Title", :type=> String, :short => 't'
13
+ opt :font, "Font", :type => String, :short => 'f'
14
+ opt :extra_header, "Extra commands to be put in the header of the gnuplot file", :type => String
15
+ end
16
+
17
+ title = @opts[:title] || ""
18
+
19
+ # TODO I do want to be streamed!
20
+ input = `cat`
21
+
22
+ freqs = input.split("\n").map{|line|
23
+ line.split(",").map{|number | number.to_f.round(0)}.join(",")
24
+ }
25
+ .group_by{|coords| coords}
26
+ .map{|pair| [pair[0], pair[1].length]}
27
+ .inject({}) { |memo, obj|
28
+ memo[obj.first] = obj.last
29
+ memo
30
+ }
31
+
32
+ freq_values = freqs.values
33
+ max_val = freq_values.max
34
+ min_val = freq_values.min
35
+ mid_val = (min_val + (max_val - min_val)/2).round(1)
36
+
37
+ puts "Min. value: #{min_val}, max value: #{max_val}"
38
+
39
+ full_map = (-179..179).map{|lon|
40
+ (-89..89).map{|lat|
41
+ key = "#{lat},#{lon}"
42
+ "#{lat} #{lon} #{freqs[key]||0}"
43
+ }
44
+ }.join("\n")
45
+
46
+
47
+ File.open(DATA_FILE_NAME, "w"){|f| f.write(full_map)}
48
+
49
+ font = @opts[:font] || "Futura"
50
+ font_size = "12"
51
+
52
+ extra_header = @opts[:extra_header] || ""
53
+
54
+ if (@opts[:outfile])
55
+ filename = @opts[:outfile]
56
+ extension = filename.gsub(/[^.]*\./,"")
57
+ if (extension == "png")
58
+ terminal=<<EOF
59
+ set term pngcairo font '#{font},#{font_size}' transparent size 1200,800
60
+ set output '#{filename}'
61
+
62
+ EOF
63
+ elsif (extension == "eps")
64
+ terminal=<<EOF
65
+ set term epscairo size 1200,800 font '#{font},#{font_size}'
66
+ set output '#{filename}'
67
+ EOF
68
+ elsif (extension == "pdf")
69
+ terminal=<<EOF
70
+ set term pdfcairo size 22cm,14cm font '#{font},#{font_size}'
71
+ set output '#{filename}'
72
+ EOF
73
+ elsif (extension == "svg")
74
+ terminal=<<EOF
75
+ set term svg size 1200,800 font '#{font},#{font_size}'
76
+ set output '#{filename}'
77
+ EOF
78
+ else
79
+ throw "Unknown output format '.#{extension}'."
80
+ end
81
+
82
+
83
+ end
84
+
85
+
86
+ world_dat=File.join(File.dirname(File.expand_path(__FILE__)), '/../world.dat')
87
+
88
+
89
+ script = <<EOF
90
+
91
+
92
+
93
+ #{terminal}
94
+
95
+
96
+ set title "#{title}"
97
+
98
+ # color definitions
99
+ set border lw 1.5
100
+ set style line 1 lc rgb 'black' lt 1 lw 2
101
+
102
+ set rmargin screen 0.85
103
+
104
+ unset key
105
+ set tics scale 0.5
106
+ unset xtics
107
+ unset ytics
108
+ set xrange[-179:179]
109
+ set yrange[-89:89]
110
+ #set format '%g'
111
+ set palette defined (0 "white",#{min_val} "#00ffff",#{mid_val} "yellow",#{max_val} "red")
112
+ plot '#{DATA_FILE_NAME}' u 2:1:3 w image, \
113
+ '#{world_dat}' with lines linestyle 1
114
+ EOF
115
+
116
+
117
+ puts "data file " + DATA_FILE_NAME
118
+ puts "plot file " + PLOT_FILE_NAME
119
+
120
+
121
+
122
+ File.open(PLOT_FILE_NAME, "w"){|f| f.write(script)}
123
+
124
+ `gnuplot #{PLOT_FILE_NAME}`
125
+
data/doc/heat-map.png ADDED
Binary file
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
3
3
  s.summary = 'utilities for quick visualisation'
4
4
  s.description = 'visualisation-utils provides a number of utilities
5
5
  for visualising data from the command line.'
6
- s.version = '0.4'
6
+ s.version = '0.5'
7
7
  s.platform = Gem::Platform::RUBY
8
8
 
9
9
  s.files = ['bin/scatter-plot']