Class: Gruff::Line
Overview
Here’s how to make a Line graph:
g = Gruff::Line.new
g.title = "A Line Graph"
g.data 'Fries', [20, 23, 19, 8]
g.data 'Hamburgers', [50, 19, 99, 29]
g.write("test/output/line.png")
There are also other options described below, such as #baseline_value, #baseline_color, #hide_dots, and #hide_lines.
Constant Summary
Constants inherited from Base
Base::DEFAULT_MARGIN, Base::DEFAULT_TARGET_WIDTH, Base::LABEL_MARGIN, Base::LEGEND_MARGIN, Base::THOUSAND_SEPARATOR
Instance Attribute Summary collapse
-
#dot_radius ⇒ Object
Returns the value of attribute dot_radius.
-
#dot_style ⇒ Object
default is ‘circle’, other options include square.
-
#hide_dots ⇒ Object
Hide parts of the graph to fit more datapoints, or for a different appearance.
-
#hide_lines ⇒ Object
Hide parts of the graph to fit more datapoints, or for a different appearance.
-
#line_width ⇒ Object
Dimensions of lines and dots; calculated based on dataset size if left unspecified.
-
#maximum_x_value ⇒ Object
accessors for support of xy data.
-
#minimum_x_value ⇒ Object
accessors for support of xy data.
-
#reference_line_default_color ⇒ Object
Returns the value of attribute reference_line_default_color.
-
#reference_line_default_width ⇒ Object
Returns the value of attribute reference_line_default_width.
-
#reference_lines ⇒ Object
Allow for reference lines ( which are like baseline … just allowing for more & on both axes ).
-
#show_vertical_markers ⇒ Object
Allow for vertical marker lines.
Attributes inherited from Base
#additional_line_values, #bold_title, #bottom_margin, #center_labels_over_point, #colors, #font, #font_color, #has_left_labels, #hide_legend, #hide_line_markers, #hide_line_numbers, #hide_title, #label_max_size, #label_stagger_height, #label_truncation_style, #labels, #left_margin, #legend_at_bottom, #legend_box_size, #legend_font_size, #legend_margin, #marker_color, #marker_count, #marker_font_size, #marker_shadow_color, #maximum_value, #minimum_value, #no_data_message, #right_margin, #sort, #sorted_drawing, #title, #title_font, #title_font_size, #title_margin, #top_margin, #use_data_label, #x_axis_increment, #x_axis_label, #y_axis_increment, #y_axis_label
Instance Method Summary collapse
- #baseline_color ⇒ Object
- #baseline_color=(new_value) ⇒ Object
-
#baseline_value ⇒ Object
Get the value if somebody has defined it.
-
#baseline_value=(new_value) ⇒ Object
Set a value for a baseline reference line..
-
#dataxy(name, x_data_points = [], y_data_points = [], color = nil) ⇒ Object
This method allows one to plot a dataset with both X and Y data.
- #draw ⇒ Object
- #draw_horizontal_reference_line(reference_line) ⇒ Object
- #draw_reference_line(reference_line, left, right, top, bottom) ⇒ Object
- #draw_vertical_reference_line(reference_line) ⇒ Object
-
#initialize(*args) ⇒ Line
constructor
Call with target pixel width of graph (
800
,400
,300
), and/orfalse
to omit lines (points only).
Methods inherited from Base
#add_color, #data, #margins=, #replace_colors, #theme=, #theme_37signals, #theme_greyscale, #theme_keynote, #theme_odeo, #theme_pastel, #theme_rails_keynote, #to_blob, #write
Constructor Details
#initialize(*args) ⇒ Line
Call with target pixel width of graph (800
, 400
, 300
), and/or false
to omit lines (points only).
g = Gruff::Line.new(400) # 400px wide with lines
g = Gruff::Line.new(400, false) # 400px wide, no lines (for backwards compatibility)
g = Gruff::Line.new(false) # Defaults to 800px wide, no lines (for backwards compatibility)
The preferred way is to call #hide_dots or #hide_lines instead.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/gruff/line.rb', line 71 def initialize(*args) raise ArgumentError, 'Wrong number of arguments' if args.length > 2 if args.empty? || (!args.first.is_a?(Numeric) && !args.first.is_a?(String)) super() else super args.shift end @reference_lines = {} @reference_line_default_color = 'red' @reference_line_default_width = 5 @hide_dots = @hide_lines = false @maximum_x_value = nil @minimum_x_value = nil @dot_style = 'circle' @show_vertical_markers = false @store = Gruff::Store.new(Gruff::Store::XYData) end |
Instance Attribute Details
#dot_radius ⇒ Object
Returns the value of attribute dot_radius.
26 27 28 |
# File 'lib/gruff/line.rb', line 26 def dot_radius @dot_radius end |
#dot_style ⇒ Object
default is ‘circle’, other options include square.
29 30 31 |
# File 'lib/gruff/line.rb', line 29 def dot_style @dot_style end |
#hide_dots ⇒ Object
Hide parts of the graph to fit more datapoints, or for a different appearance.
32 33 34 |
# File 'lib/gruff/line.rb', line 32 def hide_dots @hide_dots end |
#hide_lines ⇒ Object
Hide parts of the graph to fit more datapoints, or for a different appearance.
32 33 34 |
# File 'lib/gruff/line.rb', line 32 def hide_lines @hide_lines end |
#line_width ⇒ Object
Dimensions of lines and dots; calculated based on dataset size if left unspecified.
25 26 27 |
# File 'lib/gruff/line.rb', line 25 def line_width @line_width end |
#maximum_x_value ⇒ Object
accessors for support of xy data.
38 39 40 |
# File 'lib/gruff/line.rb', line 38 def maximum_x_value @maximum_x_value end |
#minimum_x_value ⇒ Object
accessors for support of xy data.
35 36 37 |
# File 'lib/gruff/line.rb', line 35 def minimum_x_value @minimum_x_value end |
#reference_line_default_color ⇒ Object
Returns the value of attribute reference_line_default_color.
18 19 20 |
# File 'lib/gruff/line.rb', line 18 def reference_line_default_color @reference_line_default_color end |
#reference_line_default_width ⇒ Object
Returns the value of attribute reference_line_default_width.
19 20 21 |
# File 'lib/gruff/line.rb', line 19 def reference_line_default_width @reference_line_default_width end |
#reference_lines ⇒ Object
Allow for reference lines ( which are like baseline … just allowing for more & on both axes ).
17 18 19 |
# File 'lib/gruff/line.rb', line 17 def reference_lines @reference_lines end |
#show_vertical_markers ⇒ Object
Allow for vertical marker lines.
22 23 24 |
# File 'lib/gruff/line.rb', line 22 def show_vertical_markers @show_vertical_markers end |
Instance Method Details
#baseline_color ⇒ Object
53 54 55 56 57 |
# File 'lib/gruff/line.rb', line 53 def baseline_color if @reference_lines.key?(:baseline) @reference_lines[:baseline][:color] end end |
#baseline_color=(new_value) ⇒ Object
59 60 61 62 |
# File 'lib/gruff/line.rb', line 59 def baseline_color=(new_value) @reference_lines[:baseline] ||= {} @reference_lines[:baseline][:color] = new_value end |
#baseline_value ⇒ Object
Get the value if somebody has defined it.
41 42 43 44 45 |
# File 'lib/gruff/line.rb', line 41 def baseline_value if @reference_lines.key?(:baseline) @reference_lines[:baseline][:value] end end |
#baseline_value=(new_value) ⇒ Object
Set a value for a baseline reference line..
48 49 50 51 |
# File 'lib/gruff/line.rb', line 48 def baseline_value=(new_value) @reference_lines[:baseline] ||= {} @reference_lines[:baseline][:value] = new_value end |
#dataxy(name, x_data_points = [], y_data_points = [], color = nil) ⇒ Object #dataxy(name, xy_data_points = [], color = nil) ⇒ Object
-
if (x_data_points.length != y_data_points.length) an error is returned.
-
if the color argument is nil, the next color from the default theme will be used.
-
if you want to use a preset theme, you must set it before calling #dataxy.
This method allows one to plot a dataset with both X and Y data.
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/gruff/line.rb', line 129 def dataxy(name, x_data_points = [], y_data_points = [], color = nil) # make sure it's an array x_data_points = Array(x_data_points) y_data_points = Array(y_data_points) raise ArgumentError, 'x_data_points is nil!' if x_data_points.empty? if x_data_points.all? { |p| p.is_a?(Array) && p.size == 2 } x_data_points, y_data_points = x_data_points.transpose end raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length # call the existing data routine for the x/y data. store.add(name, y_data_points, color, x_data_points) end |
#draw ⇒ Object
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/gruff/line.rb', line 164 def draw super return unless data_given? # Check to see if more than one datapoint was given. NaN can result otherwise. @x_increment = (column_count > 1) ? (@graph_width / (column_count - 1).to_f) : @graph_width @reference_lines.each_value do |curr_reference_line| draw_horizontal_reference_line(curr_reference_line) if curr_reference_line.key?(:norm_value) draw_vertical_reference_line(curr_reference_line) if curr_reference_line.key?(:index) end if @show_vertical_markers (0..column_count).each do |column| x = @graph_left + @graph_width - column.to_f * @x_increment Gruff::Renderer::Line.new(color: @marker_color).render(x, @graph_bottom, x, @graph_top) #If the user specified a marker shadow color, draw a shadow just below it if @marker_shadow_color Gruff::Renderer::Line.new(color: @marker_shadow_color).render(x + 1, @graph_bottom, x + 1, @graph_top) end end end store.norm_data.each do |data_row| prev_x = prev_y = nil one_point = contains_one_point_only?(data_row) data_row.coordinates.each_with_index do |(x_data, y_data), index| if x_data.nil? #use the old method: equally spaced points along the x-axis new_x = @graph_left + (@x_increment * index) draw_label(new_x, index) else new_x = get_x_coord(x_data, @graph_width, @graph_left) @labels.each do |label_pos, _| draw_label(@graph_left + ((label_pos - @minimum_x_value) * @graph_width) / (@maximum_x_value - @minimum_x_value), label_pos) end end unless y_data # we can't draw a line for a null data point, we can still label the axis though prev_x = prev_y = nil next end new_y = @graph_top + (@graph_height - y_data * @graph_height) # Reset each time to avoid thin-line errors stroke_width = line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 4), 5.0) circle_radius = dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0) if !@hide_lines && prev_x && prev_y Gruff::Renderer::Line.new(color: data_row.color, width: stroke_width) .render(prev_x, prev_y, new_x, new_y) end if one_point || !@hide_dots Gruff::Renderer::Dot.new(@dot_style, color: data_row.color, width: stroke_width).render(new_x, new_y, circle_radius) end prev_x = new_x prev_y = new_y end end Gruff::Renderer.finish end |
#draw_horizontal_reference_line(reference_line) ⇒ Object
154 155 156 157 |
# File 'lib/gruff/line.rb', line 154 def draw_horizontal_reference_line(reference_line) level = @graph_top + (@graph_height - reference_line[:norm_value] * @graph_height) draw_reference_line(reference_line, @graph_left, @graph_left + @graph_width, level, level) end |
#draw_reference_line(reference_line, left, right, top, bottom) ⇒ Object
146 147 148 149 150 151 152 |
# File 'lib/gruff/line.rb', line 146 def draw_reference_line(reference_line, left, right, top, bottom) config = { color: reference_line[:color] || @reference_line_default_color, width: reference_line[:width] || @reference_line_default_width } Gruff::Renderer::DashLine.new(config).render(left, top, right, bottom) end |
#draw_vertical_reference_line(reference_line) ⇒ Object
159 160 161 162 |
# File 'lib/gruff/line.rb', line 159 def draw_vertical_reference_line(reference_line) index = @graph_left + (@x_increment * reference_line[:index]) draw_reference_line(reference_line, index, index, @graph_top, @graph_top + @graph_height) end |