From 6706668e3356384e3af0332cdc075cbf582b5642 Mon Sep 17 00:00:00 2001 From: Rodrigo Ulisses e Silva Date: Fri, 30 Aug 2024 14:09:36 -0300 Subject: [PATCH 1/5] Fix y position on BarChartRenderer. When the column value is less than 5 the chart uses a negative value to y_position for this bar --- .../graph/chart_components/bar_chart_renderer.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/prawn/graph/chart_components/bar_chart_renderer.rb b/lib/prawn/graph/chart_components/bar_chart_renderer.rb index 693fb05..7544221 100644 --- a/lib/prawn/graph/chart_components/bar_chart_renderer.rb +++ b/lib/prawn/graph/chart_components/bar_chart_renderer.rb @@ -1,8 +1,8 @@ module Prawn module Graph module ChartComponents - # The Prawn::Graph::ChartComponents::BarChartRenderer is used to plot one or more bar charts - # in a sensible way on a a Prawn::Graph::ChartComponents::Canvas and its associated + # The Prawn::Graph::ChartComponents::BarChartRenderer is used to plot one or more bar charts + # in a sensible way on a a Prawn::Graph::ChartComponents::Canvas and its associated # Prawn::Document. # class BarChartRenderer < SeriesRenderer @@ -41,8 +41,8 @@ def mark_minimum_point(series_index, point, min_marked, x_position, y_position) def render_the_chart prawn.bounding_box [@graph_area.point[0] + 5, @graph_area.point[1] - 20], width: @plot_area_width, height: @plot_area_height do - - prawn.save_graphics_state do + + prawn.save_graphics_state do num_points = @series[0].size width_per_point = (@plot_area_width / num_points) width = (((width_per_point * 0.9) / @series.size).round(2)).to_f @@ -60,7 +60,7 @@ def render_the_chart starting = (prawn.bounds.left + (point * width_per_point)) x_position = ( (starting + (series_offset * width) ).to_f - (width / 2.0)) - y_position = ((point_height_percentage(@series[series_index].values[point]) * @plot_area_height) - 5).to_f + y_position = (point_height_percentage(@series[series_index].values[point]) * @plot_area_height).to_f prawn.fill_and_stroke_line([ x_position ,0], [x_position ,y_position]) unless @series[series_index].values[point].zero? @@ -76,7 +76,7 @@ def render_the_chart end end - def max + def max @series.collect(&:max).max || 0 end @@ -91,4 +91,4 @@ def avg end end end -end \ No newline at end of file +end From 995b10a5c4ca26df2290dc3e5505dbdde0c45143 Mon Sep 17 00:00:00 2001 From: Lucas Costa Date: Wed, 21 May 2025 09:38:57 -0300 Subject: [PATCH 2/5] Fix min and max on BarChartRenderer --- lib/prawn/graph/chart_components/bar_chart_renderer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/prawn/graph/chart_components/bar_chart_renderer.rb b/lib/prawn/graph/chart_components/bar_chart_renderer.rb index 7544221..17ec422 100644 --- a/lib/prawn/graph/chart_components/bar_chart_renderer.rb +++ b/lib/prawn/graph/chart_components/bar_chart_renderer.rb @@ -77,11 +77,11 @@ def render_the_chart end def max - @series.collect(&:max).max || 0 + @series.map(&:max).compact.max || 0 end def min - @series.collect(&:min).min || 0 + @series.map(&:min).compact.min || 0 end def avg From 1eaad610a00b0e30b7a0e4d7bd70ca059fd2fe8f Mon Sep 17 00:00:00 2001 From: Lucas Costa Date: Thu, 22 May 2025 22:26:29 -0300 Subject: [PATCH 3/5] Fix min height for BarChartRenderer --- lib/prawn/graph/chart_components/bar_chart_renderer.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/prawn/graph/chart_components/bar_chart_renderer.rb b/lib/prawn/graph/chart_components/bar_chart_renderer.rb index 17ec422..2acec4d 100644 --- a/lib/prawn/graph/chart_components/bar_chart_renderer.rb +++ b/lib/prawn/graph/chart_components/bar_chart_renderer.rb @@ -48,6 +48,7 @@ def render_the_chart width = (((width_per_point * 0.9) / @series.size).round(2)).to_f min_marked = false max_marked = false + min_height = 2 num_points.times do |point| @@ -60,7 +61,8 @@ def render_the_chart starting = (prawn.bounds.left + (point * width_per_point)) x_position = ( (starting + (series_offset * width) ).to_f - (width / 2.0)) - y_position = (point_height_percentage(@series[series_index].values[point]) * @plot_area_height).to_f + proportional_height = (point_height_percentage(@series[series_index].values[point]) * @plot_area_height).to_f + y_position = [proportional_height, min_height].max prawn.fill_and_stroke_line([ x_position ,0], [x_position ,y_position]) unless @series[series_index].values[point].zero? From 88a0410814ecbc7808f8655e06ec5796a7c3b7a2 Mon Sep 17 00:00:00 2001 From: Lucas Costa Date: Thu, 21 Aug 2025 15:46:58 -0300 Subject: [PATCH 4/5] Add top label bar chart --- .../chart_components/bar_chart_renderer.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/prawn/graph/chart_components/bar_chart_renderer.rb b/lib/prawn/graph/chart_components/bar_chart_renderer.rb index 2acec4d..64c5784 100644 --- a/lib/prawn/graph/chart_components/bar_chart_renderer.rb +++ b/lib/prawn/graph/chart_components/bar_chart_renderer.rb @@ -66,6 +66,15 @@ def render_the_chart prawn.fill_and_stroke_line([ x_position ,0], [x_position ,y_position]) unless @series[series_index].values[point].zero? + prawn.fill_color = "000000" + prawn.text_box "#{@series[series_index].values[point]}", + at: [x_position - 6, y_position + 10], + height: 5, + overflow: :shrink_to_fit, + width: 12, + valign: :bottom, + align: :right + mark_average_line(series_index) max_marked = mark_maximum_point(series_index, point, max_marked, x_position, y_position) min_marked = mark_minimum_point(series_index, point, min_marked, x_position, y_position) @@ -78,6 +87,16 @@ def render_the_chart end end + def render_axes + prawn.stroke_color = @canvas.theme.axes + prawn.fill_color = @canvas.theme.axes + prawn.stroke_horizontal_line(0, @plot_area_width, at: 0) + prawn.stroke_vertical_line(0, @plot_area_height, at: 0) + prawn.fill_and_stroke_ellipse [ 0,0], 1 + + add_x_axis_labels + end + def max @series.map(&:max).compact.max || 0 end From 5451260a31f3493369a453e5f04e52da2e4d5fc7 Mon Sep 17 00:00:00 2001 From: Lucas Costa Date: Fri, 22 Aug 2025 11:28:24 -0300 Subject: [PATCH 5/5] Fix NaN for point_height_percentage --- lib/prawn/graph/chart_components/series_renderer.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/prawn/graph/chart_components/series_renderer.rb b/lib/prawn/graph/chart_components/series_renderer.rb index 9525fe8..a8bbac3 100644 --- a/lib/prawn/graph/chart_components/series_renderer.rb +++ b/lib/prawn/graph/chart_components/series_renderer.rb @@ -76,7 +76,8 @@ def add_y_axis_label(value) # the series. # def point_height_percentage(value) - ((BigDecimal(value, 10)/BigDecimal(@canvas.series.collect(&:max).max, 10)) * BigDecimal(1)).round(2) rescue 0 + result = ((BigDecimal(value, 10)/BigDecimal(@canvas.series.collect(&:max).max, 10)) * BigDecimal(1)).round(2) rescue 0 + result.nan? ? 0 : result.to_f end def prawn