highcharts

1、Highcharts  series屬性

一、下面是一個基本曲線圖的例子:javascript

複製代碼
<html>
<head>
<meta charset="UTF-8" />
<title>Highcharts 曲線圖</title>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
</head>
<body>
<div id="container" style="width: 550px; height: 400px; margin: 0 auto"></div>
<script language="JavaScript">
$(document).ready(function() {
   var title = {
      text: '城市平均氣溫'   
   };
   var subtitle = {
      text: ''
   };
   var xAxis = {
      categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
         'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
   };
   var yAxis = {
      title: {
         text: 'Temperature (\xB0C)'
      },
      plotLines: [{
         value: 0,
         width: 1,
         color: '#808080'
      }]
   };   

   var tooltip = {
      valueSuffix: '\xB0C'
   }

   var legend = {
      layout: 'vertical',
      align: 'right',
      verticalAlign: 'middle',
      borderWidth: 0
   };

   var series =  [
      {
         name: 'Tokyo',
         data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2,
            26.5, 23.3, 18.3, 13.9, 9.6]
      }, 
      {
         name: 'New York',
         data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8,
            24.1, 20.1, 14.1, 8.6, 2.5]
      },
      {
         name: 'London',
         data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 
            16.6, 14.2, 10.3, 6.6, 4.8]
      }
   ];

   var json = {};

   json.title = title;
   json.subtitle = subtitle;
   json.xAxis = xAxis;
   json.yAxis = yAxis;
   json.tooltip = tooltip;
   json.legend = legend;
   json.series = series;

   $('#container').highcharts(json);
});
</script>
</body>
</html>
複製代碼

 

例中有highcharts的經常使用屬性,主要是series數據列。series用於設置圖表中要展現的數據相關的屬性,參數以下:css

 參數  描述 默認值
data

顯示在圖表中的數據列,能夠爲數組或者JSON格式的數據。html

如:data:[0, 5, 3, 5],或 data: [{name: 'Point 1',y: 0}, {name: 'Point 2',y: 5}]java

''
name 顯示數據列的名稱 ''
type 數據列類型,支持 area, areaspline, bar, column, line, pie, scatter or spline line

     

 

 

 

 

 

2、Highcharts基本設置

2.1 在一個圖像中有多條曲線,可是默認想只顯示第一條曲線,則須要作以下設置:jquery

複製代碼
chart: {  
            renderTo: 'container1',  
            type: 'line',  
            events: {  
                load: function (event) {  
                    for (var i = this.series.length - 1; i > 0; i--) {  
                        this.series[i].hide();        //設置只顯示第一條線,其餘都不顯示  
                    }  
                }  
            }  
        }  
複製代碼

2.2 去掉highcharts網站urlajax

右下角默認會有一個其網站url存在,這會影響美觀,作以下設置便可去掉:json

credits: {  
            enabled: false     //不顯示LOGO 
        }  

或者  在 highcharts.js 中 Ctrl+F 搜索 credits屬性,設置  enabled: false 數組

2.3 動態增長曲線數量瀏覽器

在顯示曲線後動態增長顯示曲線條數:服務器

複製代碼
var chart = new Highcharts.Chart(options);  
chart.addSeries({  
            name: '合計',  
            data: [61, 63, 65, 67, 69, 71, 73, 70, 67, 64, 61, 57]  
        });  
或  
  
chart.addSeries({ name: 'DataURL serie', dataURL: 'serie3.txt' });  
複製代碼

2.4 動態刪除曲線

chart.series[0].remove();  

3、Highcharts 點擊

複製代碼
$(function () {
    // create the chart
    $('#container').highcharts({
        chart: {
            events: {
                addSeries: function() {
                    var label = this.renderer.label('A series was added, about to redraw chart', 100, 120)
                        .attr({
                            fill: Highcharts.getOptions().colors[0],
                            padding: 10,
                            r: 5,
                            zIndex: 8
                        })
                        .css({
                            color: '#FFFFFF'
                        })
                        .add();
 
                    setTimeout(function () {
                        label.fadeOut();
                    }, 1000);
                }
            }
        },
 
        xAxis: {
            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        },
 
        series: [{
            data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
        }]
    });
 
 
    // activate the button
    $('#button').click(function() {
        var chart = $('#container').highcharts();
 
        chart.addSeries({
            data: [216.4, 194.1, 95.6, 54.4, 29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5]
        });
 
        $(this).attr('disabled', true);
    });
});
複製代碼

效果圖:

       

4、圖表數據動態更新

在實際使用highcharts時,數據不是手寫的,常常是動態賦值data。

4.1 隨機數據點

chart.events屬性中添加 load 方法(圖表加載事件),每秒(1000ms)隨機產生數據點並生成圖表。

複製代碼
<script>
   Highcharts.setOptions({ global: { useUTC: false } });
   var chart11 = new Highcharts.Chart({
       chart: {
           renderTo: 'container11',
           type: 'spline',
           events: {
               load: function () {
                    var series = this.series[0];
                    setInterval(function () {
                      var x = (new Date()).getTime(), // current time
                          y = Math.random();
                     series.addPoint([x, y], true, true);
                     }, 1000);
                }
             }
      },
     title: {
         text: '實時溫度'
     },
     subtitle: {
         text: " "
     },
     xAxis: {
        type: 'datetime',
        dateTimeLabelFormats: {
                   day: '%H : %M'
             }
     },
     yAxis: {
        labels: {
           ormat: '{value} .00',
           style: {
           color: Highcharts.getOptions().colors[0]
           }
         },
     title: {
        text: '溫度:攝氏度',
        style: {
            color: Highcharts.getOptions().colors[0]
           }
         },
     startOnTick: true, //爲true時,設置min纔有效
     min: 0,
     plotLines: [{
            value: 0,
            width: 1,
            color: 'black'
          }]
     },
     tooltip: {
          formatter: function () {
                return '<b>' + this.series.name + '</b><br/>' + Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' + '<span style="color:#08c">' + Highcharts.numberFormat(this.y, 2) + ' 攝氏度' + '</span>';
              }
     },
     legend: {
          enabled: true
     },
     exporting: {
          enabled: false
     },
     series: [{
          type: 'spline',
          name: '溫度',
          data: (function () {
                    var data = [],  time = (new Date()).getTime(),  i;
         //  圖表初始的時候顯示10個數據點(都是0)
                    for (i = -9; i <= 0; i++) {      // time是當前時間,故顯示的10個數據點的x軸時間是當前時間以前的,故 i 爲負
                        data.push({
                            x: time + i * 1000,
                            y: 0
                          });
                        }
                   return data;
          })()
     }]

  });

</script>
複製代碼

           

4.2 在原有數據的基礎上改變數據

向HighChart中添加data series,方法:chart.addseries({},trur/false);     true:重繪   false:不重繪

eg: 添加name爲gloomyfish的數據列。

chart.addSeries({                       

                 id:1,

                 name:"gloomyfish",

                 data:[1,2,3]

             },true);

下面是使用時的例子:

複製代碼
<script>
    Highcharts.setOptions({ global: { useUTC: false } });
    var chart21 = new Highcharts.Chart({
        chart: {
            renderTo: 'container21',
            type: 'spline',
            marginRight: 10
        },
        title: {
            text: '歷史溫度'
        },
        subtitle: {
            text: " "
        },
        credits: {
            enabled: false
        },
        xAxis: {
            type: 'linear'
        },
        yAxis: {
            title: {
                text: '攝氏度'
            },
            startOnTick: true,   //爲true時,設置min纔有效
            min: 0,
            plotLines: [{
                value: 0,
                width: 1,
                color: '#808080'
            }]
        },
        legend: {
            enabled: true
        },
        exporting: {
            enabled: false
        },
        series: [{
            name:"11",
            data:[1,2,3,4,5,6,7]
        }]

    });

    var yVal=[1,2,3,4,5,6,7];
    setInterval(function(){

        chart21.addSeries({        //添加數據列 
            name:"歷史溫度",
            data:yVal
        },true);     
},1000);

</script>
複製代碼

效果:

     

能夠發現,上一秒添加的數據仍是存在,在查閱資料後發現,要使用 remove() 方法來移除上一秒添加的數據:

複製代碼
var yVal=[1,2,3,4,5,6,7];
    setInterval(function(){

        chart21.addSeries({        //添加數據列
            name:"歷史溫度",
            data:yVal
        },true);
chart21.series[0].remove(); //移除
},1000);
複製代碼

這樣修改後的效果:

         

上面是每秒添加固定的數據[1,2,3,4,5,6,7],如今稍做修改,每秒添加變化的數據,以下所示,   yVal[i]=yVal[i]+i;  每次添加數據時數組數據改變

複製代碼
var yVal=[1,2,3,4,5,6,7];
    setInterval(function(){      
  
        for(var i =0;i<7;i++){     // 數組有7個元素
            yVal[i]=yVal[i]+i;
        }

        chart21.addSeries({        //添加數據列
            name:"歷史溫度",
            data:yVal
        },true);

        chart21.series[0].remove();   //移除

    },1000);
複製代碼

圖1是原始數據[1,2,3,4,5,6,7],圖2是i=0時[1,3,5,7,9,11,13] ,圖3是i=1時[1,4,7,10,13,16,19] .......

       

而後,在這裏,我發現若是不把前面的數據移除,所得的圖仍是挺好看的,呵呵

 

4.3 異步動態讀取數據

way1:使用Jquery的Ajax方式,調用後臺得到數據,而後進行綁定的。

(1)在腳本函數裏面,初始化一個chart對象,並把series數據data設置爲空:

series: [{
                    type: 'pie',
                    name: '人員數量',
                    data: []
                }]

(2)經過Ajax調用後臺鏈接得到數據,而後綁定到具體的屬性上

複製代碼
 //經過Ajax獲取圖表1數據
            $.ajaxSettings.async = false;
            var data1 = [];
            $.getJSON("/User/GetCompanyUserCountJson", function (dict) {                
                for (var key in dict) {
                    if (dict.hasOwnProperty(key)) {
                        data1.push([key, dict[key]]);
                    }
                };
                chart1.series[0].setData(data1);
            });
複製代碼

(3)頁面上寫個div,設置id="container1"來放置圖表

<div id="container1" style="height: 300px;max-width:500px"></div>

way2:簡例(Highcharts之動態刷新——結合後臺數據)

複製代碼
$(function(){
    $(document).ready(function() {
      Highcharts.setOptions({
        global: {
          useUTC: false//是否使用世界標準時間
        }
      });
      var chart;
      chart = new Highcharts.Chart({
        chart: {
          renderTo: 'container',
          type: 'spline',
          marginRight: 10,
          events: {
            load: function() {
               var series = this.series;
               setInterval(function() {
                 var result = reload();
                 var x = result.time;
                 for(var i=0; i<series.length; i++) {
                   var y = result.y[i];
                   series[i].addPoint([x, y], true, true);
                 }
               }, 1000*5);
            }
          }
        },
        title: {
          text: 'ssssss'
        },
        xAxis: {
          type: 'datetime',
          tickPixelInterval: 150
        },
        yAxis: {
          title: {
            text: 'Value'
          },
          plotLines: [{
            value: 0,
            width: 1,
            color: '#808080'
          }]
        },
        tooltip: {
          formatter: function () {
            return '<b>' + this.series.name + '</b><br/>' +
        Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
        Highcharts.numberFormat(this.y, 2);
          }
        },
        //圖例屬性
        legend: {
          layout: 'vertical',
          align: 'right',
          verticalAlign: 'top',
          borderWidth: 0
      },
        exporting: {
          enabled: false
        },
        series: create()     //series屬性是一個js函數的返回值,需用「js函數名()」來取得
      });
    });

function create() {   var series = new Array();     $.ajax({    type: "POST",    url: "xxxx/yyyyy.json",    async: false, //表示同步,若是要獲得ajax處理完後臺數據後的返回值,最好這樣設置    success: function(result){     var channels = result.key;     var size = channels.length;     for(var i=0; i<size; i++) {      var name = channels[i].yyyy;      var perTotalCnt = channels[i].xxxx;      var data = function() {       var data = [],        time = result.time,        i;       for(i=-6; i<=0; i++) {        data.push({         x: aaaa,         y: zzzz        });       }             return data;      }();      series.push({"name": name, "data": data});     }    }   }, false); //false表示「遮罩」,前臺不顯示「請稍後」進度提示   alert(series);     return series;    }
  });
複製代碼

way3:簡例(異步動態讀取數據)

複製代碼
$(function () {
   var chart_validatestatics;
   $(document).ready(function () {
    var options_validatestatics = {
     chart: {
      renderTo: 'container_validatestatics',
      type: 'column'
     },
     title: {
      text: '驗票分析'
     },
     subtitle: {
      text: 'tourol.cn'
     },
     xAxis: {
    },
    yAxis: {
     title: {
      text: '人數'
     }
    },
    plotOptions: {
     bar: {
      dataLabels: {
       enabled: true
      }
     }
    },
    tooltip: {
     formatter: function () {
      return '<b>' + this.x + '</b><br/>' + this.series.name + ': ' + this.y + '人';
     }
    },
    credits: {
     enabled: false
    },
    series: [{
     name: "驗票用戶",
     width: 3
    }]
   }
   $.get("/ajaxhandler/dataupdate.ashx?operate_type=validatestatics", function (data) {
    var xatrnames = [];
    var yvalidators = [];
    for (var i = 0; i < data.rows.length; i++) {
     xatrnames.push([
       data.rows[i].atrname
      ]);
     yvalidators.push([
       data.rows[i].atrname,
       parseInt(data.rows[i].nums)
      ]);
    }
    alert(xatrnames + yvalidators);
    options_validatestatics.xAxis.categories = xatrnames
    options_validatestatics.series[0].data = yvalidators;
    chart_validatestatics = new Highcharts.Chart(options_validatestatics);
   });
  });
 });
複製代碼

要注意的是:x軸數組定義好後,定義y軸數據的時候要把對應在x軸上的值也push到數組裏,否則會沒法顯示。

對應的在ajax handler中,拼接字符串並返回便可:

複製代碼
string json = "{\"rows\":[";
  for (int i = 0; i < datas.Rows.Count; i++)
  {
   json += "{\"atrname\":\"" + datas.Rows[i]["name"] + "\",\"nums\":\"" + datas.Rows[i]["nums"] + "\"},";
  }
  json = json.TrimEnd(',');
  json += "]}";
  context.Response.Write(json);
  context.Response.Flush();
  context.Response.End();
複製代碼

4.4 同步獲取數據

使用 Websocket 與服務器創建 TCP 鏈接以後,會一直鏈接,瀏覽器和服務器直接能夠數據相互傳送。

在應用 Websocket 以前,咱們能夠先結合前面的動態隨機數據想一想,若是把數據點的Y值換成了從服務器接收的數據就能夠畫出接收的數據。

複製代碼
<script>
    Highcharts.setOptions({ global: { useUTC: false } });
    var chart21 = new Highcharts.Chart({
        chart: {
            renderTo: 'container21',
            type: 'spline'
        },
        title: {
            text: '歷史溫度'
        },
        subtitle: {
            text: " "
        },
        credits: {
            enabled: false
        },
        xAxis: {
            type: 'datetime',
            dateTimeLabelFormats: {
                day: '%H : %M'
            }
        },
        yAxis: {
            labels: {
                format: '{value} .00',
                style: {
                    color: Highcharts.getOptions().colors[0]
                }
            },
            title: {
                text: '溫度:攝氏度',
                style: {
                    color: Highcharts.getOptions().colors[0]
                }
            },
            startOnTick: true,   //爲true時,設置min纔有效
            min: 0,
            plotLines: [{
                value: 0,
                width: 1,
                color: '#808080'
            }]
        },
        tooltip: {
            formatter: function () {
                return '<b>' + this.series.name + '</b><br/>' +
                        Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' + '<span style="color:#08c">' +
                        Highcharts.numberFormat(this.y, 2) + ' 攝氏度' + '</span>';
            },
            crosshairs: true
        },
        legend: {
            enabled: true
        },
        exporting: {
            enabled: false
        },
        series: [{
            type: 'spline',
            name: '實時溫度',
            //data: [0,0]
            data: (function () {
                var data = [],
                        time = (new Date()).getTime(),
                        i;

                for (i = -9; i <= 0; i++) {
                    data.push({
                        //x: time + i * 1000,
                        x: time,
                        y: 0
                    });
                }
                return data;
            })()

        }]

    });

    setInterval(function(){
        var x;
        var y;
        x = (new Date()).getTime();     // 當前時間
        y = Math.random();
        chart21.series[0].addPoint([x, y], true, true);     //追加點並去掉一個點         //chart1.series[0].addPoint([x, y]);追加點( 不去掉點 )
    },1000);

</script>
複製代碼

改寫setInterval()函數,把Y值替換成val

因爲下面的代碼是直接從作過的項目中copy過來的,看的時候有的地方出現的有點突兀,不用理會,只看y值的改變就行了。

複製代碼
 function myChart(val) {
        var x;
        var y;
        x = (new Date()).getTime();     // 當前時間
        y = val;//Math.random();
  
        chart1.series[0].addPoint([x, y], true, true);     //追加點並去掉一個點         //chart1.series[0].addPoint([x, y]);追加點( 不去掉點 )

    }

function ParseValue(val) { var data = JSON.parse(val); //字符串轉換爲對象

var v = document.getElementById("device").innerHTML; if (v == data.device_id) { if (data.device_id > 9) { switch (data.value) { case 0: document.getElementById("vd").innerHTML = "關閉"; break; case 1: document.getElementById("vd").innerHTML = "打開"; break; case 2: document.getElementById("vd").innerHTML = "中止"; break; default: } } else { document.getElementById("vd").innerHTML = data.value; } } if (v == data.device_id) { if (data.device_id < 10) { myChart(data.value); } else { document.getElementById("container1").hidden(); } } }
複製代碼

固然,在這以前還要創建TCP鏈接:

複製代碼
<script>
    var ws;
    var SocketCreated = false;
    var isUserloggedout = false;

    window.onload = function Connect() {
        if (SocketCreated && (ws.readyState == 0 || ws.readyState == 1)) {
            //(SocketCreated = false)&&(鏈接未創建)。。。。readyState屬性表示ReadOnly屬性的狀態。等於0或者1表示鏈接未創建
            SocketCreated = false;
            isUserloggedout = true;
            ws.close();
        } else {
            //alert("準備鏈接到服務器 ...");
            document.getElementById("wsServerStatus").innerHTML = "準備鏈接到服務器 ...";
            try {
                if ("WebSocket" in window) {
                    ws = new WebSocket("ws://192.168.1.108:2012");
                }
                else
                if("MozWebSocket" in window) {
                    ws = new MozWebSocket("ws://192.168.1.108:2012");
                }
                SocketCreated = true;
                isUserloggedout = false;
            } catch (ex) {
                alert(ex, "ERROR");
                return;
            }
            ws.onopen = WSonOpen;
            ws.onmessage = WSonMessage;
            ws.onclose = WSonClose;
            ws.onerror = WSonError;
        }
    };

    function WSonOpen() {
        ServerStatus = true;
        document.getElementById("wsServerStatus").innerHTML = "鏈接已創建";
        Login();
    };

    function Login() {
        var loginBody = { account: "", pass_word: "" };
        loginBody.account = "11111111111";
        loginBody.pass_word = "1111";
        var body = JSON.stringify(loginBody);

        var loginReq = { key: "/user/login", token: "", type: 1, body: body };

        ws.send(JSON.stringify(loginReq));
    }

    function WSonMessage(event) {
        var msg = JSON.parse(event.data);
        switch (msg.key) {
            case "/device/data":
            case "/device/status":
                var n = document.getElementById("content-main").childElementCount;
                for (var i = 1; i < n; i++) {
                try{
                    var m = document.getElementById("content-main").children[i];
                    m.contentWindow.ParseValue(msg.body);
                }catch(err){
                }
            }
            break;
        }
    };

    function WSonClose() {
        ServerStatus = false;
        document.getElementById("wsServerStatus").innerHTML = "鏈接已關閉";
    };

    function WSonError() {
        ServerStatus = false;
        document.getElementById("wsServerStatus").innerHTML = "遠程鏈接中斷";
    };

    function WsSend(val) {
        ws.send(val);
    }

</script>
複製代碼
相關文章
相關標籤/搜索