require("chartdirector")
class DiscontlineController < ApplicationController
def index()
@title = "Discontinuous Lines"
@ctrl_file = File.expand_path(__FILE__)
@noOfCharts = 1
render :template => "templates/chartview"
end
#
# Render and deliver the chart
#
def getchart()
#===================================================================
# For demo purpose, use random numbers as data for the chart
#===================================================================
# Use a random table to create the data. The random table contains 4 cols x 31
# rows, using 9 as seed.
rantable = ChartDirector::RanTable.new(9, 4, 31)
# Set the 1st col to be the series 1, 2, 3, ....
rantable.setCol(0, 1, 1, 1)
# Set the 2nd, 3rd and 4th col to be random number starting from 40, 50 and 60.
# The change between rows is set to -5 to 5. The minimum value of any cell is 0.
rantable.setCol(1, 40, -5, 5, 0)
rantable.setCol(2, 50, -5, 5, 0)
rantable.setCol(3, 60, -5, 5, 0)
# Use the 1st col as the axis label
labels = rantable.getCol(0)
# Use the 2nd, 3rd and 4th columns for 3 lines
data0 = rantable.getCol(1)
data1 = rantable.getCol(2)
data2 = rantable.getCol(3)
# Simulate some data points have no data value
1.step(29, 7) do |i|
data0[i] = ChartDirector::NoValue
data1[i] = ChartDirector::NoValue
data2[i] = ChartDirector::NoValue
end
#===================================================================
# Now we have the data ready. Actually drawing the chart.
#===================================================================
# Create a XYChart object of size 600 x 220 pixels
c = ChartDirector::XYChart.new(600, 220)
# Set the plot area at (100, 25) and of size 450 x 150 pixels. Enabled both
# vertical and horizontal grids by setting their colors to light grey (0xc0c0c0)
c.setPlotArea(100, 25, 450, 150).setGridColor(0xc0c0c0, 0xc0c0c0)
# Add a legend box (92, 0) (top of plot area) using horizontal layout. Use 8 pts
# Arial font. Disable bounding box (set border to transparent).
c.addLegend(92, 0, false, "", 8).setBackground(ChartDirector::Transparent)
# Add a title to the y axis. Draw the title upright (font angle = 0)
c.yAxis().setTitle("Average\nUtilization\n(MBytes)").setFontAngle(0)
# Use manually scaling of y axis from 0 to 100, with ticks every 10 units
c.yAxis().setLinearScale(0, 100, 10)
# Set the labels on the x axis
c.xAxis().setLabels2(labels)
# Set the title on the x axis
c.xAxis().setTitle("Jun - 2001")
# Add x axis (vertical) zones to indicate Saturdays and Sundays
0.step(28, 7) do |i|
c.xAxis().addZone(i, i + 2, 0xc0c0c0)
end
# Add a line layer to the chart
layer = c.addLineLayer()
# Set the default line width to 2 pixels
layer.setLineWidth(2)
# Add the three data sets to the line layer
layer.addDataSet(data0, 0xcf4040, "Server #1")
layer.addDataSet(data1, 0x40cf40, "Server #2")
layer.addDataSet(data2, 0x4040cf, "Server #3")
# Layout the chart to fix the y axis scaling. We can then use getXCoor and
# getYCoor to determine the position of custom objects.
c.layout()
# Add the "week n" custom text boxes at the top of the plot area.
0.upto(3) do |i|
# Add the "week n" text box using 8 pt Arial font with top center alignment.
textbox = c.addText(layer.getXCoor(i * 7 + 2), 25, sprintf("Week %s", i),
"arialbd.ttf", 8, 0x000000, ChartDirector::TopCenter)
# Set the box width to cover five days
textbox.setSize(layer.getXCoor(i * 7 + 7) - layer.getXCoor(i * 7 + 2) + 1, 0)
# Set box background to pale yellow 0xffff80, with a 1 pixel 3D border
textbox.setBackground(0xffff80, ChartDirector::Transparent, 1)
end
# output the chart
send_data(c.makeChart2(ChartDirector::PNG), :type => "image/png",
:disposition => "inline")
end
end |