gerbilcharts 0.10.14 → 0.10.26

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: eabd1f229b4d6cc627d2842abc1b84378d797421
4
- data.tar.gz: 919c0b32219c4409a030624c2561dd793b2a340e
2
+ SHA256:
3
+ metadata.gz: e35059b431a7a0934ef66efdc89c4a5234e381999e0dab77379bacdbcff3e057
4
+ data.tar.gz: bfb665487745bd666c4ceca6638974c4d2933eb3b24146c9ff4783d47f9bf4a6
5
5
  SHA512:
6
- metadata.gz: 8113fb0b82359e1cd9ca9537142d6b75971bf3c644e7ace91c5e365309c4c3592af48792e1b296d6a824915489ca9af851c4da1b0c73c4c92b5df180a763ee82
7
- data.tar.gz: 610d2b9196aaceafff9baa0946a36c2f145ba5f74e6896804437992a674bc2f192e4eac56b540c0596ab88350cbbf53474b459d29322e3c98b344abbbe15a7b6
6
+ metadata.gz: 8933769a6e14c2ef8a774cebbc9930746069b3d85901b9de6b7845b6d0dc65bbb2e08ccb4ba304a08eccb787b64084fc9189384964d34683f4a5f7cab0684800
7
+ data.tar.gz: 3659f8547bec07faabfab8ead3636d0eceb70c934867908503af9ee8d0411a75d4925d6062636d86315102f7a1ce23a5decb9c865b75cf31b8ef7764f2a71288
@@ -23,12 +23,15 @@ class AreaChart < ChartBase
23
23
  @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
24
24
  @thechart.add_child(GerbilCharts::Surfaces::MarkBand.new(:orient => ORIENT_OVERLAY))
25
25
  @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
26
- @thechart.add_child(GerbilCharts::Surfaces::AreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
27
26
 
28
- # optional features
29
- if @feature_timetracker
30
- @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY ))
31
- end
27
+ # timetracker will consume events to circle datapoints tooltips
28
+ if @feature_circledatapoints
29
+ @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY )) if @feature_timetracker
30
+ @thechart.add_child(GerbilCharts::Surfaces::AreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
31
+ else
32
+ @thechart.add_child(GerbilCharts::Surfaces::AreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
33
+ @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY )) if @feature_timetracker
34
+ end
32
35
 
33
36
  # link pivots
34
37
  if @feature_linkpivots
@@ -63,12 +63,17 @@ class ChartBase
63
63
  opt.delete :enabletimetracker
64
64
  end
65
65
 
66
- @enabletimetracker=false
66
+ @enablelinkpivots=false
67
67
  if opt[:enablelinkpivots]
68
68
  @feature_linkpivots=opt[:enablelinkpivots]
69
69
  opt.delete :enablelinkpivots
70
70
  end
71
71
 
72
+ @feature_circledatapoints=false
73
+ if opt[:circle_data_points]
74
+ @feature_circledatapoints=opt[:circle_data_points]
75
+ end
76
+
72
77
 
73
78
  # pass on options to chart object
74
79
  @thechart = GerbilCharts::Surfaces::Chart.new(opt)
@@ -10,7 +10,8 @@ module GerbilCharts::Charts
10
10
  # [+style+] Stylesheet file to be applied
11
11
  #
12
12
  # global visual options
13
- # [+circle_data_points] draw a solid circle around each data point
13
+ # [+circle_data_points] draw a solid circle around each data point
14
+ # [+show_95th_percentile] show a line of 95th pct
14
15
  #
15
16
  class LineChart < ChartBase
16
17
 
@@ -25,13 +26,14 @@ class LineChart < ChartBase
25
26
 
26
27
  # other elements
27
28
  @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
29
+ @thechart.add_child(GerbilCharts::Surfaces::MarkBand.new(:orient => ORIENT_OVERLAY))
28
30
  @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
29
- @thechart.add_child(GerbilCharts::Surfaces::LineSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
30
31
 
31
32
  # optional features
32
33
  if @feature_timetracker
33
34
  @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY ))
34
35
  end
36
+ @thechart.add_child(GerbilCharts::Surfaces::LineSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
35
37
 
36
38
  # link pivots
37
39
  if @feature_linkpivots
@@ -28,7 +28,7 @@ class LineChartTable < ChartBase
28
28
  @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
29
29
  @thechart.add_child(GerbilCharts::Surfaces::TitlePanel.new(:orient => ORIENT_OVERLAY, :dim => 30))
30
30
  @thechart.add_child(GerbilCharts::Surfaces::LineSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
31
- @thechart.add_child(GerbilCharts::Surfaces::DetailedLegend.new(:orient=> ORIENT_SOUTH, :dim => 80 , :always_visible => true ))
31
+ @thechart.add_child(GerbilCharts::Surfaces::DetailedLegend.new(:orient=> ORIENT_SOUTH, :dim => 100 , :always_visible => true ))
32
32
  @thechart.add_child(GerbilCharts::Surfaces::VerticalAxis.new(:orient => ORIENT_WEST, :dim => 40 ))
33
33
  @thechart.add_child(GerbilCharts::Surfaces::HorizontalTimeAxis.new(:orient => ORIENT_SOUTH, :dim => 25 ))
34
34
  end
@@ -0,0 +1,38 @@
1
+ module GerbilCharts::Charts
2
+
3
+ # =MRTG Chart Table
4
+ # Each model is a separate line & table legend is shown below chart
5
+ #
6
+ # options
7
+ #
8
+ # [+width+] Width of the chart (pixels)
9
+ # [+height+] Width of the chart (pixels)
10
+ # [+style+] Stylesheet file to be applied
11
+ #
12
+ # global visual options
13
+ # [+circle_data_points] draw a solid circle around each data point
14
+ #
15
+ class MrtgChartTable < ChartBase
16
+
17
+ def initialize(opt={})
18
+ super(opt)
19
+ end
20
+
21
+ def create_chart_elements
22
+
23
+ # anchor (line surface)
24
+ @thechart.create_filter(GerbilCharts::SVGDC::LinearGradientVertical.new("vertgrad","rgb(255,255,255)","rgb(192,192,192)"))
25
+
26
+ # other elements
27
+ @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
28
+ @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
29
+ @thechart.add_child(GerbilCharts::Surfaces::TitlePanel.new(:orient => ORIENT_OVERLAY, :dim => 30))
30
+ @thechart.add_child(GerbilCharts::Surfaces::MrtgSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
31
+ @thechart.add_child(GerbilCharts::Surfaces::DetailedLegend.new(:orient=> ORIENT_SOUTH, :dim => 100 , :always_visible => true ))
32
+ @thechart.add_child(GerbilCharts::Surfaces::VerticalAxis.new(:orient => ORIENT_WEST, :dim => 40 ))
33
+ @thechart.add_child(GerbilCharts::Surfaces::HorizontalTimeAxis.new(:orient => ORIENT_SOUTH, :dim => 25 ))
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -28,13 +28,13 @@ class SquareLineChart < ChartBase
28
28
  @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
29
29
  @thechart.add_child(GerbilCharts::Surfaces::MarkBand.new(:orient => ORIENT_OVERLAY))
30
30
  @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
31
- @thechart.add_child(GerbilCharts::Surfaces::SquareLineSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
32
31
 
33
32
  # optional features
34
33
  if @feature_timetracker
35
34
  @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY ))
36
35
  end
37
-
36
+
37
+ @thechart.add_child(GerbilCharts::Surfaces::SquareLineSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
38
38
  # link pivots
39
39
  if @feature_linkpivots
40
40
  @thechart.add_child(GerbilCharts::Surfaces::LinkPivots.new(:orient => ORIENT_OVERLAY ))
@@ -15,19 +15,23 @@ class StackedAreaChart < ChartBase
15
15
  @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
16
16
  @thechart.add_child(GerbilCharts::Surfaces::StackedGrid.new(:orient => ORIENT_OVERLAY))
17
17
  @thechart.add_child(GerbilCharts::Surfaces::TitlePanel.new(:orient => ORIENT_OVERLAY, :dim => 30))
18
- @thechart.add_child(GerbilCharts::Surfaces::StackedAreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
19
18
 
20
- # optional features
21
- if @feature_timetracker
22
- @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY ))
19
+ # timetracker will consume events to circle datapoints tooltips
20
+ if @feature_circledatapoints
21
+ @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY )) if @feature_timetracker
22
+ @thechart.add_child(GerbilCharts::Surfaces::StackedAreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
23
+ else
24
+ @thechart.add_child(GerbilCharts::Surfaces::StackedAreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
25
+ @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_OVERLAY )) if @feature_timetracker
23
26
  end
24
27
 
25
- # link pivots
26
- if @feature_linkpivots
28
+ # link pivots
29
+ if @feature_linkpivots
27
30
  @thechart.add_child(GerbilCharts::Surfaces::LinkPivots.new(:orient => ORIENT_OVERLAY ))
28
- end
29
- @thechart.add_child(GerbilCharts::Surfaces::Legend.new(:orient=> ORIENT_OVERLAY, :dim => @legend_width))
30
- @thechart.add_child(GerbilCharts::Surfaces::DetailedLegend.new(:orient=> ORIENT_OVERLAY, :dim => 3*@legend_width))
31
+ end
32
+
33
+ @thechart.add_child(GerbilCharts::Surfaces::Legend.new(:orient=> ORIENT_OVERLAY, :dim => @legend_width, :align => :left ))
34
+ @thechart.add_child(GerbilCharts::Surfaces::DetailedLegend.new(:orient=> ORIENT_OVERLAY, :dim => 3*@legend_width, :align => :left))
31
35
  @thechart.add_child(GerbilCharts::Surfaces::VerticalAxis.new(:orient => ORIENT_WEST, :dim => 40 , :cumulative => true ))
32
36
  @thechart.add_child(GerbilCharts::Surfaces::HorizontalTimeAxis.new(:orient => ORIENT_SOUTH, :dim => 25 ))
33
37
 
@@ -36,7 +40,7 @@ class StackedAreaChart < ChartBase
36
40
  @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_SOUTH, :dim => 10 ))
37
41
  end
38
42
  end
39
- end
40
43
 
41
- end
44
+ end # class
45
+ end # module
42
46
 
@@ -22,3 +22,4 @@ require 'gerbilcharts/charts/conversation_ring'
22
22
  require 'gerbilcharts/charts/bubble_chart'
23
23
  require 'gerbilcharts/charts/line_chart_table'
24
24
  require 'gerbilcharts/charts/stacked_area_chart_table'
25
+ require 'gerbilcharts/charts/mrtg_chart_table'
@@ -79,11 +79,7 @@ class BucketizedTimeSeriesGraphModel < TimeSeriesGraphModel
79
79
  tv= normalize_time_input(tv_in)
80
80
  exp=tv.tv_sec.divmod(@bucket_size_secs)
81
81
 
82
- if exp[1] >= @bucket_size_secs/2
83
- return Time.at(exp[0]*@bucket_size_secs + @bucket_size_secs)
84
- else
85
82
  return Time.at(exp[0]*@bucket_size_secs)
86
- end
87
83
  end
88
84
 
89
85
  # how many buckets separate the two buckettimes
@@ -57,6 +57,15 @@ class GraphModelGroup
57
57
  yield m
58
58
  end
59
59
  end
60
+
61
+ def find_model(name)
62
+ @models.each do |m|
63
+ if m.name==name
64
+ return m
65
+ end
66
+ end
67
+ return nil
68
+ end
60
69
 
61
70
  def clear_models
62
71
  @models.clear
@@ -163,12 +163,12 @@ class MonotonousGraphModel < GraphModel
163
163
  #
164
164
  # mode => :normal or :ninety_fifth
165
165
  #
166
- # returns array 0 = min, 1 = max, 2 = avg, 3 = total, 4 = latest
166
+ # returns array 0 = min, 1 = max, 2 = avg, 3 = total, 4 = latest, 5=95th
167
167
  # todo : 5 = stddev
168
168
  # todo : support :ninety_fifth
169
169
  #
170
170
  def get_statistical_analysis()
171
- return [0,0,0,0,0] if @yarr.size==0
171
+ return [0,0,0,0,0,0] if @yarr.size==0
172
172
 
173
173
  a = []
174
174
  a[0]= @yrange.rmin
@@ -181,6 +181,11 @@ class MonotonousGraphModel < GraphModel
181
181
  a[2] = a[3]/@yarr.size
182
182
  a[3] = a[3] * @aggregation_factor
183
183
  a[4] = latest_val
184
+
185
+ # 95th statistical
186
+ rank=(@yarr.size * 0.95).round
187
+ a[5] = @yarr.sort()[rank-1]
188
+
184
189
  return a
185
190
  end
186
191
 
@@ -11,18 +11,25 @@ public
11
11
  PRESETS = [
12
12
  [0,0], [1,0.2], [5,1], [10,1],[20,5],
13
13
  [50,10],[100,25],[200,50], [500,100], [1000,200],
14
- [2000,500], [5000,1000], [8000,2000], [10000,2000],
15
- [20000,5000], [50000,10000], [100000,25000], [200000,50000],
16
- [500000,100000], [800000,200000],
17
- [1000000,200000], [2000000,500000], [3000000,500000], [4000000,1000000],
18
- [5000000,1000000], [6000000, 1000000],
19
- [8000000,2000000], [10000000,2000000], [20000000,5000000], [50_000_000, 10_000_000],
20
- [100_000_000,25_000_000], [200_000_000,50_000_000], [300_000_000,100_000_000], [500_000_000,100_000_000],
21
- [1_000_000_000, 250_000_000] , [3_000_000_000, 1_000_000_000] , [5_000_000_000, 1_000_000_000] ,
14
+ [2000,500], [5000,1000], [8000,2000], [10000,2000],
15
+ [20000,5000], [50000,10000], [100000,25000], [200000,50000],
16
+ [500000,100000], [800000,200000],
17
+ [1000000,200000], [2000000,500000], [3000000,500000], [4000000,1000000],
18
+ [5000000,1000000], [6000000, 1000000],
19
+ [8000000,2000000], [10000000,2000000], [20000000,5000000], [50_000_000, 10_000_000],
20
+ [100_000_000, 25_000_000],
21
+ [200_000_000, 50_000_000],
22
+ [300_000_000, 100_000_000],
23
+ [500_000_000, 100_000_000],
24
+ [1_000_000_000, 250_000_000] ,
25
+ [3_000_000_000, 1_000_000_000] ,
26
+ [5_000_000_000, 1_000_000_000] ,
22
27
  [10_000_000_000, 2_000_000_000] ,
23
28
  [20_000_000_000, 5_000_000_000] ,
24
- [50_000_000_000, 10_000_000_000] ,
29
+ [50_000_000_000, 10_000_000_000] ,
25
30
  [100_000_000_000, 20_000_000_000] ,
31
+ [200_000_000_000, 50_000_000_000] ,
32
+ [500_000_000_000, 100_000_000_000] ,
26
33
  [1_000_000_000_000, 200_000_000_000] ,
27
34
  [10_000_000_000_000,2_000_000_000_000] ,
28
35
  ]
@@ -4,10 +4,10 @@ module GerbilCharts::Surfaces
4
4
  # The transparency kind of allows hidden items to be shown
5
5
  #
6
6
  # ===Options
7
- # :scaling_x :auto, :auto_0, or array [minval,maxval]
8
- # :scaling_y
9
- # :butterfly true/false for butterfly chart (alternate models on +/- y)
10
- # :zbucketsize if no data for this many 'x', then insert a zero
7
+ # :scaling_x :auto, :auto_0, or array [minval,maxval]
8
+ # :scaling_y
9
+ # :butterfly true/false for butterfly chart (alternate models on +/- y)
10
+ # :zbucketsize if no data for this many 'x', then insert a zero
11
11
  #
12
12
  class AreaSurface < Surface
13
13
 
@@ -17,9 +17,9 @@ class AreaSurface < Surface
17
17
 
18
18
  def int_render(g)
19
19
  range_options_x = parent.get_global_option(:scaling_x,:auto)
20
- range_options_y = parent.get_global_option(:scaling_y,:auto)
21
- butterfly = parent.get_global_option(:butterfly,false)
22
- zbucketsize = parent.get_global_option(:zero_bucketsize,nil)
20
+ range_options_y = parent.get_global_option(:scaling_y,:auto)
21
+ butterfly = parent.get_global_option(:butterfly,false)
22
+ zbucketsize = parent.get_global_option(:zero_bucketsize,nil)
23
23
 
24
24
  rx = parent.modelgroup.effective_range_x(range_options_x)
25
25
  ry = parent.modelgroup.effective_range_y(range_options_y)
@@ -27,15 +27,15 @@ class AreaSurface < Surface
27
27
 
28
28
  # any filters ?
29
29
  if parent.get_global_option(:filter,false)
30
- g.curr_win.add_options({:filter => "url(##{parent.get_global_option(:filter,false)})" })
30
+ g.curr_win.add_options({:filter => "url(##{parent.get_global_option(:filter,false)})" })
31
31
  end
32
32
 
33
33
  set_ajaxSurfaceContext(rx.rmax,ry.rmax,"AREA") if parent.usesAjax?
34
34
 
35
- # butterfly chart
36
- ry.update(-ry.rmax) if butterfly
35
+ # butterfly chart
36
+ ry.update(-ry.rmax) if butterfly
37
37
 
38
- y_zero = scale_y 0,ry
38
+ y_zero = scale_y 0,ry
39
39
 
40
40
  f_squarize = parent.get_global_option(:squarize,false)
41
41
 
@@ -49,10 +49,10 @@ class AreaSurface < Surface
49
49
 
50
50
  firstpoint=true
51
51
  xpos,ypos=0,0
52
- last_x=nil
52
+ last_x=nil
53
53
  mod.each_tuple do |x,y|
54
54
 
55
- y =-y if butterfly and i.odd?
55
+ y =-y if butterfly and i.odd?
56
56
 
57
57
  xpos = scale_x x,rx
58
58
  ypos = scale_y y,ry
@@ -62,15 +62,25 @@ class AreaSurface < Surface
62
62
  firstpoint=false
63
63
  end
64
64
 
65
- unless zbucketsize.nil?
66
- if last_x && (x-last_x) > zbucketsize
67
- g.polygon_point scale_x(last_x,rx) ,y_zero
68
- g.polygon_point scale_x(x,rx) ,y_zero
69
- end
70
- last_x=x
71
- end
65
+ unless zbucketsize.nil?
66
+ if last_x && (x-last_x) > zbucketsize
67
+ g.polygon_point scale_x(last_x,rx) ,y_zero
68
+ g.polygon_point scale_x(x,rx) ,y_zero
69
+ end
70
+ last_x=x
71
+ end
72
+
73
+ # tooltip
74
+ if parent.get_global_option(:circle_data_points,false)
75
+ opts = {:id => "item#{i}"}
76
+ opts.store(:gerbiltooltip1, x)
77
+ opts.store(:gerbiltooltip2, "Val = #{GerbilCharts::Models::Presets.new.format_suffix(y)}")
78
+ g.circle(xpos,ypos,2,opts)
79
+ end
72
80
 
73
81
  g.polygon_point xpos,ypos
82
+
83
+
74
84
  end
75
85
 
76
86
  g.polygon_point xpos,y_zero
@@ -63,9 +63,17 @@ class DetailedLegend < GraphElement
63
63
 
64
64
 
65
65
  stat_label_pos = @bounds.right - STAT_TABLE_SIZE
66
- lab = %w(Max Min Avg Latest Total).inject("") { |m,ai| m += ai.rjust(9)}
66
+ headers = %w(Max Min Avg Latest Total)
67
+ if parent.get_global_option(:show_95th_percentile,false)
68
+ headers << " 95th"
69
+ stat_label_pos = stat_label_pos - 25
70
+ end
71
+
72
+ lab = headers.inject("") { |m,ai| m += ai.rjust(9)}
67
73
  if @show_stats
68
- g.textout(stat_label_pos, rbox.bottom-2, lab, {'xml:space' => 'preserve', :class => "legendstats"} )
74
+ g.textout(stat_label_pos,
75
+ rbox.bottom-2, lab,
76
+ {'xml:space' => 'preserve', :class => "legendstats"} )
69
77
  end
70
78
 
71
79
  rbox.top += 16
@@ -94,6 +102,11 @@ class DetailedLegend < GraphElement
94
102
  mod.formatted_val(stat_ana[2]).to_s.rjust(9) +
95
103
  mod.formatted_val(stat_ana[4]).to_s.rjust(9) +
96
104
  fmt_prefix_2(stat_ana[3]).to_s.rjust(9)
105
+
106
+ if parent.get_global_option(:show_95th_percentile,false)
107
+ outs += mod.formatted_val(stat_ana[5]).to_s.rjust(9)
108
+ end
109
+
97
110
  if @show_stats
98
111
  g.textout(stat_label_pos, rbox.bottom-2, outs, {'xml:space' => 'preserve', :class => 'legendstats'} )
99
112
  end
@@ -17,6 +17,10 @@ class Legend < GraphElement
17
17
  return if not parent.get_global_option(:enable_legend,true)
18
18
 
19
19
  w=g.newwin("legendpanel_mini")
20
+
21
+ if parent.get_global_option(:align, :right) == :left
22
+ g.add_option("transform", "translate(#{-@bounds.left+50})")
23
+ end
20
24
  g.setactivewindow(w)
21
25
 
22
26
  # count determines the bounds
@@ -35,7 +35,7 @@ class LineSurface < Surface
35
35
  mod.each_tuple do |x,y|
36
36
  y = -y if butterfly and i.odd?
37
37
 
38
- # the basic line
38
+ # the basic line
39
39
  xpos = scale_x x,rx
40
40
  ypos = scale_y y,ry
41
41
 
@@ -46,18 +46,27 @@ class LineSurface < Surface
46
46
  g.lineto xpos,ypos
47
47
 
48
48
  # tooltip
49
- opts = {:id => "item#{i}"}
50
- if parent.get_global_option(:auto_tooltips,false)
51
- opts.merge!(:onmouseover => "OpacityDown(evt)", :onmouseout => "OpacityUp(evt)")
52
- opts.store(:gerbiltooltip1, mod.name)
53
- opts.store(:gerbiltooltip2, "Val = #{y}")
54
- end
55
-
56
- # cirle dp
57
- g.circle(xpos,ypos,4,opts) if parent.get_global_option(:circle_data_points,false)
58
-
49
+ if parent.get_global_option(:auto_tooltips,false) and parent.get_global_option(:circle_data_points,false)
50
+ opts = {:id => "item#{i}"}
51
+ opts.store(:gerbiltooltip1, x)
52
+ opts.store(:gerbiltooltip2, "Val = #{GerbilCharts::Models::Presets.new.format_suffix(y)}")
53
+ g.circle(xpos,ypos,2,opts)
54
+ end
59
55
  end
60
56
  g.endline(:id => "lineitem#{i}")
57
+
58
+ # 95th percentile line and label
59
+ if parent.get_global_option(:show_95th_percentile,false)
60
+ metrics=mod.get_statistical_analysis
61
+ y95 = scale_y metrics[5],ry
62
+ g.line( @bounds.left, y95, @bounds.right, y95, {:id=>"lineitem#{i}"} )
63
+ y95label = mod.formatted_val(metrics[5])
64
+ g.textout(@bounds.right-10, y95-5, y95label,
65
+ {:class => "reflinelabel", "text-anchor" => "end"})
66
+ g.textout(@bounds.right-10, y95+15, "95th pct",
67
+ {:class => "reflinelabel", "text-anchor" => "end"})
68
+ end
69
+
61
70
  end
62
71
 
63
72
 
@@ -0,0 +1,96 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # = Mrtg Line Surface
4
+ # MRTG like surface
5
+ # First data-point = SquareArea Green
6
+ # Second data-point = SquareLine Blue
7
+ # Third onwards = SquareLines with usual color base as if starting from zero
8
+ #
9
+ # Supported global options
10
+ #
11
+ # [+circle_data_points+] Draw a solid circle around datapoints
12
+ # [+scaling+] :auto, :auto_y0
13
+ #
14
+ class MrtgSurface < Surface
15
+ def initialize(opts={})
16
+ super(opts)
17
+ end
18
+
19
+ def int_render(g)
20
+
21
+ range_options_x = parent.get_global_option(:scaling_x,:auto)
22
+ range_options_y = parent.get_global_option(:scaling_y,:auto)
23
+ zbucketsize = parent.get_global_option(:zero_bucketsize,nil)
24
+ rx = parent.modelgroup.effective_range_x(range_options_x)
25
+ ry = parent.modelgroup.effective_range_y(range_options_y)
26
+
27
+ set_ajaxSurfaceContext(rx.rmax,ry.rmax,"LINE") if parent.usesAjax?
28
+
29
+ parent.modelgroup.each_model_with_index do | mod, i|
30
+
31
+ if i==0
32
+ style= "mrtg0"
33
+ surface= :area
34
+ elsif i==1
35
+ style= "mrtg1"
36
+ else
37
+ style= "lineitem#{i-2}"
38
+ end
39
+
40
+
41
+ if surface==:area
42
+
43
+ g.begin_squarized_polygon
44
+ firstpoint=true
45
+ xpos,ypos=0,0
46
+ last_x=nil
47
+ y_zero = scale_y 0,ry
48
+ mod.each_tuple do |x,y|
49
+
50
+ xpos = scale_x x,rx
51
+ ypos = scale_y y,ry
52
+
53
+ if firstpoint
54
+ g.polygon_point xpos,y_zero
55
+ firstpoint=false
56
+ end
57
+
58
+ unless zbucketsize.nil?
59
+ if last_x && (x-last_x) > zbucketsize
60
+ g.polygon_point scale_x(last_x,rx) ,y_zero
61
+ g.polygon_point scale_x(x,rx) ,y_zero
62
+ end
63
+ last_x=x
64
+ end
65
+
66
+ g.polygon_point xpos,ypos
67
+ end
68
+
69
+ g.polygon_point xpos,y_zero
70
+ g.end_polygon(:id => "mrtg0", "opacity"=>"0.8")
71
+ else
72
+
73
+ prev_ypos=nil
74
+ mod.each_tuple do |x,y|
75
+
76
+ xpos = scale_x x,rx
77
+ ypos = scale_y y,ry
78
+
79
+ prev_ypos ||= ypos
80
+ g.lineto xpos,prev_ypos
81
+ g.lineto xpos,ypos
82
+ prev_ypos=ypos
83
+
84
+ end
85
+ g.endline(:id => style)
86
+ end
87
+
88
+
89
+
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+
96
+ end
@@ -8,7 +8,7 @@ class PieSurface < Surface
8
8
  OUTER_OFFSET_X = 10 # x - distance offset from pie boundary
9
9
  OUTER_OFFSET_Y = 10 # y - y offset from pie boundary
10
10
  LEFT_LABEL_OFFSET = 30 # labels on the left of the PIE offset by this (90-270 deg)
11
- PERCENT_OFFSET_X = -4 # pull slice label this much (tweak)
11
+ PERCENT_OFFSET_X = -10 # pull slice label this much (tweak)
12
12
 
13
13
  def initialize(opts={})
14
14
  super(opts)
@@ -115,10 +115,10 @@ class PieSurface < Surface
115
115
  end
116
116
  if(tot_angle > 270)
117
117
  g.textout(percent_pos_x,percent_pos_y+5, "#{percent}%", :class => elementvalue_clsn)
118
- g.textout(percent_pos_x,percent_pos_y+15, "#{mod.latest_formatted_val}", :class => 'elementlabel' )
118
+ g.textout(percent_pos_x,percent_pos_y+25, "#{mod.latest_formatted_val}", :class => 'elementlabel' )
119
119
  else
120
120
  g.textout(percent_pos_x,percent_pos_y, "#{percent}%", :class => elementvalue_clsn)
121
- g.textout(percent_pos_x,percent_pos_y+10, "#{mod.latest_formatted_val}", :class => 'elementlabel' )
121
+ g.textout(percent_pos_x,percent_pos_y+20, "#{mod.latest_formatted_val}", :class => 'elementlabel' )
122
122
  end
123
123
  end
124
124
 
@@ -25,28 +25,40 @@ class SquareLineSurface < Surface
25
25
 
26
26
  parent.modelgroup.each_model_with_index do | mod, i|
27
27
 
28
- prev_ypos=nil
28
+ prev_ypos=nil
29
29
  mod.each_tuple do |x,y|
30
30
 
31
- # the basic line
31
+ # the basic line
32
32
  xpos = scale_x x,rx
33
33
  ypos = scale_y y,ry
34
34
 
35
- prev_ypos ||= ypos
35
+ prev_ypos ||= ypos
36
36
  g.lineto xpos,prev_ypos
37
- g.lineto xpos,ypos
38
- prev_ypos=ypos
39
-
40
- # datapoint and a tooltip
41
- opts = {:id => "item#{i}"}
42
- if parent.get_global_option(:auto_tooltips,false)
43
- opts.merge!(:onmouseover => "OpacityDown(evt)", :onmouseout => "OpacityUp(evt)")
44
- opts.store(:gerbiltooltip1, mod.name)
45
- opts.store(:gerbiltooltip2, "Val = #{y}")
46
- end
47
- g.circle(xpos,ypos,4,opts) if parent.get_global_option(:circle_data_points,false)
37
+ g.lineto xpos,ypos
38
+ prev_ypos=ypos
39
+
40
+ # datapoint and a tooltip
41
+ opts = {:id => "item#{i}"}
42
+ if parent.get_global_option(:auto_tooltips,false)
43
+ opts.store(:gerbiltooltip1, x)
44
+ opts.store(:gerbiltooltip2, "Val = #{GerbilCharts::Models::Presets.new.format_suffix(y)}")
45
+ end
46
+ g.circle(xpos,ypos,2,opts) if parent.get_global_option(:circle_data_points,false)
48
47
  end
49
48
  g.endline(:id => "lineitem#{i}")
49
+
50
+ # 95th percentile line and label
51
+ if parent.get_global_option(:show_95th_percentile,false)
52
+ metrics=mod.get_statistical_analysis
53
+ y95 = scale_y metrics[5],ry
54
+ g.line( @bounds.left, y95, @bounds.right, y95, {:id=>"lineitem#{i}"} )
55
+ y95label = mod.formatted_val(metrics[5])
56
+ g.textout(@bounds.right-30, y95-5, y95label,
57
+ {:class => "reflinelabel", "text-anchor" => "end"})
58
+ g.textout(@bounds.right-30, y95+15, "95th pct",
59
+ {:class => "reflinelabel", "text-anchor" => "end"})
60
+ end
61
+
50
62
  end
51
63
 
52
64
  draw_ref_model_lines(g,rx,ry)
@@ -9,72 +9,73 @@ class StackedAreaSurface < Surface
9
9
  end
10
10
 
11
11
  def int_render(g)
12
- range_options_x = parent.get_global_option(:scaling_x,:auto)
13
-
14
- rx = parent.modelgroup.effective_range_x(range_options_x)
15
- ry = parent.modelgroup.cumulative_sweep_round_range_y0
16
-
17
- # ajax if used
18
- if parent.usesAjax?
19
- set_ajaxSurfaceContext(rx.rmax,ry.rmax,"SA")
20
- end
21
-
22
-
23
- # draw reference if any
24
- if parent.modelgroup.ref_models.size > 0
25
- ref_model = parent.modelgroup.ref_models[0]
26
-
27
- y_zero = scale_y 0,ry
28
- g.begin_polygon
29
- firstpoint=true
30
- xpos,ypos=0,0
31
- last_x=nil
32
- ref_model.each_tuple do |x,y|
33
-
34
- xpos = scale_x x,rx
35
- ypos = scale_y y,ry
36
-
37
- if firstpoint
38
- g.polygon_point xpos,y_zero
39
- firstpoint=false
40
- end
41
-
42
- if last_x && (x-last_x) > parent.modelgroup.sweep_interval
43
- g.polygon_point scale_x(last_x,rx) ,y_zero
44
- g.polygon_point scale_x(x,rx) ,y_zero
45
- end
46
- last_x=x
47
-
48
- g.polygon_point xpos,ypos
49
- end
50
- g.polygon_point xpos,y_zero
51
- g.end_polygon(:id => "ref_mod")
52
- end
12
+ range_options_x = parent.get_global_option(:scaling_x,:auto)
13
+
14
+ rx = parent.modelgroup.effective_range_x(range_options_x)
15
+ ry = parent.modelgroup.cumulative_sweep_round_range_y0
16
+
17
+ # ajax if used
18
+ if parent.usesAjax?
19
+ set_ajaxSurfaceContext(rx.rmax,ry.rmax,"SA")
20
+ end
21
+
22
+
23
+ # draw reference if any
24
+ if parent.modelgroup.ref_models.size > 0
25
+ ref_model = parent.modelgroup.ref_models[0]
26
+
27
+ y_zero = scale_y 0,ry
28
+ g.begin_polygon
29
+ firstpoint=true
30
+ xpos,ypos=0,0
31
+ last_x=nil
32
+ ref_model.each_tuple do |x,y|
33
+
34
+ xpos = scale_x x,rx
35
+ ypos = scale_y y,ry
36
+
37
+ if firstpoint
38
+ g.polygon_point xpos,y_zero
39
+ firstpoint=false
40
+ end
41
+
42
+ if last_x && (x-last_x) > parent.modelgroup.sweep_interval
43
+ g.polygon_point scale_x(last_x,rx) ,y_zero
44
+ g.polygon_point scale_x(x,rx) ,y_zero
45
+ end
46
+ last_x=x
47
+
48
+ g.polygon_point xpos,ypos
49
+ end
50
+ g.polygon_point xpos,y_zero
51
+ g.end_polygon(:id => "ref_mod")
52
+ end
53
+
54
+ # prepare models for sweeping
55
+ sweep_pos= rx.rmin
56
+ sweep_to = rx.rmax
57
+ polygons = []
58
+ modnames = []
59
+
60
+ klass_poly = parent.get_global_option(:squarize,false) ?
61
+ GerbilCharts::SVGDC::SVGSquarizedPolygon :
62
+ GerbilCharts::SVGDC::SVGPolygon
63
+
64
+ parent.modelgroup.each_model do | mod|
65
+ mod.begin_sweep
66
+ polygons << klass_poly.new
67
+ modnames << mod.name
68
+ end
53
69
 
54
- # prepare models for sweeping
55
- sweep_pos= rx.rmin
56
- sweep_to = rx.rmax
57
- polygons = []
58
- modnames = []
59
-
60
- klass_poly = parent.get_global_option(:squarize,false) ?
61
- GerbilCharts::SVGDC::SVGSquarizedPolygon :
62
- GerbilCharts::SVGDC::SVGPolygon
63
-
64
- parent.modelgroup.each_model do | mod|
65
- mod.begin_sweep
66
- polygons << klass_poly.new
67
- modnames << mod.name
68
- end
69
-
70
- # sweep interval
71
- sweep_interval = parent.modelgroup.sweep_interval
72
-
73
- # perform the sweep
74
- while (sweep_pos<=sweep_to)
70
+ # sweep interval
71
+ sweep_interval = parent.modelgroup.sweep_interval
72
+
73
+ # perform the sweep
74
+ while (sweep_pos<=sweep_to)
75
75
  acc_y = 0
76
76
  parent.modelgroup.each_model_with_index do | mod, i|
77
- acc_y += mod.sweep(sweep_pos)
77
+ t_sweep_pos = mod.sweep(sweep_pos)
78
+ acc_y += t_sweep_pos
78
79
 
79
80
  xpos = scale_x sweep_pos,rx
80
81
  ypos = scale_y acc_y,ry
@@ -82,31 +83,29 @@ class StackedAreaSurface < Surface
82
83
  if polygons[i].isempty?
83
84
  polygons[i].addpoint(xpos,@bounds.bottom)
84
85
  end
85
-
86
86
  polygons[i].addpoint(xpos,ypos)
87
87
  end
88
-
88
+
89
89
  sweep_pos += sweep_interval
90
- end
91
-
92
- # layout all polygons in reverse
93
- i=polygons.length-1
94
- last_x = scale_x sweep_to,rx
95
- polygons.reverse_each do |p|
96
- p.addpoint(last_x,@bounds.bottom)
97
-
98
- opts = {:id => "item#{i}" }
99
- if parent.get_global_option(:auto_tooltips,false)
100
- opts.merge!(:onmouseover => "OpacityDown(evt)", :onmouseout => "OpacityUp(evt)")
101
- opts.store(:gerbiltooltip1, modnames[i])
102
- end
103
-
104
- g.addshape(p,opts)
105
- i -= 1
106
- end
90
+ end
91
+
92
+ # layout all polygons in reverse
93
+ i=polygons.length-1
94
+ last_x = scale_x sweep_to,rx
95
+ polygons.reverse_each do |p|
96
+ p.addpoint(last_x,@bounds.bottom)
97
+
98
+ opts = {:id => "item#{i}" }
99
+ if parent.get_global_option(:auto_tooltips,false)
100
+ opts.merge!(:onmouseover => "OpacityDown(evt)", :onmouseout => "OpacityUp(evt)")
101
+ opts.store(:gerbiltooltip1, modnames[i])
102
+ end
103
+
104
+ g.addshape(p,opts)
105
+ i -= 1
106
+ end
107
107
 
108
108
  end
109
109
 
110
- end
111
-
112
- end
110
+ end # class
111
+ end # module
@@ -36,3 +36,4 @@ require 'gerbilcharts/surfaces/matrix_surface'
36
36
  require 'gerbilcharts/surfaces/conversation_ring'
37
37
  require 'gerbilcharts/surfaces/bubble_surface'
38
38
  require 'gerbilcharts/surfaces/link_pivots'
39
+ require 'gerbilcharts/surfaces/mrtg_surface'
@@ -13,7 +13,7 @@ class SVGWin < SVGElement
13
13
  # add default options first
14
14
  # by default windows will define fill = none and stroke = black
15
15
 
16
- add_options("id"=> name, "fill" => "none", "stroke" => "black" )
16
+ add_options("id"=> name, "fill" => "none" )
17
17
 
18
18
  add_options opts
19
19
 
@@ -202,19 +202,6 @@ class SVGDC
202
202
  }
203
203
 
204
204
  # render tooltips optional
205
- if @use_tooltips
206
- doc.g(:id=>'ToolTip', :opacity=>'0.8', :visibility=>'hidden', "pointer-events"=>'none') {
207
- doc.rect(:id=>'tipbox', :x=>'0', :y=>'5', :width=>'88', :height=> '40', :rx=> '2', :ry=> '2', :fill=>'white', :stroke=>'black')
208
- doc.text(:id=>'tipText', :x=>'5', :y=>'20', "font-family"=> 'Arial', "font-size"=>'12') {
209
- doc.tspan(:id=>'tipTitle', :x=>'5', "font-weight"=>'bold') {
210
- doc.cdata!("")
211
- }
212
- doc.tspan(:id=>'tipDesc', :x=>'5', :dy=> 15, "fill"=>'blue') {
213
- doc.cdata!("")
214
- }
215
- }
216
- }
217
- end
218
205
  }
219
206
 
220
207
  # convert external stylesheet css to inline styles
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gerbilcharts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.14
4
+ version: 0.10.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - vivek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-19 00:00:00.000000000 Z
11
+ date: 2022-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shoulda
@@ -89,6 +89,7 @@ files:
89
89
  - lib/gerbilcharts/charts/line_chart.rb
90
90
  - lib/gerbilcharts/charts/line_chart_table.rb
91
91
  - lib/gerbilcharts/charts/matrix_chart.rb
92
+ - lib/gerbilcharts/charts/mrtg_chart_table.rb
92
93
  - lib/gerbilcharts/charts/pie_chart.rb
93
94
  - lib/gerbilcharts/charts/square_line_chart.rb
94
95
  - lib/gerbilcharts/charts/stacked_area_chart.rb
@@ -127,6 +128,7 @@ files:
127
128
  - lib/gerbilcharts/surfaces/link_pivots.rb
128
129
  - lib/gerbilcharts/surfaces/mark_band.rb
129
130
  - lib/gerbilcharts/surfaces/matrix_surface.rb
131
+ - lib/gerbilcharts/surfaces/mrtg_surface.rb
130
132
  - lib/gerbilcharts/surfaces/panel.rb
131
133
  - lib/gerbilcharts/surfaces/pie_surface.rb
132
134
  - lib/gerbilcharts/surfaces/rect.rb
@@ -176,8 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
178
  - !ruby/object:Gem::Version
177
179
  version: '0'
178
180
  requirements: []
179
- rubyforge_project:
180
- rubygems_version: 2.5.1
181
+ rubygems_version: 3.2.32
181
182
  signing_key:
182
183
  specification_version: 4
183
184
  summary: SVG timeseries charting