More rmagick/rvg playtime
Posted Wed, 20 May 2009
- A 'tick' provider should just be an iterable class (foo.each, etc) which provides the tick position and optional label.
- A graph can have multiple ticks per axis, allowing you to have 'major' ticks labeled while 'minor' ticks are not labeled, and even more than two layers of ticks on each axis.
- The same tick classes can easily be used to draw both the graph ticks and the grid.
- Trivially have 'time format' tickers
- Have a 'smart time ticker' that looks at the min/max and determines the correct set of time ticks to display (display format, tick distance, tick alignment, etc). Can use multiple 'time ticker' instances internally (code reuse!)
At any rate, I'm finding myself wondering if RMagick/rvg is really the right tool. It certainly makes doing graphics trivial, but even for what I see as a simple graph it takes a little over a second to render, which would hurt usability if multiple graphs needed rendering simultaneously.
The bottleneck seems to be with text rendering. If I disable text display in the graph (tick labels, etc), graph rendering drops by 0.5 seconds (from 1.1). Switching from 'gif' to 'png' output shaved 0.2 seconds on average of rendering, which is interesting.
Today's results, with real data:
graph = RPlot::Graph.new(400, 200, "Ping results for www.google.com") pingsource = RPlot::ArrayDataSource.new File.open("/b/pingdata").each do |line| time,latency = line.split pingsource.points << [time.to_f, latency.to_f] end pingsource.points = pingsource.points[-300..-1] graph.sources << pingsource graph.xtickers << RPlot::SmartTimeTicker.new graph.ytickers << RPlot::LabeledTicker.new(alignment=0, step=25) graph.render("test.png")