Echarts框架的使用


基本入門

1、 新建一個echarts.html文件,為ECharts准備一個具備大小(寬高)的Dom。

<!-- 為ECharts准備一個具備大小(寬高)的Dom -->

    <div id="main" style="height:400px"></div>

2、 新建<script>標簽引入模塊化單文件echarts.js

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

3、 新建<script>標簽中為模塊加載器配置echarts和所需圖表的路徑(相對路徑為從當前頁面鏈接到echarts.js),引入圖表文件見引入ECharts2

<script type="text/javascript">

        // 路徑配置

        require.config({

            paths: {

                echarts: 'dist'

            }

        });

    </script>

4. <script>標簽內動態加載echarts和所需圖表,回調函數中可以初始化圖表並驅動圖表的生成,option見API & Doc

// 使用
        require(
            [
                'echarts',
                'echarts/chart/bar' // 使用柱狀圖就加載bar模塊,按需加載
            ],
            function (ec) {
                // 基於准備好的dom,初始化echarts圖表
                var myChart = ec.init(document.getElementById('main'));
 
                var option = {
                    title: {
                        text: '某地區蒸發量和降水量',
                        subtext: '純屬虛構'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: ['蒸發量', '降水量']
                    },
                    toolbox: {
                        show: true,
                        feature: {
                            mark: { show: true },
                            dataView: { show: true, readOnly: false },
                            magicType: { show: true, type: ['line', 'bar'] },
                            restore: { show: true },
                            saveAsImage: { show: true }
                        }
                    },
                    calculable: true,
                    xAxis: [
                                {
                                    type: 'category',
                                    data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                                }
                            ],
                    yAxis: [
                                {
                                    type: 'value'
                                }
                            ],
                    series: [
                        {
                            name: '蒸發量',
                            type: 'bar',
                            data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
                            markPoint: {
                                data: [
                                    { type: 'max', name: '最大值' },
                                    { type: 'min', name: '最小值' }
                                ]
                            },
                            markLine: {
                                data: [
                                    { type: 'average', name: '平均值' }
                                ]
                            }
                        },
                        {
                            name: '降水量',
                            type: 'bar',
                            data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
                            markPoint: {
                                data: [
                                    { name: '年最高', value: 182.2, xAxis: 7, yAxis: 183, symbolSize: 18 },
                                    { name: '年最低', value: 2.3, xAxis: 11, yAxis: 3 }
                                ]
                            },
                            markLine: {
                                data: [
                                    { type: 'average', name: '平均值' }
                                ]
                            }
                        }
                    ]
                };
                // 為echarts對象加載數據 
                myChart.setOption(option);
            }
        );
5.    瀏覽器中打開echarts.html,就可看到以下效果

 

 

深入理解與學習

1 學習過程中曾經遇到,第一次加載時可以顯示圖表,按F5刷新后就報js的錯

此時把所有js代碼放到window.onload = function () {  }中就可以解決
2 當確認前台js代碼沒有錯,測試時還報js代碼的錯,此時是傳入的數據有問題!!!

 

 Legend中的 data,與series中的兩個name一致(這里是有兩個量),否則會有問題,比如修改成      legend: {data: ['蒸發量1', '降水量1'] },

將option簡化為
var option = {
                    title: {
                        text: '客流情況'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: ['進站客流']
                    },
                    calculable: true,
                    xAxis: [
                                {
                                    type: 'category',
                                    data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                                }
                            ],
                    yAxis: [
                                {
                                    type: 'value'
                                }
                            ],
                    series: [
                        {
                            name: '進站客流',
                            type: 'bar',
                            data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
                        }
                    ]
                };
                // 為echarts對象加載數據 
                myChart.setOption(option);
            }
        );

 
        
修改橫縱坐標的值
 data: ['人民廣場站', '建設一路站', '飛虹路站', '朝陽站', '曹家橋站', '潘水站', '盈豐路站', '建設一路站', '飛虹路站', '朝陽站', '曹家橋站', '潘水站', '盈豐路站']
 
data: [1100, 801, 1500, 913, 1200, 513, 310, 1200, 1830, 650, 210, 200, 900]
 

 
        
柱形條太大,看起來不爽,此時可以設置柱形條寬度的屬性,我不用這種方法

 
        
      axisLabel: { rotate: 45, margin: 2, textStyle: { color: '#000', fontWeight: 'bold', fontFamily: '宋體'} },

 
        

 
        
   設置為false就不能拖動柱形條了

項目應用

項目中開發與入門中開發有以下不同:

首先可能有很多個圖表,所以應該封裝一個獲取option的方法;

其次,由於數據是從數據庫中加載過來的,所以橫縱坐標的數據不能寫死,以及圖表類型(柱形圖,折線圖)也不能寫死

 

Option獲取方法
//獲取各線路進站客流圖表的參數
        //OptionStation為Echarts圖表橫坐標的值,OptionFlow為縱坐標的值
        //charType為圖表類型(柱形圖、折線圖),hovertitle為鼠標移動到位置時顯示的縱坐標的值
        function GetOption(OptionStation, OptionFlow, linetitle, charType, hovertitle) {
            var option = {
                title: {
                    text: linetitle
                },
                tooltip: {
                    trigger: 'axis'
                },
                calculable: false,
                xAxis: [
                                {
                                    type: 'category',
                                    axisLabel: { rotate: 45, margin: 2, textStyle: { color: '#000', fontWeight: 'bold',fontFamily:'宋體'} },
                                    data: OptionStation
                                }
                            ],
                yAxis: [
                                {
                                    type: 'value'
                                }
                             ],
                series: [
        {
            name: hovertitle,
            type: charType,
            data: OptionFlow
        }
    ]
            };
            return option;
        }
var optionStationFlow4 = GetOption(station4, passengerFlow4, '四號線進站客流', 'bar', '進站客流'); 

后台傳輸數據到前台

一般來說,由於js是在前台,我們需要在頁面加載時去后台(不是aspx.cs文件)請求數據,此時需要注意以下問題

1 項目中可能是請求特定日期,特定線路等條件的數據,而時間,線路等參數可能是url傳過來的,我們在前台中就要通過獲取這些參數到后台中查詢相應的數據。

2 獲取后台數據要使用同步,不能異步,異步的話數據就更新不了,會報數據為null的錯

 

前台中手寫獲取url參數的方法

//手寫JavaScript獲取url參數的方法
        function GetRequest() {
            var url = decodeURI(location.search); //獲取url中"?"符后的字串
            var theRequest = new Object();
            if (url.indexOf("?") != -1) {
                var str = url.substr(1);
                strs = str.split("&");
                for (var i = 0; i < strs.length; i++) {
                    theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1]);
                }
            }
            return theRequest;
        }
使用方式如下
var Request = GetRequest(); 
var FromDate = Request["fromdate"];

 

前台中同步獲取后台傳過來的數據

首先后台需要到數據庫中獲取數據並拼接字符串,拼接格式為

['人民廣場站', '建設一路站', '飛虹路站', '朝陽站', '曹家橋站', '潘水站', '盈豐路站', '建設一路站', '飛虹路站', '朝陽站', '曹家橋站', '潘水站', '盈豐路站']

接着序列化成對象返回

JavaScriptSerializer serializer = new JavaScriptSerializer();

            return serializer.Serialize(new { Station2 = strA, PassengerFlow2 =strB, Station4 = strC, PassengerFlow4 = strD });

 

前台中

 

<script src="../../Scripts/jquery.js" type="text/javascript"></script>
<script src="../../Scripts/common.js" type="text/javascript"></script>
function executeDataService(FromDate, Todate, Lines) {
            Common.Util.DataServices('PTDDOperationDailyServices$GetStationFlow', { fromDate: FromDate, todate: Todate, lines: Lines }, function (returnValue) {
                var jsonObj = $.parseJSON(returnValue);
                station2 = eval("(" + jsonObj.Station2 + ")");
                passengerFlow2 = eval("(" + jsonObj.PassengerFlow2 + ")");
                station4 = eval("(" + jsonObj.Station4 + ")");
                passengerFlow4 = eval("(" + jsonObj.PassengerFlow4 + ")");
            }, "", false);
        }

 

 

 

 

所以需要通過eval方法將它轉換成對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM