17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
# File 'lib/egor/heatmap_array.rb', line 17
def heatmap(options = {})
if $no_rmagick
return nil
end
opts = {:columns => 4,
:rvg_width => nil,
:dpi => 100,
:title => '',
:max_val => nil,
:mid_val => nil,
:min_val => nil,
:print_gradient => true,
:gradient_beg_color => '#FFFFFF',
:gradient_mid_color => nil,
:gradient_end_color => '#FF0000',
:gradient_border_width => 1,
:gradient_border_color => '#000000'}.merge(options)
row_images = ImageList.new
self.each_by(opts[:columns]) { |maps|
images = ImageList.new
maps.each { |m| images << m }
row_images << images.append(false)
}
tbl_img = row_images.append(true)
unless opts[:print_gradient]
return tbl_img
else
RVG::dpi = opts[:dpi]
rvg_width = opts[:rvg_width] * opts[:columns]
rvg_height = rvg_width / 10.0
rvg = RVG.new(rvg_width, rvg_height) do |canvas|
canvas.viewbox(0, 0, rvg_width, rvg_height)
canvas.background_fill = 'white'
canvas.desc = 'gradient key'
gradient_width = rvg_width / 2.0
gradient_height = gradient_width / 15.0
if opts[:gradient_mid_color]
img1 = Image.new(gradient_width / 2,
gradient_height,
GradientFill.new(0, 0, 0, gradient_width / 2,
opts[:gradient_beg_color], opts[:gradient_mid_color]))
img2 = Image.new(gradient_width / 2,
gradient_height,
GradientFill.new(0, 0, 0, gradient_width / 2,
opts[:gradient_mid_color], opts[:gradient_end_color]))
img3 = ImageList.new
img3 << img1 << img2
img = img3.append(false)
else
img = Image.new(gradient_width,
gradient_height,
GradientFill.new(0, 0, 0, gradient_width,
opts[:gradient_beg_color], opts[:gradient_end_color]))
end
img.border!(opts[:gradient_border_width],
opts[:gradient_border_width],
opts[:gradient_border_color])
gradient_x = (rvg_width - gradient_width) / 2.0
gradient_y = (rvg_height - gradient_height) / 2.0
gradient_font_size = rvg_width / 45.0
canvas.image(img,
gradient_width,
gradient_height,
gradient_x,
gradient_y)
canvas.text(gradient_x,
gradient_y + gradient_height + gradient_font_size * 1.1,
"#{'%.1f' % opts[:min_val]}").styles(:font_size => gradient_font_size)
canvas.text(gradient_x + gradient_width,
gradient_y + gradient_height + gradient_font_size * 1.1,
"#{'%.1f' % opts[:max_val]}").styles(:font_size => gradient_font_size)
end
fin_img = ImageList.new
fin_img << tbl_img << rvg.draw
fin_img.append(true)
end
end
|