highcharts的使用

Highcharts 是一個使用javascript 腳原本生成圖表的工具,和jfreechart 做用相似,都用來生成各類圖表,並支持圖片的導出和打印。javascript

從官網 www.highcharts.com  上下載的壓縮表中的example中有各類圖表的例子。php

要編寫生成圖表的例子建議從 文件名後帶 basic 的文件看起,看到例子後你會發現,highcharts使用起來時很是簡單的,咱們要作的僅僅是把數據組織好,讓在頁面onload時把數據設置到 組件(Highcharts.Chart)中便可。html

 

1、 改改自帶的例子java

先來個例子:jquery

第一步:  下載Highcharts-2.1.3.zip 包 和 jquery-min-1.4.2.js git

如下兩個文件的下載地址:web

http://www.highcharts.com/downloadajax

http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.jsapache

 

第二步: 建立一個html文件在文件的head標籤部分,加入對相關js文件的引入:json

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

Highcharts的核心文件

<script type="text/javascript" src="../js/highcharts.js"></script>

處理導出圖片功能的js文件

<script type="text/javascript" src="../js/modules/exporting.js"></script>

 

第三步:編寫相關js代碼

在上面的導入js文件代碼後繼續加入如下代碼:

 

              <!-- 2. Add the JavaScript to initialize the chart on document ready -->

              <script type="text/javascript">

             

                     var chart;

                     $(document).ready(function() {

                            chart = new Highcharts.Chart({

                                   chart: {

                                          renderTo: 'container',

                                          defaultSeriesType: 'line',

                                          marginRight: 130,

                                          marginBottom: 25

                                   },

                                   title: {

                                          text: 'Monthly Average Temperature',

                                          x: -20 //center

                                   },

                                   subtitle: {

                                          text: 'Source: WorldClimate.com',

                                          x: -20

                                   },

                                   xAxis: {

                                          categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',

                                                 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

                                   },

                                   yAxis: {

                                          title: {

                                                 text: 'Temperature (°C)' 

                                   },

                                          plotLines: [{

                                                 value: 0,

                                                 width: 1,

                                                 color: '#808080'

                                          }]

                                   },

                                   tooltip: {

                                          formatter: function() {

                                            return '<b>'+ this.series.name +'</b><br/>'+

                                                        this.x +': '+ this.y +'°C';

                                          }

                                   },

                                   legend: {

                                          layout: 'vertical',

                                          align: 'right',

                                          verticalAlign: 'top',

                                          x: -10,

                                          y: 100,

                                          borderWidth: 0

                                   },

                                   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: 'Berlin',

                                          data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]

                                   }, {

                                          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]

                                   }]

                            });

                           

                           

                     });

                           

              </script>

 

第四步:準備存放圖片的容器

在<body> 標籤中加入:

<div id="container" style="width: 800px; height: 400px; margin: 0 auto"></div>

 

運行下試試。

這樣就完成了一個最基本的曲線圖的例子。

接下來的是若是咱們要本身實現一個該怎麼弄?

很簡單,修改例子代碼就能夠了,用不着本身從新寫代碼。

1.先對比剛纔寫的例子的代碼和 效果,看看那些東西咱們能夠修改:

  

 

很明顯,標題的文字、縱軸的單位,橫軸的文字,這些都要修改,數據部分先無論。

因而,在html文件中,修改 標題爲: 個人標題

修改代碼爲:

title: {

                                          text: '個人標題',

                                          x: -20 //center

                                   },

 

保存再打開html, 我本身在試驗的使用用的是ultraEdit 編輯器編輯的html文件,發現文件裏面的攝氏度出現亂碼,

當時沒在乎,用firefox查看源文件,把 攝氏度這個符號給copy 過來了,保存後打開時沒出現效果。

而後查看源文件的時候出現亂碼,應該是編輯器把文件的編碼修改了,因此在改的時候最好用記事本,保存時,保存爲utf-8編碼的。或者乾脆放在咱們的開發工具中修改。

改後的效果以下:

 

接着把 子標題、縱軸的單位 和 鼠標移上圖片時提示中的內容也進行修改

                     subtitle: {//修改子標題

                                          text: '來源:bits.digitalchina.com',

                                          x: -20

                     },

      

yAxis: {//修改縱軸單位文字

                        title: {

                            text: '溫度 (攝氏度)'

                        },

                        plotLines: [{

                            value: 0,

                            width: 1,

                            color: '#808080'

                        }]

                    },

 

 

tooltip: {

                                  

 

       formatter: function() {

                                            return '<b>'+

 

this.series.name +'</b><br/>'+

                                                        this.x

 

+': '+ this.y +'攝氏度';

                                          }

                    

 

              },

 

 

 

修改這些東西都很簡單,只用在html中找到這些字符,而後替換就能夠了。

 

接下來的是數據了。

咱們看一下橫軸的數據,這些值都定義在:

xAxis: {

                        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',

                            'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

},

咱們再想一想,這個曲線是怎麼畫出來的?

無非是X、y軸的值肯定一點,多點連成線。

查看代碼中表示數據的部分:

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: 'Berlin',

                        data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]

                    }, {

                        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]

                    }]

上面的series 屬性是一個數組,該數組中有四個json 對象,而圖上恰好是四條線,因此應該是一個json對象對應一條線,並且name屬性值也說明了這點。

咱們如今只要弄懂一條線是怎麼來的,就好辦了。

拿其中一條來講

{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]}

表示的是Tokyo 的數據,data裏面存放的是一維數組,查看tokyo對應的那條線發現

這些值恰好是那些點的縱軸的值。那橫軸呢?

橫軸恰好是xAxis: {

                        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',

                            'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

},

這時你會想到,原來xAxis 就是表示點的x軸線值,而xAxis  這個數組的長度也確定和data的長度同樣,這樣恰好一個肯定縱軸,一個肯定橫軸。

這樣就能夠表示tokyo這個城市 Jan 的溫度 是 7.0

 Feb 的溫度是 6.9

 ...........

 

 

如今問你,若是隻要一條線呢?把 series 中只保留一個元素便可。如:

 

 

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]

 }]

 

          若是隻要 Jan, Feb , Mar 這三個月的溫度呢? 修改 data,只要前三個月的數字,固然還要修改 xAxis

series: [{

       name: 'Tokyo',

       data: [7.0, 6.9, 9.5]

 }]

 

xAxis: {

                        categories: ['Jan', 'Feb', 'Mar']

},

 

如今我想圖片上最明顯的要修改的部分,均可以改了,咱們應該可使用它了。

 

 

2、本身動手寫一個jsp,加載從服務端獲取的數據。

第一步、在web工程下 新建一個jsp, 將相關的js文件放到項目中

仍是拷貝剛纔的javascript 和 html代碼 到jsp中

發佈項目,打開這個jsp以確保引入的js文件路徑沒有問題。

 

第二步、準備服務端代碼,咱們準備仍是用剛纔的那個氣溫的例子,

在服務端拼接好series 屬性須要的字符串,能夠就用servlet完成,

核心代碼以下:

doPost(......){

//........

Out.println(

"["+

"{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: 'Berlin',data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]}, "+

"{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]}"+

"]"

);

//......

}

Web.xml 中的配置:

    <servlet>

        <servlet-name>pp</servlet-name>

        <servlet-class>cn.dc.serverlt.HighChartsServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>pp</servlet-name>

        <url-pattern>/pp.do</url-pattern>

    </servlet-mapping>

 

第三 步、修改jsp:

<script type="text/javascript">

            $(document).ready(function() {

           

                var options = {

                    chart: {

                        renderTo:'container',

                        defaultSeriesType: 'line',

                        marginRight: 130,

                        marginBottom: 25

                    },

                    credits:{

                            href:'http://bits.digitalchina.com',

                            text:'bits'

                    },

                    title: {

                        text: '昨日系統訪問數量統計圖',

                        x: -20 //center

                    },

                    subtitle: {

                        text: 'Source: bits',

                        x: -20

                    },

                    xAxis: {

                        categories: []

                    },

                    yAxis: {

                        title: {

                            text: '個/小時'

                        },

                        plotLines: [{

                            value: 0,

                            width: 1,

                            color: '#808080'

                        }]

                    },

                    tooltip: {

                        formatter: function() {

                                return '<b>'+ this.series.name +'</b><br/>'+

                                this.x +': '+ this.y +'個';

                        }

                    },

                    legend: {

                        layout: 'vertical',

                        align: 'right',

                        verticalAlign: 'top',

                        x: -10,

                        y: 100,

                        borderWidth: 0

                    },

                    exporting: {

                            filename: "chart",

                            type: "image/png",

                            url: 'http://localhost:8888/dcweb/pp.do',

                            width: 800

                    },

                    series:[]

                };

                $.get('/infoAdmin/visitorStatistics.do', function(data) {

                    // Create the chart

                    alert(data);

                    data = eval("("+data+")");

                    alert(data);

                    options.series.push(data);

                    var chart = new Highcharts.Chart(options);

                });

            });

        </script>

 

 

這裏我沒有先定義chart,而是先定義一個普通的javascript 對象options,

而後給其設置一個series 的數組屬性(值是空的),

而後發送異步請求獲取數據,

將響應數據作處理,被設置到options 對象的series屬性上。

這樣options 對象實際上有了Highcharts.Chart  所需的全部配置屬性信息。

咱們在用options 來構建一個 Highcharts.Chart 對象。

 

之因此沒有直接先定義 Highcharts.Chart  是由於,定義以後不能直接在初始化時設置值,而圖表是在產生new Highcharts.Chart 對象後當即生成的,因此確定就沒有數據了。

 

 

 

到如今,我也不清楚裏面的每一個參數是作什麼的,可是能夠查文檔,如下是文檔的訪問地址:http://www.highcharts.com/ref/, 文檔還不知道怎麼下載下來,你們只能先看在線的文檔了。

注意看的時候對照例子中的js代碼,這樣你大概就能知道一些基本參數的做用了。

 

咱們的項目中用的話,應該不會要很複雜的功能,因此能基本應付開發須要。

 

3、怎麼去掉圖表右下角的 Highcharts.com 的標誌?

1.最笨的方法: 改源碼,查找 highcharts.com 這是我首先想到的。

2. 查看api時發現了

credits:{

                            href:'http://bits.digitalchina.com',

                            text:'bits'

    }

 

這樣就能夠隨意修改爲咱們本身的了。

 

4、圖片導出,怎麼變成咱們本身的呢,而不是每次都請求

Exports.highcharts.com?

原本若是要是沒有中文亂碼的話,我也不會去找替代方案。

咱們點擊導出圖片的時候其實是吧svg圖片數據以post請求的方式發送給了

Exports.highcharts.com, 該站點是以php程序出來這些數據的。

(有興趣的同志能夠用firebug或httpwatch工具查看下發送的請求數據)

如今知道是發svg圖片數據發送給服務端去處理的,那麼要解決中文亂碼就小菜一碟了,

request.setCharacterEncoding("utf-8");

就能夠搞定了。

    

這個是從某位高手那裏找來的,老外寫的,用java來處理svg 圖片數據導出各類圖片。

使用的是apache 的batik, 必須下載batik的jar包,

這個包是幹嗎的?我如今只知道是用來將svg 圖片數據轉成各類格式圖片的。

 

 

代碼以下

package cn.dc.serverlt;

 

 

import java.io.IOException;

import java.io.StringReader;

 

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.batik.transcoder.Transcoder;

import org.apache.batik.transcoder.TranscoderException;

import org.apache.batik.transcoder.TranscoderInput;

import org.apache.batik.transcoder.TranscoderOutput;

import org.apache.batik.transcoder.image.JPEGTranscoder;

import org.apache.batik.transcoder.image.PNGTranscoder;

import org.apache.fop.svg.PDFTranscoder;

 

/**

* Servlet implementation class for the batik Transcoder

* @Thanks przemyslaw

*/

public class HighChartsServlet extends HttpServlet {

   

   private static final long serialVersionUID = 3920224595120519682L;

  

    public HighChartsServlet() {

      super();

   }     

 

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      doPost(request,response);

   }    

  

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

      request.setCharacterEncoding("utf-8");

      String type = request.getParameter("type");

      String svg = request.getParameter("svg");

      ServletOutputStream out = response.getOutputStream();

      if (null != type && null != svg){

      // This line is necessary due to a bug in the highcharts SVG generator for IE

      // I'm guessing it wont be needed later.

      svg = svg.replaceAll(":rect", "rect");

      String ext = "";

      Transcoder t = null;

     

      if (type.equals("image/png")) {

         ext = "png";

         t = new PNGTranscoder();

        

      } else if (type.equals("image/jpeg")) {

         ext = "jpg";

          t = new JPEGTranscoder();

 

      } else if (type.equals("application/pdf")) {

         ext = "pdf";

         t = new PDFTranscoder();

 

      } else if (type.equals("image/svg+xml")) {

         ext = "svg";  

      }

     

      response.addHeader("Content-Disposition", "attachment; filename=chart."+ext);

      response.addHeader("Content-Type", type);

     

         if (null != t){

            TranscoderInput input = new TranscoderInput(new StringReader(svg));

            TranscoderOutput output = new TranscoderOutput(out);

            try {

               t.transcode(input,output);

            } catch (TranscoderException e){

               out.print("Problem transcoding stream. See the web logs for more details.");

               e.printStackTrace();

            }

  

         } else if (ext == "svg"){

            out.print(svg);

         } else {

            out.print("Invalid type: " + type);

         }

      } else {

         response.addHeader("Content-Type", "text/html");

         out.println("Usage:\n\tParameter [svg]: The DOM Element to be converted.\n\tParameter [type]: The destination MIME type for the elment to be transcoded.");

      }

      out.flush();

      out.close();  

   }

}

 

Over了,如今基本的使用你們應該沒什麼問題了,若是還想發掘更好的效果,就得本身學習了!

相關文章
相關標籤/搜索