Class: AnalyticsCharts::PieAndLabels
- Includes:
- Magick
- Defined in:
- lib/analytics_charts/pie_and_labels.rb
Instance Attribute Summary
Attributes inherited from CustomPie
#label_hash, #label_offset, #label_start_x, #label_start_y, #pie_center_x, #pie_center_y, #pie_label_hash, #pie_radius
Instance Method Summary collapse
- #draw_legend ⇒ Object
- #draw_line ⇒ Object
- #draw_organization ⇒ Object
- #fits_in_a_line(text) ⇒ Object
-
#initialize(meme, num_labels, organization, disclaimer) ⇒ PieAndLabels
constructor
A new instance of PieAndLabels.
- #insert_legend(label, quality) ⇒ Object
- #line_wrap(text) ⇒ Object
- #tokenize_text_by_lines(text) ⇒ Object
- #write(filename = 'graph.png') ⇒ Object
Methods inherited from CustomPie
#draw, #draw_labels, #draw_pie_label, #insert_pie_data, #insert_text, #insert_text_with_arrow, #set_feature, #set_label_values, #set_pie_colors, #set_pie_geometry
Constructor Details
#initialize(meme, num_labels, organization, disclaimer) ⇒ PieAndLabels
Returns a new instance of PieAndLabels.
5 6 7 8 9 10 11 12 13 14 15 16 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 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 5 def initialize(meme, num_labels, organization, disclaimer) @organization = organization @legend_data = Array.new(["","","",""]) @columns = 450 @composite_image = Image.read(meme)[0] @composite_columns = @composite_image.columns @composite_rows = @composite_image.rows @rows_with_no_disclaimer = [200 + 20, 20 + 16 * num_labels + 20].max + @composite_rows @dummy_image = Image.new(1,1) @d = Draw.new @d.pointsize = 12 @d.font_weight = 700 @rows_of_text = tokenize_text_by_lines(disclaimer) @rows = @rows_with_no_disclaimer + @rows_of_text.size * 12 + 5 @data = Hash.new # Value is array with two items @aggregate = Array([0,0,0,0]) # Cluster brands into categories @label_hash = {'pointsize'=> 16,'font_weight'=> 700 } @pie_label_hash = {'pointsize'=> 14, 'font_weight' => 600 } set_pie_colors(%w(#AD1F25 #BE6428 #C1B630 #1E753B #FFFFFF)) @base_image = Image.new(@columns, @rows) { self.background_color = "black" } @base_image.composite!(@composite_image,0,0,OverCompositeOp) set_pie_geometry(325, 60+ @composite_rows, 50) set_label_values(22, 20+@composite_rows, 16) y_offset = @rows_with_no_disclaimer + @d.get_type_metrics(@dummy_image,"a").height + 5 @rows_of_text.each do |text| if text.include? "@$$" # No paragraph break if we insert this uncommonly used word text.sub!("@$$", "") insert_text(22, y_offset ,text, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 12 })) @d.annotate(@base_image, 0 ,0, 22, y_offset, text) next else insert_text(22, y_offset ,text, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 12 })) y_offset += 12 end end end |
Instance Method Details
#draw_legend ⇒ Object
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 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 69 def draw_legend y_offset = 180 + @composite_rows @d.fill_opacity(1) @d.stroke_width(0) @d = @d.stroke 'transparent' x_pos = 230 side_length = 15 @legend_data.each_with_index do |data, index| case index when 3 insert_text(x_pos + 20, y_offset + 12, data, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 10 })) @d.fill('#1E753B') @d.rectangle(x_pos,y_offset,x_pos + side_length, y_offset + side_length) when 2 insert_text(x_pos + 20, y_offset + 12, data, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 10 })) @d.fill('#C1B630') @d.rectangle(x_pos,y_offset,x_pos + side_length, y_offset + side_length) when 1 insert_text(x_pos + 20, y_offset + 12, data, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 10 })) @d.fill('#BE6428') @d.rectangle(x_pos,y_offset,x_pos + side_length, y_offset + side_length) when 0 insert_text(x_pos + 20, y_offset + 12, data, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 10 })) @d.fill('#AD1F25') @d.rectangle(x_pos,y_offset,x_pos + side_length, y_offset + side_length) end y_offset -= side_length end end |
#draw_line ⇒ Object
102 103 104 105 106 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 102 def draw_line @d.stroke('white') @d.stroke_width(1) @d.line(0,@rows_with_no_disclaimer,@columns,@rows_with_no_disclaimer) end |
#draw_organization ⇒ Object
56 57 58 59 60 61 62 63 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 56 def draw_organization insert_text(22, @rows_with_no_disclaimer - 20, @organization, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 10 })) category_disclaimer = "(categories only for demo purposes)" insert_text(22, @rows_with_no_disclaimer - 10, category_disclaimer, @label_hash.merge({'fill' => '#FFFFFF', 'pointsize'=> 10 })) end |
#fits_in_a_line(text) ⇒ Object
135 136 137 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 135 def fits_in_a_line(text) return @d.get_type_metrics(@dummy_image,text).width < @columns - 44 end |
#insert_legend(label, quality) ⇒ Object
65 66 67 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 65 def insert_legend(label, quality) @legend_data[quality] = label end |
#line_wrap(text) ⇒ Object
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 119 def line_wrap(text) tokens = text.split.reverse # Pop stuff off # Safety check, do not allow super long words. tokens.each {|token| return "" if not fits_in_a_line(token) } line_wrap_tokens = Array.new line_builder = "" while tokens.size != 0 line_builder = tokens.pop # Pop the first word in a line while tokens.size != 0 and fits_in_a_line(line_builder + " " + tokens.last) line_builder += " " + tokens.pop end line_wrap_tokens.push(line_builder) # Add to list of lines end line_wrap_tokens end |
#tokenize_text_by_lines(text) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 108 def tokenize_text_by_lines(text) # First split the text by the line carriage element carriage_split_lines = text.split("\r\n") line_tokens = Array.new carriage_split_lines.each do |carriage_split_line| line_wrap_lines = line_wrap(carriage_split_line) line_wrap_lines.each { |line| line_tokens.push(line) } line_tokens.push("\r\n") end line_tokens end |
#write(filename = 'graph.png') ⇒ Object
46 47 48 49 50 51 52 53 54 |
# File 'lib/analytics_charts/pie_and_labels.rb', line 46 def write(filename='graph.png') draw draw_labels draw_organization draw_legend draw_line @d.draw(@base_image) @base_image.write(filename) end |