|
|
ChartFrom $1Table of contentsNo headers/***
USAGE:
Chart(type, data, height, width, xaxis, yaxis, title, min, max, interval, id)
PARAMETERS:
type : str (one of 'circulargauge', 'column', 'multiseriescolumn', 'lineargauge', 'line', 'bar', 'multiseriesbar', 'pie', 'pyramid', or 'funnel')
data : list
(optional) height : num (default: 450)
Height of chart in pixel or percent.
If value is greater or equal to 1, then value represents pixel, otherwise the value is a relative perecentage.
(optional) width : num (default: 450)
Width of chart in pixel or percent.
If value is greater or equal to 1, then value represents pixel, otherwise the value is a relative perecentage.
(optional) xaxis : str (default: 'Y-Axis')
Label for X-Axis.
(optional) yaxis : str (default: 'X-Axis')
Label for Y-Axis.
(optional) title : str (default: 'Title')
Label for chart.
(optional) min : num (default: 0)
Lower bound for Linear Gauge chart type.
(optional) max : num (default: 100)
Upper bound for Linear Gauge chart type.
(optional) interval : num (default: 10)
Major interval for axis markers.
(optional) id : str (default: nil)
ID for chart component. Used for listening for events and interacting with chart through JavaScript.
VERSIONS:
1.0 2-Feb-10 robertm initial version
1.1 4-Mar-10 steveb code clean-up
1.2 29-Mar-10 steveb better handling of error conditions; new default look for progress gauge
1.3 16-Jul-10 steveb fixed inproper data handling for 'pie' type. support for min,max
***/
// GET VARIABLES FROM TEMPLATE CALL
var type = string.tolower($type ?? $0 ?? 'circulargauge');
var data = $data ?? $1 ?? 67;
var height = $height ?? $2 ?? 450;
var width = $width ?? $3 ?? 450;
var xaxis = $xaxis ?? $4;
var yaxis = $yaxis ?? $5;
var title = $title ?? $6;
var min = $min ?? $7;
var max = $max ?? $8;
var interval = $interval ?? $9 ?? 10;
var id = $id ?? $10;
var error;
// TODO (steveb): validate the 'data' field
// TODO (steveb): enable/disable animation
// format settings
let settings_xml = <settings>
<animation enabled="True"/>
</settings>;
// format axis
var axes_xml = <axes>
<x_axis>
<title enabled=(xaxis is not nil)>
<text> xaxis </text>
</title>
<labels>
<format> "{%Value}{numDecimals:0}" </format>
</labels>
</x_axis>
<y_axis position=((type == 'bar' || type == 'multiseriesbar') ? "opposite" : nil)>
<title enabled=(yaxis is not nil)>
<text> yaxis </text>
</title>
<labels>
<format> "{%Value}{numDecimals:0}" </format>
</labels>
<scale major_interval=(interval) minor_interval=(interval / 4) minimum=(min) maximum=(max) />
</y_axis>
</axes>;
// set defaults for min-max
let min = min ?? 0;
let max = max ?? 100;
// format data
var data_xml;
if((type != 'pie') && data is map) {
let data_xml = <data>
foreach (var series:points in data) {
<series name=(series)>
foreach (var p in points) {
foreach(var label:value in p) {
<point y=(value) name=(label)>
<tooltip enabled="true">
<format> "{%SeriesName} ({%Name}) - {%Value}" </format>
</tooltip>
</point>
}
}
</series>
}
</data>;
} else if(data is list) {
let data_xml = <data>
<series name="Series 1">
foreach(var d in data) {
foreach(var label:value in d) {
<point y=(value) name=(label) />
}
}
</series>
</data>;
}
// CHART BUILDS
var chart;
switch (type) {
// SINGLE-SERIES COLUMN CHART, INCOMING DATA MUST BE FORMATTED AS [{label1:value1}, {label2:value2}, {label3:value3}]
// MULTI-SERIES COLUMN CHART, INCOMING DATA MUST BE FORMATTED AS {series1:[{label1:value1}, {label2:value2}, {label3:value3}], series2:[{label1:value1}, {label2:value2}, {label3:value3}], series3:[{label1:value1}, {label2:value2}, {label3:value3}]}
case 'column':
case 'multiseriescolumn':
case 'bar':
case 'multiseriesbar':
// determine layout value
var layout;
switch(type) {
case 'column':
case 'multiseriescolumn':
let layout = "CategorizedVertical";
case 'bar':
case 'multiseriesbar':
let layout = "CategorizedHorizontal";
}
// generate chart xml
let chart = <anychart>
settings_xml;
<charts>
<chart plot_type=(layout)>
<data_plot_settings default_series_type="Bar" enable_3d_mode="true" z_aspect="0.25">
<bar_series group_padding="0.2" >
<tooltip_settings enabled="true"/>
</bar_series>
</data_plot_settings>
<chart_settings>
<title enabled=(title is not nil)>
<text> title </text>
</title>
// check if we plotting a series of data points
if(data is map) {
<legend enabled="true" position="Bottom" align="Spread" ignore_auto_item="true" padding="15">
<format> "{%Icon} {%Name}" </format>
<title enabled="false"/>
<columns_separator enabled="true"/>
<background>
<inside_margin left="10" right="10"/>
</background>
<items>
<item source="Series"/>
</items>
</legend>
}
axes_xml;
</chart_settings>
data_xml;
</chart>
</charts>
</anychart>;
// MULTI-SERIES LINE CHART, INCOMING DATA MUST BE FORMATTED AS {series1:[{label1:value1}, {label2:value2}, {label3:value3}, {label4:value4}], series2:[{label1:value1}, {label2:value2}, {label3:value3}, {label4:value4}], series3:[{label1:value1}, {label2:value2}, {label3:value3}, {label4:value4}]}
case "line":
let chart = <anychart>
settings_xml;
<charts>
<chart plot_type="CategorizedVertical">
<chart_settings>
<title enabled=(title is not nil)>
<text> title </text>
</title>
<legend enabled="true">
<title enabled="false"/>
</legend>
axes_xml;
</chart_settings>
<data_plot_settings default_series_type="Spline">
<line_series>
<marker_settings>
<marker size="8"/>
<states>
<hover>
<marker size="12"/>
</hover>
</states>
</marker_settings>
<tooltip_settings enabled="True"/>
</line_series>
</data_plot_settings>
data_xml;
</chart>
</charts>
</anychart>;
//3D PIE CHART, DATA VARIABLE MUST BE FORMATTED AS {name1:value1, name2:value2, name3:value3}
case 'pie':
let chart = '<anychart>
settings_xml;
<charts>
<chart plot_type="Pie">
<data_plot_settings enable_3d_mode="true">
<pie_series>
<tooltip_settings enabled="true">
<format>
{%Name} : {%Value}{numDecimals:0} ({%YPercentOfSeries}{numDecimals: 0}%)
</format>
</tooltip_settings>
<label_settings enabled="true">
<background enabled="false"/>
<position anchor="Center" valign="Center" halign="Center" padding="20"/>
<font color="White">
<effects>
<drop_shadow enabled="true" distance="2" opacity="0.5" blur_x="2" blur_y="2"/>
</effects>
</font>
<format>{%YPercentOfSeries}{numDecimals:0}%</format>
</label_settings>
</pie_series>
</data_plot_settings>
<data>
<series name="Series 1" type="Pie">'
.. (
foreach (var name:y in data) {
'<point name="' .. name .. '" y="' .. y .. '"/>'
}
) ..
'</series>
</data>
<chart_settings>
<title enabled="true" padding="15">
<text>' .. title .. '</text>
</title>
<legend enabled="true" position="Bottom" align="Spread" ignore_auto_item="true" padding="15">
<format>{%Icon} {%Name} - {%YValue}{numDecimals:0}</format>
<title enabled="false"/>
<columns_separator enabled="false"/>
<background>
<inside_margin left="10" right="10"/>
</background>
<items>
<item source="Points"/>
</items>
</legend>
</chart_settings>
</chart>
</charts>
</anychart>';
// PYRAMID/FUNNEL CHART, DATA VARIABLE MUST BE FORMATTED AS {label1:value1, label2:value2, label3:value3}
case 'pyramid':
case 'funnel':
var ispyramid = (type == 'pyramid');
let chart = <anychart>
settings_xml;
<charts>
<chart plot_type="Funnel">
<chart_settings>
<title enabled=(title is not nil)>
<text> title </text>
</title>
<data_plot_background enabled="false" />
<legend enabled="false" />
</chart_settings>
<data_plot_settings enable_3d_mode="true">
<funnel_series inverted=(ispyramid) neck_height=(ispyramid ? 0 : nil) fit_aspect="1" min_width=(ispyramid ? 0 : nil) padding=(ispyramid ? 0 : nil) mode="Square">
<animation enabled="true" type="Appear" show_mode="Smoothed" start_time="0.3" duration="1.3" interpolation_type="Cubic"/>
<connector enabled="true" color="Black" opacity="0.4"/>
<tooltip_settings enabled="true">
if(ispyramid) {
<position anchor="CenterRight" padding="10" valign="Center" halign="right"/>
}
<format> "{%Name} - {%YValue}{numDecimals:0}" </format>
</tooltip_settings>
<label_settings enabled="true">
<animation enabled="true" type="Appear" show_mode="Smoothed" start_time="0.3" duration="1.3" interpolation_type="Cubic"/>
if(ispyramid) {
<position anchor="Center" valign="Center" halign="Center" padding="10"/>
} else {
<position anchor="center" padding="50"/>
}
<format> "{%Name} - {%YValue}{numDecimals:0}" </format>
<background enabled="true">
<corners type="Rounded" all="3"/>
</background>
<states>
<hover>
<background>
<border type="Solid" color="DarkColor(%Color)" thickness="2"/>
</background>
</hover>
<pushed>
<background>
<border type="Solid" color="#494949" thickness="2" opacity="0.7"/>
</background>
</pushed>
<selected_hover>
<background>
<border type="Solid" color="DarkColor(%Color)" thickness="2" opacity="0.7"/>
</background>
</selected_hover>
<selected_normal>
<background>
<border type="Solid" color="DarkColor(%Color)" thickness="2"/>
</background>
</selected_normal>
</states>
</label_settings>
<funnel_style>
<border color="Black" opacity="0.05"/>
<states>
<hover>
<fill color="%Color"/>
<hatch_fill enabled="true" type="Percent50" color="White" opacity="0.3"/>
</hover>
<selected_hover>
<fill color="%Color"/>
<hatch_fill type="Checkerboard" color="#404040" opacity="0.1"/>
</selected_hover>
<selected_normal>
<fill color="%Color"/>
<hatch_fill type="Checkerboard" color="Black" opacity="0.1"/>
</selected_normal>
</states>
</funnel_style>
<marker_settings enabled="true">
<marker type="None" anchor="Center" v_align="Center" h_align="Center" size="12"/>
<fill color="Yellow"/>
<border color="DarkColor(Yellow)"/>
<states>
<hover>
<marker type="Star5"/>
</hover>
<pushed>
<marker type="Star5" size="8"/>
</pushed>
<selected_hover>
<marker type="Star5" size="14"/>
</selected_hover>
<selected_normal>
<marker type="Star5"/>
</selected_normal>
</states>
</marker_settings>
</funnel_series>
</data_plot_settings>
data_xml;
</chart>
</charts>
</anychart>;
// CIRCULAR GAUGE CHART, DATA VARIABLE MUST BE A NUMBER
case 'circulargauge':
let chart = <anychart>
settings_xml;
<margin all="0"/>
<gauges>
<gauge>
<chart_settings>
<title enabled=(title is not nil)>
<text> title </text>
</title>
<chart_background>
<border enabled="false"/>
</chart_background>
</chart_settings>
<circular name="data">
<axis radius="37" start_angle="85" sweep_angle="190" size="3">
<labels align="Outside" padding="6">
<format> "{%Value}{numDecimals:0}" </format>
</labels>
<scale_bar>
<fill color="#292929"/>
</scale_bar>
<major_tickmark align="Center" length="10" padding="0"/>
<minor_tickmark enabled="false"/>
<color_ranges>
<color_range start=(min) end=(max) align="Inside" start_size="15" end_size="15" padding="6">
<fill type="Gradient">
<gradient>
<key color="Red"/>
<key color="Yellow"/>
<key color="Green"/>
</gradient>
</fill>
<border enabled="true" color="Black" opacity="0.4"/>
</color_range>
</color_ranges>
</axis>
<frame>
<inner_stroke enabled="false"/>
<outer_stroke enabled="false"/>
<background>
<fill type="Gradient">
<gradient angle="45">
<key color="#FDFDFD"/>
<key color="#F7F3F4"/>
</gradient>
</fill>
<border enabled="true" color="#A9A9A9"/>
</background>
<effects enabled="false"/>
</frame>
<pointers>
<pointer value=(data) name="value">
<label enabled="true" under_pointers="true">
<position placement_mode="ByPoint" x="50" y="60"/>
<format> "{%Value}{numDecimals:0}%" </format>
<background enabled="false"/>
</label>
<needle_pointer_style thickness="7" point_thickness="5" point_radius="3">
<fill color="Rgb(230,230,230)"/>
<border color="Black" opacity="0.7"/>
<effects enabled="true">
<bevel enabled="true" distance="2" shadow_opacity="0.6" highlight_opacity="0.6"/>
<drop_shadow enabled="true" distance="1" blur_x="1" blur_y="1" opacity="0.4"/>
</effects>
<cap>
<background>
<fill type="Gradient">
<gradient type="Linear" angle="45">
<key color="#D3D3D3"/>
<key color="#6F6F6F"/>
</gradient>
</fill>
<border color="Black" opacity="0.9"/>
</background>
<effects enabled="true">
<bevel enabled="true" distance="2" shadow_opacity="0.6" highlight_opacity="0.6"/>
<drop_shadow enabled="true" distance="1.5" blur_x="2" blur_y="2" opacity="0.4"/>
</effects>
</cap>
</needle_pointer_style>
<animation enabled="true" start_time="0" duration="0.7" interpolation_type="Sine"/>
</pointer>
</pointers>
</circular>
</gauge>
</gauges>
</anychart>;
// LINEAR GAUGE, DATA VARIABLE MUST BE A NUMBER
case 'lineargauge':
let chart = <anychart>
settings_xml;
<margin all="0"/>
<gauges>
<gauge>
<chart_settings>
<title>
<text> title </text>
</title>
<chart_background>
<border enabled="false"/>
</chart_background>
</chart_settings>
<linear name="data">
<axis size="0" position="50">
<scale minimum=(min) maximum=(max) major_interval=(interval) minor_interval=(interval / 4) />
<scale_bar enabled="false"/>
<labels padding="5"/>
<color_ranges>
<color_range start=(min) end=(max) align="Outside" padding="0" start_size="8" end_size="8">
<fill type="Gradient">
<gradient angle="90">
<key color="Red"/>
<key color="Yellow"/>
<key color="Green"/>
</gradient>
</fill>
<border enabled="true" type="Solid" color="Black" opacity="0.4"/>
</color_range>
</color_ranges>
</axis>
<pointers>
<pointer type="Marker" value=(data) name="value" color="#4662B0">
<tooltip enabled="true"/>
<marker_pointer_style align="Outside" padding="5" width="10" height="10"/>
<animation enabled="true" start_time="0" duration="1" interpolation_type="Elastic"/>
<label enabled="true">
<position placement_mode="ByAnchor" valign="Center" halign="Right" padding="45"/>
<format> "{%Value}{numDecimals:0}%" </format>
<background enabled="false"/>
</label>
</pointer>
</pointers>
</linear>
</gauge>
</gauges>
</anychart>;
default:
if(!error) {
let error = "Invalid chart type selected (did not recognize '" .. type .. "')";
}
}
// check if there was an error
if(error) {
<p style="color: red"> error </p>
} else {
anychart(chart, width, height, id);
}
Tags: (Edit tags)
|
Powered by MindTouch Core |
Disclaimer: Vespa Labs contains information that is VERY likely to wreck your scooter and possibly yourself both intentionally (i.e. gaining more peformance while sacrificing reliability + safety) and unintentionally (i.e. misleading or incorrect information). Vespa Labs is only a wiki and intended as a dumping ground for information and not as a properly reviewed source. The same disclaimers that wikipedia.org use apply to Vespa Labs. The short version is use information at your own risk, both information on the main wiki and in the user areas are intended to be used only as "thought provoking" for someone that knows what they are doing. If you try to implement a "thought" Vespa Labs is not reponsible and if something goes wrong we hope that you live and update the offending information with corrections to warn others.
Vespa Labs is an international site and therefore may contain information that is not road legal in some countries/states and may also invalidate insurance policies. Treat all information as experimental and for "race use only" (i.e. not for road use - even if it is implied or explicitly stated). Refer to and adhere to your local road and legal rules, as well as the manufacturers recommendations.