Highcharts Stock 實時圖表監控JS

jopen 10年前發布 | 43K 次閱讀 圖表/報表制作 Highcharts

higcharts 是一個圖表展示框架,支持基本圖形,支持靜態、動態等數據,文檔很詳細,實例代碼很多,容易上手,這個JS是我的一個獲取實時動態數據的JS腳本,依賴JQUERY.

第一次加載時從數據庫中抽取監控數據,JS生成昨天及上周同天的對比數據。 每分鐘動態更新圖表。

Highcharts Stock 實時圖表監控JS

var bistock = bistock || {};
$(function () {
var seriesOptions = [], // 歷史對比曲線 0當前,1昨天,7上周 periods = [0, 1, 7], impl,
config, seriesCount = 0,
charts = [], get_data_url = false, update_url = false; impl = {
config_chart: function() { Highcharts.setOptions({ colors: ['#DDDF00', '#058DC7', '#50B432', '#ED561B', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'], global: { useUTC: false } });
},
debug: function(msg, vars) { console.log(msg); if(vars) { $.each(vars, function(i, v) { console.log(i+':'+v); }); } }, /**

     * 生成監控圖表
     * @id 圖表id
     * @div 圖表渲染的div
     */
    generate_chart: function(id, div) {         
        var tmp_count = 0;
        $.ajax({
             type: "get",
             async: false,
             data: {menuid: id},
             url: get_data_url,
             dataType: "json",
             success: function (response) {
                $.each(response.rs, function (series_name, item) {                  
                    // 添加歷史對比數據                     
                    $.each(periods, function (j, period) {                          
                        seriesOptions[seriesCount] = {
                            name: impl.get_series_name(period) + series_name,
                            data: (period === 0) ? item.data : impl.get_series_data(item.data, period),
                            type: 'spline',
                            lineWidth: (seriesCount == 0 || seriesCount == 3) ? 4 : 2
                        };
                        impl.debug("Series info: ", {'name':seriesOptions[seriesCount]['name'], 'number': seriesCount});
                        seriesCount++;
                    });  
                });
                impl.createChart(seriesOptions, div, id);                       
                seriesOptions = [];
                seriesCount = 0;
             },
             error: function(){
                 alert('Fail to render to chart '+id);
             }
         });
    },
    /**
     * 獲取圖表曲線的名稱
     * @period 圖表曲線周期0,1,7
     */
    get_series_name: function (period) {        
        return (period == 0) ? '當天' : ((period == 1) ? '昨天' : '上周同天');
    },
    /**
     * 獲取圖表的數據
     * @data 原始數據
     * @period 圖表曲線周期0,1,7
     */
    get_series_data: function (data, period) {                     
        var new_series_data = [],
            time_offset = period * 86400 * 1000,
            now = (new Date()).getTime();            

        $.each(data, function (i, item) {
            // 刪除某段時間的數據,然后整體偏移.
            var point_data;
            if (item[0]+time_offset < now+8*3600*1000-600*1000) {
                new_series_data[i] = [item[0] + time_offset, item[1]];
            }                
        });         
        return new_series_data;
    },
    /**
     * 動態更新圖表 
    */
    updateChart: function(menuid) {
        setInterval(function() {                                            
            $.ajax({
                    url: update_url,
                    type: 'GET',
                    data: {menuid: menuid},
                    async: false,
                    contentType: "application/json; charset=utf-8",
                    dataType: 'JSON',
                    success: function(response) {                                                   
                        if (!response.rs) {
                            impl.debug('No Data');                          
                            impl.debug("Chart Info: ",{'menuid': menuid, 'time': response.happen_time});
                            return;
                        }

                        impl.debug("Chart Info: ",{'menuid': menuid, 'time': response.happen_time});                        
                        var updateCount = 0;                            
                        $.each(response.data, function(i, items){
                            $.each(items, function(j, item) {                                       
                                impl.debug("Series info: ", {'data': item, 'number': updateCount});
                                charts[menuid].series[updateCount].addPoint(item, true, true);                                  
                                updateCount++;                                  
                            });
                        });
                        updateCount = 0;
                    },
                    cache: false
            });             
        }, 60000);  
    },
    /**
     * 從緩存中讀取歷史數據
     * @id menuid
     * @period 1,7
     * @num 數據序列 0,1,2...
     * @size 曲線的大小
     * @time 當期時間
     * @return 返回一個點的數據
     */
    get_history_point: function(id, period, num, size, time) {                      
        var idx = (size == 1) ? 0 : num;
        var tmp_size = cacheData[id][idx].length;
        // fix the time
        var tmp_point_data = cacheData[id][idx][tmp_size-period*144+1][1];      
        return [time, tmp_point_data];
    },
    rand_point: function(max) {
        var x = (new Date()).getTime(), // current time
            y = Math.round(Math.random() * max);
        return [x,y];
    },
    /**
     * 創建圖表
     * @seriesData 圖表數據
     * @div 渲染到div
     * @id 圖表的唯一id       
     */
    createChart: function (seriesData,div,id) {
        charts[id] = new Highcharts.StockChart({
            chart: {                    
                animation: Highcharts.svg, 
                marginRight: 10,
                renderTo: div,
                events: {
                    load: impl.updateChart(id)
                }
            },              
            colors: (config['colors']) ? config['colors'] : ['#AA4643','#4572A7','#89A54E','#80699B','#3D96AE','#DB843D','#92A8CD','#A47D7C','#B5CA92'],
            rangeSelector: {
                buttons: [{
                    count: 1,
                    type: 'hour',
                    text: '1h'
                },{
                    count: 8,
                    type: 'hour',
                    text: '8h'
                }, {
                    count: 1,
                    type: 'day',
                    text: '1d'
                }, {
                    count: 1,
                    type: 'week',
                    text: '1w'
                },{
                    count: 1,
                    type: 'month',
                    text: '1m'
                },{
                    count: 3,
                    type: 'month',
                    text: '3m'
                },{
                    type: 'all',
                    text: 'All'
                }],
                inputEnabled: false,
                selected: 1
            },
            legend: {
                borderWidth: 0,
                enabled: true
            },
            yAxis: {                   
                min: 0,
                plotLines: [{
                    value: 0,
                    width: 2,
                    color: 'silver'
                }],
                labels: {
                    enabled: config['isEnabled']        
                }
            },

            plotOptions: {
                series: {
                    //compare: 'percent'
                }
            },

            tooltip: {
                pointFormat: config['isEnabled'] 
                                ? '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br />' 
                                : '<span style="color:{series.color}">{series.name}</span><br />',
                valueDecimals: 2
            },

            series: seriesData
        });
    },
    run: function() {       
        impl.config_chart();
        $.each(config['names'], function(i, name){
            impl.generate_chart(name, 'container_'+i);
        });
    }
};
bistock = {
    init: function(vars) {
        config = vars;
        impl.run();
    }
};

});</pre>

來自:http://my.oschina.net/ym80/blog/201324

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!