ocPortal Developer's Guide: Importing
» Return to Contents
sources/svg.php
Global_functions_svg.php
Function summary
|
void
|
init__svg ()
|
|
string
|
_draw_segment (string colour, integer angle, integer radius, integer start_x, integer start_y, integer end_x, integer end_y)
|
|
string
|
_draw_key (array data, string start_colour, integer start_x, integer start_y, string units)
|
|
string
|
_get_next_colour (string current_colour)
|
|
string
|
_start_svg ()
|
|
string
|
_finish_svg (string plot)
|
|
string
|
_filter_svg_css (string plot)
|
|
string
|
_draw_axes (float max_y, float y_scale, string x_label, string y_label)
|
|
string
|
_draw_average (float average, float y_scale)
|
|
string
|
create_bar_chart (array data, string x_label, string y_label, string x_units, string y_units)
|
|
string
|
create_scatter_graph (array data, string x_label, string y_label, string x_units, string y_units)
|
|
string
|
create_pie_chart (array data)
|
void init__svg()
Standard code module initialisation function.
Parameters…
(No return value)
function init__svg()
{
require_css('svg');
// Some default values
define('VIEWPORT_WIDTH',1024.0);
define('VIEWPORT_HEIGHT',400.0);
define('SVG_WIDTH',1024.0);
define('SVG_HEIGHT',400.0);
define('Y_LABEL_WIDTH',50.0);
define('Y_AXIS_WIDTH',50.0);
define('PLOT_WIDTH_BIAS',10.0);
define('PLOT_WIDTH',SVG_WIDTH-Y_LABEL_WIDTH-Y_AXIS_WIDTH-PLOT_WIDTH_BIAS);
define('X_LABEL_HEIGHT',13.0);
define('X_AXIS_HEIGHT',13.0);
define('PLOT_HEIGHT_BIAS',10.0);
define('PLOT_HEIGHT',SVG_HEIGHT-X_LABEL_HEIGHT-X_AXIS_HEIGHT-PLOT_HEIGHT_BIAS);
define('X_PADDING',2.0);
define('Y_PADDING',2.0);
define('MIN_Y_MARKER_DISTANCE',14.0);
define('MIN_X_MARKER_DISTANCE',14.0);
define('TEXT_HEIGHT',14.0);
define('BAR_WIDTH',15.0);
global $CSS_FILE_CONTENTS;
$CSS_FILE_CONTENTS='';
}
string _draw_segment(string colour, integer angle, integer radius, integer start_x, integer start_y, integer end_x, integer end_y)
Get the SVG markup for a segment of a circle. It is designed to be used in the construction of a pie chart
Parameters…
| Name |
colour |
| Description |
The hexadecimal-formatted colour for the shape |
| Type |
string |
| Name |
angle |
| Description |
The angle of the segment |
| Type |
integer |
| Name |
radius |
| Description |
The radius of the segment |
| Type |
integer |
| Name |
start_x |
| Description |
The X position of the start vertex |
| Type |
integer |
| Name |
start_y |
| Description |
The Y position of the start vertex |
| Type |
integer |
| Name |
end_x |
| Description |
The X position of the end vertex |
| Type |
integer |
| Name |
end_y |
| Description |
The Y position of the end vertex |
| Type |
integer |
Returns…
| Description |
The SVG markup for the described segment |
| Type |
string |
function _draw_segment($colour,$angle,$radius,$start_x,$start_y,$end_x,$end_y)
{
if ($angle==360) return '<circle cx="'.float_to_raw_string(X_PADDING+floatval($radius)).'" cy="'.float_to_raw_string(Y_PADDING+floatval($radius)).'" r="'.float_to_raw_string(floatval($radius)).'" style="fill: #'.($colour).';" class="pie_chart" />'.chr(10);
else return '<path d="M'.float_to_raw_string(X_PADDING+floatval($radius)).','.float_to_raw_string(Y_PADDING+floatval($radius)).' L'.float_to_raw_string(X_PADDING+floatval($start_x)).','.float_to_raw_string(Y_PADDING+floatval($start_y)).' A'.float_to_raw_string(floatval($radius)).','.float_to_raw_string(floatval($radius)).' 0 '.float_to_raw_string(($angle>180)?1.0:0.0).',1,'.float_to_raw_string(X_PADDING+floatval($end_x)).','.float_to_raw_string(Y_PADDING+floatval($end_y)).' Z" style="fill: #'.($colour).';" class="pie_chart" />'.chr(10);
}
string _draw_key(array data, string start_colour, integer start_x, integer start_y, string units)
Get the SVG markup for a key for a chart, such as a pie chart, using the specified data
Parameters…
| Name |
data |
| Description |
An array of the data to be keyed up |
| Type |
array |
| Name |
start_colour |
| Description |
The starting colour for the key |
| Type |
string |
| Name |
start_x |
| Description |
The starting X position |
| Type |
integer |
| Name |
start_y |
| Description |
The starting Y position |
| Type |
integer |
| Name |
units |
| Description |
The units (e.g. %) |
| Default value |
|
| Type |
string |
Returns…
| Description |
The SVG markup for the described key |
| Type |
string |
function _draw_key($data,$start_colour,$start_x,$start_y,$units='')
{
if (!defined('BOX_SIZE'))
{
define('BOX_SIZE',10.0);
define('BOX_SPACING',5.0);
}
$output='';
$colour=$start_colour;
$i=0;
foreach ($data as $key=>$_value)
{
if (is_array($_value)) $_value=array_shift($_value);
$value=float_format($_value);
if (strlen($value)>100) $value=substr($value,0,40).'…'.substr($value,-40);
if ($key=='') $key=do_lang('UNKNOWN');
$output.='<rect x="'.float_to_raw_string(floatval($start_x)).'" y="'.float_to_raw_string(floatval($start_y)+floatval($i)*(BOX_SPACING+BOX_SIZE)).'" width="'.float_to_raw_string(BOX_SIZE).'" height="'.float_to_raw_string(BOX_SIZE).'" style="fill: #'.($colour).';" class="key_box" />'.chr(10);
$output.='<text x="'.float_to_raw_string(floatval($start_x)+BOX_SPACING+BOX_SIZE).'" y="'.float_to_raw_string(floatval($start_y)+floatval($i)*(BOX_SPACING+BOX_SIZE)+BOX_SIZE).'" class="key_text">'.escape_html($key).' ('.escape_html($value.$units).')</text>'.chr(10);
$colour=_get_next_colour($colour);
$i++;
}
return $output;
}
string _get_next_colour(string current_colour)
Get the next hexadecimal colour from the specified one, where each of the Red, Green or Blue columns can either be 00, 33, 66 or 99, to provide a viewable contrast between two adjacent colours
Parameters…
| Name |
current_colour |
| Description |
The hexadecimal-format colour to be incremented |
| Type |
string |
Returns…
| Description |
The incremented hexadecimal colour |
| Type |
string |
function _get_next_colour($current_colour)
{
$all_of=array_values(array_unique(array('333333','333366','333399','3333CC','3333FF','336633','339933','33CC33','33FF33','663333','993333','CC3333','FF3333','663333','663366','663399','6633CC','6633FF','666633','669933','66CC33','66FF33','993333','993366','93399','9933CC','9933FF','996633','999933','99CC33','99FF33','CC3333','CC3366','CC3399','CC33CC','CC33FF','CC6633','CC9933','CCCC33','CCFF33','FF3333','FF3366','FF3399','FF33CC','FF33FF','FF6633','FF9933','FFCC33','FFFF33','336633','336666','336699','3366CC','3366FF','339933','339966','339999','3399CC','3399FF','33CC33','33CC66','33CC99','33CCCC','33CCFF','33FF33','33FF66','33FF99','33FFCC','33FFFF')));
$key_pos=array_search($current_colour,$all_of);
$next_key_pos=$key_pos+3;
if ($next_key_pos>=count($all_of)) $next_key_pos=$next_key_pos%count($all_of);
return $all_of[$next_key_pos];
}
string _start_svg()
Get the markup required to start a new SVG document
Parameters…
Returns…
| Description |
The markup |
| Type |
string |
function _start_svg()
{
$theme=@method_exists($GLOBALS['FORUM_DRIVER'],'get_theme')?$GLOBALS['FORUM_DRIVER']->get_theme():'default';
if (file_exists(get_custom_file_base().'/themes/'.$theme.'/css_custom/svg.css'))
{
$css_file=get_custom_base_url().'/themes/'.$theme.'/css_custom/svg.css';
$css_file_path=get_custom_file_base().'/themes/'.$theme.'/css_custom/svg.css';
}
elseif (file_exists(get_custom_file_base().'/themes/'.$theme.'/css/svg.css'))
{
$css_file=get_custom_base_url().'/themes/'.$theme.'/css/svg.css';
$css_file_path=get_custom_file_base().'/themes/'.$theme.'/css/svg.css';
}
elseif (file_exists(get_custom_file_base().'/themes/default/css_custom/svg.css'))
{
$css_file=get_custom_base_url().'/themes/default/css_custom/svg.css';
$css_file_path=get_custom_file_base().'/themes/default/css_custom/svg.css';
}
else
{
$css_file=get_base_url().'/themes/default/css/svg.css';
$css_file_path=get_file_base().'/themes/default/css/svg.css';
}
$js_file=str_replace(get_custom_file_base(),get_custom_base_url(),javascript_enforce('javascript'));
global $CSS_FILE_CONTENTS;
$CSS_FILE_CONTENTS=file_get_contents($css_file_path);
return '<'.'?xml version="1.0" ?'.'>
<'.'?xml-stylesheet href="'.escape_html($css_file).'" type="text/css"?'.'>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 '.float_to_raw_string(VIEWPORT_WIDTH).' '.float_to_raw_string(VIEWPORT_HEIGHT).'" preserveAspectRatio="XMinYMin meet" width="'.float_to_raw_string(SVG_WIDTH).'" height="'.float_to_raw_string(SVG_HEIGHT).'" version="1.1">
<script type="text/javascript">// <![CDATA[
if (typeof window.addEventListenerAbstract==\'undefined\') addEventListenerAbstract=function(element,the_event,command,capture)
{
if(element)
{
if (typeof element.simulated_events==\'undefined\') element.simulated_events=[];
if (typeof element.simulated_events[the_event]==\'undefined\') element.simulated_events[the_event]=[];
element.simulated_events[the_event].push(command);
if(typeof element.addEventListener!=\'undefined\')
{
return element.addEventListener(the_event,command,capture);
}
else if(typeof element.attachEvent!=\'undefined\')
{
return element.attachEvent("on"+the_event,command);
}
else return false;
}
else return false;
};
string _finish_svg(string plot)
Get the markup required to finish an SVG document
Parameters…
| Name |
plot |
| Description |
The plot markup to insert first |
| Default value |
|
| Type |
string |
Returns…
| Description |
The markup |
| Type |
string |
function _finish_svg($plot='')
{
return $plot.'</svg>'.chr(10);
}
string _filter_svg_css(string plot)
Take the SVG and make all the styles inline. Disabled as not needed for native SVG implementations
Parameters…
| Name |
plot |
| Description |
The SVG |
| Type |
string |
Returns…
| Description |
... made to have inline styles |
| Type |
string |
function _filter_svg_css($plot)
{
return $plot;
}
string _draw_axes(float max_y, float y_scale, string x_label, string y_label)
Get the markup for a standard pair of axes
Parameters…
| Name |
max_y |
| Description |
Maximum Y value |
| Type |
float |
| Name |
y_scale |
| Description |
Y scale |
| Type |
float |
| Name |
x_label |
| Description |
X axis label |
| Default value |
X axis |
| Type |
string |
| Name |
y_label |
| Description |
Y axis label |
| Default value |
Y axis |
| Type |
string |
Returns…
| Description |
The markup |
| Type |
string |
function _draw_axes($max_y,$y_scale,$x_label='X axis',$y_label='Y axis')
{
$output='';
$prev_i=0;
// Draw Y-axis markers, labels, and background lines
for ($i=1;$i<intval(ceil($max_y))+1;$i++)
{
if (abs($i*$y_scale-$prev_i*$y_scale)>=MIN_Y_MARKER_DISTANCE)
{
$output.='<text x="'.float_to_raw_string(Y_LABEL_WIDTH).'" y="'.float_to_raw_string(PLOT_HEIGHT-($i*$y_scale)+PLOT_HEIGHT_BIAS).'" class="axis_marker_text">'.integer_format($i).'</text>'.chr(10);
$output.='<line x1="'.float_to_raw_string(Y_LABEL_WIDTH+(Y_AXIS_WIDTH/2)).'" y1="'.float_to_raw_string(PLOT_HEIGHT-($i*$y_scale)+PLOT_HEIGHT_BIAS).'" x2="'.float_to_raw_string(Y_LABEL_WIDTH+Y_AXIS_WIDTH).'" y2="'.float_to_raw_string(PLOT_HEIGHT-($i*$y_scale)+PLOT_HEIGHT_BIAS).'" class="axis_marker" />'.chr(10);
$output.='<line x1="'.float_to_raw_string(Y_LABEL_WIDTH+Y_AXIS_WIDTH).'" y1="'.float_to_raw_string(PLOT_HEIGHT-($i*$y_scale)+PLOT_HEIGHT_BIAS).'" x2="'.float_to_raw_string(SVG_WIDTH).'" y2="'.float_to_raw_string(PLOT_HEIGHT-($i*$y_scale)+PLOT_HEIGHT_BIAS).'" class="axis_background_line" />'.chr(10);
$prev_i=$i;
}
}
$output.='<text x="'.float_to_raw_string(Y_LABEL_WIDTH).'" y="'.float_to_raw_string(PLOT_HEIGHT+PLOT_HEIGHT_BIAS).'" class="axis_marker_text">0</text>'.chr(10);
// X axis
$output.='<line x1="'.float_to_raw_string(Y_LABEL_WIDTH).'" y1="'.float_to_raw_string(PLOT_HEIGHT+PLOT_HEIGHT_BIAS).'" x2="'.float_to_raw_string(SVG_WIDTH).'" y2="'.float_to_raw_string(PLOT_HEIGHT+PLOT_HEIGHT_BIAS).'" class="axis_line" />'.chr(10);
// X axis label
$output.='<text x="'.float_to_raw_string(Y_LABEL_WIDTH+Y_AXIS_WIDTH+X_PADDING).'" y="'.float_to_raw_string(PLOT_HEIGHT+X_AXIS_HEIGHT+PLOT_HEIGHT_BIAS).'" class="axis_text">'.escape_html($x_label).'</text>'.chr(10);
// Y axis
$output.='<line x1="'.float_to_raw_string(Y_LABEL_WIDTH+Y_AXIS_WIDTH).'" y1="'.float_to_raw_string(0.0).'" x2="'.float_to_raw_string(Y_LABEL_WIDTH+Y_AXIS_WIDTH).'" y2="'.float_to_raw_string(PLOT_HEIGHT+X_AXIS_HEIGHT+PLOT_HEIGHT_BIAS).'" class="axis_line" />'.chr(10);
// Y axis label
$output.='<text transform="translate('.float_to_raw_string(Y_LABEL_WIDTH).','.float_to_raw_string(PLOT_HEIGHT+PLOT_HEIGHT_BIAS).') rotate(270)" class="axis_text">'.escape_html($y_label).'</text>'.chr(10);
return $output;
}
string _draw_average(float average, float y_scale)
Get the markup for an average line
Parameters…
| Name |
average |
| Description |
Average value |
| Type |
float |
| Name |
y_scale |
| Description |
Y scale |
| Type |
float |
Returns…
| Description |
The markup |
| Type |
string |
function _draw_average($average,$y_scale)
{
if ($average>0.0)
{
// Draw an average line
return '<line x1="'.float_to_raw_string(Y_LABEL_WIDTH+Y_AXIS_WIDTH).'" y1="'.float_to_raw_string(PLOT_HEIGHT-$average*$y_scale+PLOT_HEIGHT_BIAS).'" x2="'.float_to_raw_string(SVG_WIDTH).'" y2="'.float_to_raw_string(PLOT_HEIGHT-$average*$y_scale+PLOT_HEIGHT_BIAS).'" class="average_line" />'.chr(10);
}
return '';
}
string create_bar_chart(array data, string x_label, string y_label, string x_units, string y_units)
Create a bar chart from the specified data and return the SVG markup
Parameters…
| Name |
data |
| Description |
The data to be used in the creation of the bar chart |
| Type |
array |
| Name |
x_label |
| Description |
The X axis label |
| Default value |
X axis |
| Type |
string |
| Name |
y_label |
| Description |
The Y axis label |
| Default value |
Y axis |
| Type |
string |
| Name |
x_units |
| Description |
The X axis units label |
| Default value |
|
| Type |
string |
| Name |
y_units |
| Description |
The Y axis units label |
| Default value |
|
| Type |
string |
Returns…
| Description |
The SVG markup for the described bar chart |
| Type |
string |
function create_bar_chart($data,$x_label='X axis',$y_label='Y axis',$x_units='',$y_units='')
{
if ($x_units!='') $x_label.=' ('.$x_units.')';
if ($y_units!='') $y_label.=' ('.$y_units.')';
// Work out some stats about our graph
$average=0.0;
$max_y=0.0;
foreach ($data as $value)
{
if (is_array($value)) $value=array_shift($value);
if ((is_float($value)?$value:floatval($value))>$max_y) $max_y=is_float($value)?$value:floatval($value);
$average+=$value;
}
$max_x=count($data);
if (count($data)!=0)
{
$average/=count($data);
}
if ($max_y==0.0) $max_y=1.0;
$y_scale=PLOT_HEIGHT/$max_y;
// Start of output
$output=_start_svg();
// Draw bars
$i=0;
$colour='333333';
$plot='';
$labels='';
foreach ($data as $key=>$value)
{
if (is_array($value)) $value=array_shift($value);
$x=Y_LABEL_WIDTH+Y_AXIS_WIDTH+X_PADDING+$i*(X_PADDING+BAR_WIDTH);
$y=PLOT_HEIGHT-$value*$y_scale+PLOT_HEIGHT_BIAS;
$height=(is_float($value)?$value:floatval($value))*$y_scale;
// Bar and label
$plot.='<rect id="'.float_to_raw_string($x).float_to_raw_string($y).'_bar" x="'.float_to_raw_string($x).'" y="'.float_to_raw_string($y).'" width="'.float_to_raw_string(BAR_WIDTH).'" height="'.float_to_raw_string($height).'" style="fill: #'.($colour).';" class="bar_chart" />'.chr(10);
$labels.='<text style="fill: '.(($height==0.0)?'black':'white').'; font-weight: normal" id="'.float_to_raw_string($x).float_to_raw_string($y).'" transform="translate('.float_to_raw_string($x+TEXT_HEIGHT-3).','.float_to_raw_string(PLOT_HEIGHT+PLOT_HEIGHT_BIAS-TEXT_HEIGHT).') rotate(270)" class="bar_chart_text">'.escape_html($key).'</text>
<script type="text/javascript">
<![CDATA[
pageLoaded=true;
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'"),"mouseover",function(event) { if (window.current_bar) window.current_bar.de_clarify(); window.current_bar=this; document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'").setAttribute("style","fill: red; background-color: black; z-index: 999999;"); },false);
document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'").de_clarify=function(event) { document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'").setAttribute("style","fill: '.(($height==0.0)?'black':'white').'"); };
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'"),"focus",function(event) { this.onmouseover(event); },false);
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'_bar"),"mouseover",function(event) { if (window.current_bar) window.current_bar.de_clarify(); window.current_bar=this; document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'").setAttribute("style","fill: red; background-color: black; z-index: 999999;"); },false);
document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'_bar").de_clarify=function(event) { document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'").setAttribute("style","fill: '.(($height==0.0)?'black':'white').'"); };
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'_bar"),"focus",function(event) { this.onmouseover(event); },false);
]]>
</script>'.chr(10);
// Iterate
$i++;
$colour=_get_next_colour($colour);
}
$output.=_draw_axes($max_y,$y_scale,$x_label,$y_label);
$output.=_draw_average($average,$y_scale);
$output.=_finish_svg($plot.$labels);
return _filter_svg_css($output);
}
string create_scatter_graph(array data, string x_label, string y_label, string x_units, string y_units)
Create a scatter graph using the data provided and return the SVG markup
Parameters…
| Name |
data |
| Description |
The data to be used in the creation of the scatter graph |
| Type |
array |
| Name |
x_label |
| Description |
The X axis label |
| Default value |
X Axis |
| Type |
string |
| Name |
y_label |
| Description |
The Y axis label |
| Default value |
Y Axis |
| Type |
string |
| Name |
x_units |
| Description |
The X axis units label |
| Default value |
|
| Type |
string |
| Name |
y_units |
| Description |
The Y axis units label |
| Default value |
|
| Type |
string |
Returns…
| Description |
The SVG markup for the described scatter graph |
| Type |
string |
function create_scatter_graph($data,$x_label='X Axis',$y_label='Y Axis',$x_units='',$y_units='')
{
if (!defined('CROSS_SIZE')) define('CROSS_SIZE',8.0);
if ($x_units!='') $x_label.=' ('.$x_units.')';
if ($y_units!='') $y_label.=' ('.$y_units.')';
// Work out some stats about our graph
$average=0.0;
$max_x=0.0;
$max_y=0.0;
foreach ($data as $value)
{
if (array_key_exists(0,$value)) $value=array_shift($value);
if (is_integer($value['t'])) $value['t']=floatval($value['t']);
if (is_integer($value['value'])) $value['value']=floatval($value['value']);
if ($value['t']>$max_x) $max_x=$value['t'];
if ($value['value']>$max_y) $max_y=$value['value'];
$average+=$value['value'];
}
$average/=count($data);
if ($max_x>0.0) $x_scale=PLOT_WIDTH/$max_x;
else $x_scale=PLOT_WIDTH;
if ($max_y>0.0) $y_scale=PLOT_HEIGHT/$max_y;
else $y_scale=PLOT_HEIGHT;
// Start of output
$output=_start_svg();
// Draw lines
$first=true;
$height_differential_plots=0.0;
$x=0.0;
$prev_x=0.0;
$prev_value=array();
$plot='';
$path_data='';
$labels='';
foreach ($data as $value)
{
if (array_key_exists(0,$value)) $value=array_shift($value);
$x=Y_LABEL_WIDTH+Y_AXIS_WIDTH+X_PADDING+$value['t']*$x_scale;
// Are we too close to the last one?
if (($first) || (abs($x-$prev_x)>MIN_X_MARKER_DISTANCE) || (abs($value['value']-$prev_value['value'])>$value['value']/3))
{
$y=PLOT_HEIGHT-$value['value']*$y_scale+PLOT_HEIGHT_BIAS;
// The line
if (!$first) $path_data.=' ';
$path_data.=float_to_raw_string($x).','.float_to_raw_string($y);
// The cross
$plot.='<line x1="'.float_to_raw_string($x-CROSS_SIZE/2.0).'" y1="'.float_to_raw_string($y-CROSS_SIZE/2.0).'" x2="'.float_to_raw_string($x+CROSS_SIZE/2.0).'" y2="'.float_to_raw_string($y+CROSS_SIZE/2.0).'" class="scatter_graph_marker" />'.chr(10);
$plot.='<line x1="'.float_to_raw_string($x+CROSS_SIZE/2.0).'" y1="'.float_to_raw_string($y-CROSS_SIZE/2.0).'" x2="'.float_to_raw_string($x-CROSS_SIZE/2.0).'" y2="'.float_to_raw_string($y+CROSS_SIZE/2.0).'" class="scatter_graph_marker" />'.chr(10);
// The label
if (($first) || (abs($x-$prev_x)>MIN_X_MARKER_DISTANCE))
{
$labels.='<text id="'.float_to_raw_string($x).float_to_raw_string($y).'" transform="translate('.float_to_raw_string($x+TEXT_HEIGHT/2).','.float_to_raw_string(PLOT_HEIGHT+X_AXIS_HEIGHT+PLOT_HEIGHT_BIAS).') rotate(270)" class="scatter_graph_text">'.escape_html($value['key']).'</text>
<script type="text/javascript">
<![CDATA[
pageLoaded=true;
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'"),"mouseover",function(event) { this.setAttribute("style","fill: red; stroke: red; background-color: black; z-index: 999999;"); },false);
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'"),"mouseout",function(event) { this.setAttribute("style",""); },false);
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'"),"focus",function(event) { this.onmouseover(event); },false);
addEventListenerAbstract(document.getElementById("'.float_to_raw_string($x).float_to_raw_string($y).'"),"blur",function(event) { this.onmouseout(event); },false);
]]>
</script>'.chr(10);
}
}
$prev_x=$x;
$prev_value=$value;
$first=false;
}
$plot.='<polyline points="'.$path_data.'" class="scatter_graph" />'.chr(10);
$output.=_draw_axes($max_y,$y_scale,$x_label,$y_label);
$output.=_draw_average($average,$y_scale);
$output.=_finish_svg($plot.$labels);
return _filter_svg_css($output);
}
string create_pie_chart(array data)
Draw a pie chart with the specified data and return the SVG markup
Parameters…
| Name |
data |
| Description |
The data to be used in the creation of the pie chart |
| Type |
array |
Returns…
| Description |
The SVG markup for the described pie chart |
| Type |
string |
function create_pie_chart($data)
{
if (!defined('PIE_RADIUS')) define('PIE_RADIUS',190.0);
arsort($data);
// Work out some stats about our graph
$_max_degrees=0.0;
foreach ($data as $value)
{
if (is_array($value)) $value=array_shift($value);
$_max_degrees+=$value;
}
$max_degrees=round($_max_degrees);
if (($max_degrees<355.0) || ($max_degrees>365.0)) fatal_exit(do_lang_tempcode('_BAD_INPUT',float_format($max_degrees)));
// Start of output
$output=_start_svg();
$angle=0.0;
$colour='333333';
$data2=array();
$plot='';
foreach ($data as $key=>$value)
{
if (is_array($value)) $value=array_shift($value);
// We're using degrees again
$start_angle=$angle;
$angle+=$value;
$end_angle=$angle;
$plot.=_draw_segment($colour,$value,PIE_RADIUS,PIE_RADIUS+cos(deg2rad($start_angle))*PIE_RADIUS,PIE_RADIUS+sin(deg2rad($start_angle))*PIE_RADIUS,PIE_RADIUS+(cos(deg2rad($end_angle))*PIE_RADIUS),PIE_RADIUS+(sin(deg2rad($end_angle))*PIE_RADIUS));
$colour=_get_next_colour($colour);
$data2[$key]=round(($value/360)*100,1);
}
$output.=_draw_key($data2,'333333',2*PIE_RADIUS+3*X_PADDING,Y_PADDING,'%');
$output.=_finish_svg($plot);
return _filter_svg_css($output);
}
0 reviews: Unrated (average)
There have been no comments yet