COM-FSM
Template:MindTouch > Controls > Chart

Chart

Page last modified 14:15, 31 Oct 2010 by Admin
  • You do not have permissions to view this page - please try logging in.
Table of contents
No 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);
}
Powered by MindTouch Core