Echarts檢視視覺化-學習筆記(努力更新中)

舞動程式發表於2020-12-25

1. Echarts簡介

 Echarts是一個視覺化工具,所謂的視覺化就是用圖說話,因為有時候用圖更容易表達資料。它提供了常規的折線圖、柱狀圖、散點圖、餅圖、K線圖,用於統計的盒形圖,用於地理資料視覺化的地圖、熱力圖、線圖,用於關係資料視覺化的關係圖、旭日圖等等。

2. 常見的資料視覺化庫

  1. D3.js:目前Web端評價最高的JavaScript視覺化工具庫。
  2. ECharts.js:百度出品的一個開源JavaScript資料視覺化庫。
  3. Highcharts.js:國外的前端資料視覺化庫,非商用免費,被許多國外大公司使用。
  4. AntV:螞蟻金服全新一代資料視覺化解決方案等等。
  5. Highcharts和Echarts就像是Office和WPS的關係。
  6. Tableau:也是一款視覺化工具。

3. Echarts第一個小案例

官網:https://echarts.apache.org/zh/index.html

  1. 下載並引入echarts.js檔案:
    一樣的要去官網進行下載這個js檔案,它可以幫助我們生成各種各樣的圖表。下載之後便會有echarts.min.js檔案,當然,這個帶min是經過壓縮版的。下完之後引入到我們的專案中,放到js資料夾下,如圖:
    在這裡插入圖片描述
    然後在index.html中引入echarts外掛,如下程式碼:

    <script src="js/echarts.min.js"></script>
    
  2. 準備一個具備大小的DOM容器,準備它是為了把圖表放進去,這個容器必須有寬度和高度。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .box{
                width: 300px;
                height: 300px;
                border: 1px solid red;
            }
        </style>
    </head>
    <body>
        <script src="js/echarts.min.js"></script>
        <div class="box"></div> <!--有了這個容器,就可以把圖表丟在這裡面去-->
    </body>
    </html>
    

    注意這個容器要放在下面步驟的前面,是前面,否則會報錯。

  3. 初始化echarts例項,通過不同的例項化,可以生成不同的圖表(根據第四步的option),這個圖表得有一個地方存著,所以它需要依賴於Dom容器。所以,如下程式碼:

    <script>
    //初始化例項物件 echarts.init(dom容器);
    var myChart = echarts.init(document.querySelector(".box"));
    //例項的同時要告訴它Dom容器的位置,這樣以後這個例項物件最後所生成的圖表,就會在這個容器中進行顯示,只是告訴你我圖表出生的地方就是那個div,具體圖表是什麼型別的圖表,就得看第四步的配置了。
    </script>
    
  4. 指定配置項和資料(option),可以展現不同的形狀。
    這個option我們先從官網copy一下,先體驗一下,往後都是圍繞著這個option展開的,因為通過這個option可以展現出不同的圖表,之所以這個echarts例項可以產生各種各樣的圖表,主要是依靠option物件配置來的,所以option是非常重要的。先從官網小案例copy:https://echarts.apache.org/zh/tutorial.html#5 分鐘上手 ECharts

    // 指定圖表的配置項和資料
    var option = {
           title: {
               text: 'ECharts 入門示例'
           },
           tooltip: {},
           legend: {
               data:['銷量']
           },
           xAxis: {
               data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
           },
           yAxis: {},
           series: [{
               name: '銷量',
               type: 'bar',
               data: [5, 20, 36, 10, 10, 20]
           }]
    };
    
  5. 將配置項設定給echarts例項物件,將echarts物件根據你給的配置進行生效。
    宣告的option物件必須要設定給echarts例項,而echarts例項又代表著某一個div容器,設定給echarts例項,就是設定給某個容器,只不過這個容器被echarts初始化之後就不是一個普通的容器,所以它會根據設定進來的資料進行解析,最終生成我們所看到的圖表。

    // 使用剛指定的配置項和資料顯示圖表。
    myChart.setOption(option);
    

效果展示:
在這裡插入圖片描述

4. Echarts基礎配置

 現在我們要對option裡面的屬性做個基礎的講解,可以拿官方的例子講解:https://echarts.apache.org/examples/zh/editor.html?c=line-stack。然後在後續學習中像echarts會用到的js,包括地圖js,在我百度網盤都有分享:https://pan.baidu.com/s/12KacUEjShNwsGs2LvOCdDg,提取碼是s61p。

4.1 title

好,首先引入我們眼簾的是title屬性,它是一個物件,因為它的值是由兩個{}括起來的。它很簡單,就是設定圖表的標題,說明這個圖表要表達什麼資訊。
在這裡插入圖片描述
它支援\n換行,如圖:。
在這裡插入圖片描述

title詳解

在這裡插入圖片描述

注意上面紅色框的表示點選事件,就是當你點選標題時觸發的事件,那麼它觸發事件就得有一個函式,函式如下:

myChart.on('click',function(params){
       console.log(params);
       alert("我被點選了");
});

這個myChart就是由init例項出來的物件。

完整程式碼:

title: {
       id:'head',//id屬性可用於在 option 或者 API 中引用元件
       text: ['{a|折線圖}','{b|堆疊}'],// \n表示換行
       left:100,//有left就有right,top,bottom
       padding: 25,//值可以為陣列,陣列如果有四個元素,表示上右下左
       show:true, //是否顯示標題
       link:'https://www.baidu.com/',
       target:'blank',//blank表示新視窗開啟,self表示當前視窗開啟,預設是blank
       borderWidth:5,
		borderColor:"blue",
		borderRadius:15,
       textStyle:{
           color:'green',
           //fontStyle:'italic',//值還有normal,oblique
           //fontWeight:'bold',//值還有normal,lighter
           fontFamily:'monospace',//字型樣式
           fontSize:20,
           lineHeight: 55,//行高
           //textBorderColor:'yellow',
           textShadowColor:'red',//陰影顏色要配合下面的textShadowBlur用,不然看不出效果
           textShadowBlur:30,  //表示陰影的模糊度
           textShadowOffsetX:30, //讓陰影整體往右移,當然有x就有y
           rich: //與上面text配合
               {
                   //在這裡可以自定義富文字樣式
                   a:
                       {
                           color: 'blue',
                           fontSize:20 //就算外面設了fontSize為20,這裡依然沒效果
                       },
                   b:
                       {
                           color: 'red',
                           fontSize:20
                       }
               }
       },
       textAlign:'center',//主副標題中間對齊
       itemGap:200,//主副標題之間的距離
       triggerEvent:true,//觸發事件,當點選標題時,不管主標題還是副標題,
       // 當有link屬性一併存在時,先觸發link屬性,再觸發triggerEvent屬性
       //下面是子標題
       subtext:"副標題",
       sublink:'https://www.hao123.com/',
       subtarget:'blank',
       subtextStyle:{
           color:'#8A2BE2',
           //align:'center',
       }
},

4.2 tooltip

tooltip:翻譯過來就是"工具提示",準確的說它是一個提示框元件,也就是說,它可以起到一個提示作用,如下圖:
在這裡插入圖片描述
沒錯,就是當我們滑鼠移上去的時候,所出現的提示,告訴你每週的情況,圖上很明顯是告訴你週二的情況。而這個tooltip裡面有個trigger屬性,trigger翻譯過來就是"觸發",就是觸發方式,用什麼觸發呢?就是axis,那麼axis又是什麼?翻譯過來就是"軸"的意思,說到軸,我們是不是會想到橫軸和豎軸呀!但它並沒有具體表示是哪個軸,沒錯,axis就表示座標軸。連起來就是,它會根據你的座標軸去觸發提示框。回到上面,它是不是通過觸發橫座標的每一個座標來達到提示效果的呢?像這種,觸發的方式可不僅僅只有axis,它還有item和none,none就是什麼也不觸發,而item什麼意思呢,當我們把axis改為item時,如下圖:

在這裡插入圖片描述

tooltip詳情

在這裡插入圖片描述
注意一下formatter的值,如下:

在這裡插入圖片描述

完整程式碼:

tooltip: {
        trigger: 'axis',
        show:true,//如果為false表示不顯示提示框
        triggerOn:'click',//點選時才出現提示框
        enterable:false,//預設為false,為false表示可以點選提示框裡左邊有顏色的圓圈
        //showDelay:5000,//單位毫秒,表示5秒後才出現提示框,前提是triggerOn為mousemove
        borderRadius: 10,
        formatter:"{b}",//formatter裡的內容會決定提示框裡的內容,可以接收字串和函式,如下:
        //formatter:function(){
        //    return "haha";
        //},
        //formatter:function(arg){
        //    return arg[0].data;
        //},
        axisPointer:{//座標軸指示器
            type:'cross',//取值有line(直線),shadow(陰影),none,cross(交叉)
            label:{ //文字標籤
                show:true,//設定為false,表示y軸刻度線和x軸的周幾不會顯示
                color:'yellow',
                //...
            },
            /*shadowStyle:{  //type為shadow時有效
                //color:"red",
                shadowBlur: 50,//圖片陰影的模糊大小
                shadowColor:"yellow",
                opacit:0.5//顏色透明度
            }*/
            crossStyle:{
                color:"red",
                type:'dotted',//取值有solid(實線),dashed(虛線),dotted(點線)
                shadowBlur: 10
            },
            lineStyle:{
                color:"green",
                type:'dashed'
            }
        },
        textStyle:{
            color:'#FF00FF',
            fontStyle:'italic'
        }
},

4.3 legend

legend:legend翻譯過來就是傳奇,圖例,說明,解釋的意思,此處不是表示傳奇的意思,而是後三個意思,也就是圖例,說明,解釋,那什麼是圖例呢?
在這裡插入圖片描述

legend詳情

在這裡插入圖片描述
在這裡插入圖片描述

完整程式碼:

title: {
        text: '折線圖堆疊',
        z:2,
        //zlevel:6
},
legend: {
         data: ['郵件營銷', '聯盟廣告', '視訊廣告', "",'直接訪問', '搜尋引擎','搜jjj','搜aaa','搜bbb','搜尋引擎ccc'],
         //上面data裡有一個""的資料,表示換行,但是因為下面type指定的型別是scroll,所以不起作用,換成plain即可
         type:'scroll',//預設值是plain
         show:true,//決定圖例是否隱藏
         //orient:'vertical',//orient譯為朝向,如果為vertical,那麼圖例就會上下垂直排列,預設值是horizontal(水平的)
         align:'right',//預設是left,它表示,圖例的文字和文字對應的圓圈交換位置
         itemGap:10,//它表示圖例與圖例之間的間隔
         z:3,//跟上面title對比,值越大,越在上面,如右圖,圖例哪個圓點在標題的上面,如果你的值比title小,如1,那麼就
         //會在title的下面,會被"堆"字覆蓋。
         //zlevel:5, //這個屬性跟z屬性基本上是一樣的,只不過zlevel的優先順序比z大,如果不給他們倆註釋的話,圖例的哪個圓點
         //將會被"堆"字覆蓋。
         left:-50,
         borderWidth:2,
         itemWidth:90, //如右圖,圓點的線變長了
         itemHeight:20,//如右圖,圓點變大了
         symbolKeepAspect:true,//如果圖示(可能來自系列的 symbol 或使用者自定義的 legend.data.icon)是 path:// 的形式,
         //是否在縮放時保持該圖形的長寬比。
         // 使用字串模板,模板變數為圖例名稱 {name}
         formatter: 'a {name}',
         // 使用回撥函式
         formatter: function (name) {
            return 'ab' + name;
         },
         selectedMode:true,//如果為false,那麼無法點選圖例,預設是true
         inactiveColor:'#ccc', //圖例關閉時的顏色
         selected: {//圖例選中狀態表,就是一出場郵件營銷的那條線是關閉的,可以看右圖的哪個表示郵件營銷的圓點變成了紅點
            // 選中'系列1'
            '聯盟廣告': true,
            // 不選中'系列2'
            '郵件營銷': false
         },
         textStyle:{},//略
         tooltip: {
             show: true  //預設不顯示
         },
         data: [{// 注意右邊的圖例只有四個,也就是data裡的4個物件,如果不設定data,那麼它會自動的去下面series系列去找,
                 //包括搜尋引擎,如果指定data,就按這裡來,不會有"搜尋引擎"這個按鈕
            name: '郵件營銷',
            // 強制設定圖形為圓。
            icon: 'circle',//值有rect,, 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none',也可指定網路上的
            //圖片,格式:'image://http://xxx.xxx.xxx/a/b.png'
            // 設定文字為紅色
            textStyle: {
                color: 'blue' //注意這是設定文字的顏色,不是設定圓點的顏色,圓點的顏色預設是系列中線的顏色
            }
         },{
            name: '聯盟廣告',
            // 強制設定圖形為圓。
            icon: 'circle',
            // 設定文字為紅色
            textStyle: {
                color: 'pink'
            }
         },{
            name: '視訊廣告',
            // 強制設定圖形為圓。
            icon: 'circle',
            // 設定文字為紅色
            textStyle: {
                color: 'red'
            }
         },{
            name: '直接訪問',
            // 強制設定圖形為圓。
            icon: 'circle',
            // 設定文字為紅色
            textStyle: {
                color: 'red'
            }
         }]
 },

4.4 toolbox

toolbox:工具箱元件,有了它,可以把我們的圖表下載下來,另存為圖片等功能。feature表示特徵。
在這裡插入圖片描述
它不單單有匯出圖片,還有資料檢視,動態型別切換,資料區域縮放,重置五個工具。

toolbox詳情

在這裡插入圖片描述
完整程式碼:

toolbox: {
     show:true,//預設是true,可以不寫
     orient:'vertical',
     itemSize:25,
     itemGap:20,//工具欄 icon 每項之間的間隔。橫向佈局時為水平間隔,縱向佈局時為縱向間隔。
     showTitle:true,//是否在滑鼠 hover 的時候顯示每個工具 icon 的標題。
     feature: {
         saveAsImage: {
             title:'儲存為圖片111',
         },
         dataView:{  //資料檢視裡的資料可以更改,更改後右圖就會有變化
             title:'資料檢視',
             readOnly:true //為true表示不可編輯
         },
         restore:{  //還原就是還原到最初狀態(開廠預設設定)
             title:'還原'
         },
         dataZoom:{ //資料區域縮放
             title:{
                 zoom:'區域縮放',
                 back:'區域縮放還原'
             }
         },
         //上面的物件裡面的物件體可以不寫,比如saveAsImage:{}
         magicType:{ //動態型別切換
             show:true,
             type: ['line', 'bar', 'stack', 'tiled'],//表示你需要切換的元件
             title:{
                 line:'切換為折線圖',
                 bar:'切換為柱形圖',
                 stack:'切換為堆積圖',
                 tiled:'切換為平鋪'
             }
         },
         myTool1:{ //注意,自定義的工具名字,只能以 my 開頭,例如myTool1,myTool2:
             show: true,
             title: '自定義擴充套件方法',
             icon:'image://https://himg.bdimg.com/sys/portraitn/item/385741726573e68898e7a59e686f6d65f8e7',
             onclick: function (){
                 alert('hello!!')
             }
         }
      },
      emphasis:{  //譯為強調
          iconStyle:{
              borderColor:'red',
              borderType : 'dashed'
          }
      },
      tooltip: { // 和 option.tooltip 的配置項相同
            show: true,
            formatter:function (param) {
                return '<div>' + param.title + '</div>'; // 自定義的 DOM 結構
            },
            backgroundColor: '#222',
            textStyle: {
                fontSize: 12,
            },
            extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);' // 自定義的 CSS 樣式
        }
},

4.5 grid

grid:翻譯為"網格"。
它可以控制圖表的大小,因為網格佔據這整個圖表,那麼我們可不可以看到呢?其實可以的,就是在其裡面加上show:true,就可以看到了,為了看起來明顯,可以把xAxis和yAxis裡面的也加上show屬性,只不過他們的值是false,就是不顯示嘛,如圖:
在這裡插入圖片描述

通過left,right,bottom這三個值便可以控制,就是設定圖表跟外層Dom容器的距離。出來這種方式外,還有另一種方式,如下程式碼:

grid: {
        containLabel: true,
        show:true,
        x:100,
        y:100,
        x2:200,
        y2:100
},

問題來了,x,y,x2,y2表示什麼意思呢?
在這裡插入圖片描述
我們還可以直接定義width和height,比如width:400,height:300,如果把width改為'50%',那麼它便會有自適應的效果,還有x,y這些同樣是支援百分比的。
在這裡插入圖片描述

 好,還有一個屬性,叫做containLabel,它表示是否顯示刻度,如果為true,顯示,false為不顯示。
在這裡插入圖片描述
但是這麼發現不對勁,這麼變成00了,其實只要吧left的3%改為0%就可以了,就不會出現00了,因為如果containLabel為false的話,那麼left這種就不會考慮為標籤佔座,否則它往右移是以標籤為基準的往右移。

grid: {
        left:30,
        //left: '6%',
        right: '4%',
        bottom: '3%',
        containLabel: true,  //是否出現刻度值
        show:true,//要想讓顏色,陰影生效,必須設為true
        width:550,
        backgroundColor:'pink',
        borderColor:'red',
        borderWidth:10,
        shadowColor: 'yellow',
        shadowBlur: 20,//值越大,陰影顏色越濃烈,blur為模糊
        shadowOffsetX:50
},

4.6 xAxis

xAxis:axis表示座標軸,那麼xAxis就表示x軸,同理yAxis就表示y軸,那麼這裡就是設定x軸的相關配置。它裡面有個type屬性,值為category,翻譯過來就是"類別"的意思,這裡表示座標軸的型別為類目軸,設定類目軸需要給它定義data資料,比如週一,週二這些,也就是說設定為類目軸,那麼它的座標點所表示的資料會根據你的data資料來一一對應展示,如果不設定data,只是表明它是類目軸,那麼這條軸是沒有任何座標點的,如圖:
在這裡插入圖片描述
boundaryGap表示邊界間隙,如果為true,那麼x軸會跟y軸有間隙,如圖:
在這裡插入圖片描述
boundaryGap主要用於柱形圖,不然柱形圖會超出x軸,在下幾張圖有柱形圖可以看出。如果說我不想讓x軸在下面顯示,我想讓它在上面顯示怎麼辦,有個屬性叫position,值為top,也就是position:'top',如下圖:
在這裡插入圖片描述
那麼對於字型樣式怎麼設定呢?如圖:
在這裡插入圖片描述
接下來介紹axisLine屬性,直譯過來就是座標線,很容易理解,不多說,如下圖:
在這裡插入圖片描述
axisLine裡面還有一個屬性叫onZero,直譯表示"在零處",它的值是布林值,也就是說,如果是true,那麼橫座標會依附於0的位置,看圖:
在這裡插入圖片描述
如果改為false:
在這裡插入圖片描述
下一個屬性,axisTick:座標軸小標記,何謂小標記,如下圖:
在這裡插入圖片描述
詳細介紹請看下圖:
在這裡插入圖片描述
下一個,axisLabel:
在這裡插入圖片描述
再下一個,splitArea:
在這裡插入圖片描述
再再下一個,splitLine:
在這裡插入圖片描述
總結,下面的各個名詞都要記住:
在這裡插入圖片描述

4.7 yAxis

yAxis:它是y軸,它的型別是value,value表示值,我們看看它的y軸,是不是數字型的呀,好,那麼type目前就有兩個值了,一個是category(類目型),一個是value(數值型,不指定數值區間,它會自動計算),除了這兩個,還有,time(時間軸)和log,time表示時間,不用說,log表示對數軸,適用於對數資料,瞭解一下,其它的屬性,其實xAxis有哪些屬性,yAxis也是適用的,如果要說,可以說說boundaryGap,如果是數值型的boundaryGap,那麼它的留空策略就不是true和false,它應該是[0,0.5],也就是boundaryGap:[0,0.5],裡面的數值代表百分比,它代表什麼意思呢?第一個數字0,表示百分之零,不好解析,先解釋第二個,第二個0.5表示最大資料與最小資料的差所得的結果乘以十分之五(十分之五,或者說百分之50就是0.5),也就是一半,如果是除,就是除2,得到的結果就是最大資料跟最頂端的最小距離,以圖說話:
在這裡插入圖片描述
在這裡插入圖片描述
還有針對y軸為數值型的,max屬性,比如:max:4000,表示最高座標就是4000,相反,有max就有min。對於k線圖而言,有個scale屬性:如下圖:
在這裡插入圖片描述
在這裡插入圖片描述
下一個屬性,splitNumber:它表示分段,就是數值型座標軸要分成幾段,根據max和min去分段。也就是(max-min)/分段數。

4.8 series

series:翻譯過來就是"系列"的意思,它決定著顯示那種型別的圖表,比如裡面有個type屬性為line,line就是線的意思,剛好我們的圖表是不是折線圖啊,如果把line改為bar,就是柱形圖,也就是說,series是一個陣列,陣列裡面是一個個物件,有多少個物件就有多少個item元素,經過上面的講解,我們已經知道item代表什麼了,那麼每個item裡面各自定義著它們的資訊,type屬性表示你要用什麼樣的方式去表達資料,是柱形圖?還是線形圖?,如下圖:
在這裡插入圖片描述
每一個物件裡面的資料屬性,表示了它的資料走向。name表示這個物件的名字,它的名字會呈現在圖例上面。stack表示資料堆疊,什麼是資料堆疊,如下圖:
在這裡插入圖片描述
也就是說,這5個物件,都是在前一個物件的高度堆積起來的,但前提是每一個物件的stack的值必須一樣,比如上面,值都是總量,否則,它會依次往前找,找到stack是一樣的值的時候,才會在它的基礎上堆積。如果把stack刪掉,資料就不會有堆疊的問題。
 還有一個注意點,就是如果series裡面已經有name的值了,那麼legend裡面的data屬性可以刪掉。
 上面不是有5個item嗎,那麼怎麼給他們換一種顏色?有個color屬性,它是在外面跟title,tooltip啊這些並列的,它的值是一個陣列,陣列裡面就是具體的顏色值了。
在這裡插入圖片描述

 它不單單可以這樣設定顏色,還可以在series裡面設定顏色,如圖:
在這裡插入圖片描述
 這樣就扯出裡series裡的itemStyle屬性,請看下圖詳解:
在這裡插入圖片描述
 還有一個顏色填充屬性:
在這裡插入圖片描述
 對應顏色填充,如果想讓顏色有一種漸變的效果,可copy以下程式碼:

areaStyle: { //顏色填充區域
  //漸變色
  color:new echarts.graphic.LinearGradient(
      0,
      0,
      0,
      1,
      [
          {
              offset:0,
              color:"red"//漸變的起始顏色
          },
          {
              offset:1,
              color:"rgba(1,132,213,0.1)" //漸變的結束顏色
          }
      ],
      false
  ),
  shadowColor:"rgba(0,0,0,0.1)"
}, 

 讓每個拐點的值顯示:
在這裡插入圖片描述
想下方顯示數值就加上position:"bottom"
在這裡插入圖片描述
上圖的formatter可以是函式,如下程式碼:

formatter:function(params){
                console.log(params);
                return params.value;
}

如果我想讓滑鼠懸浮到拐點的時候才顯示數值,怎麼辦,如下圖:
在這裡插入圖片描述
如果只想顯示最大和最小,怎麼搞,如下:
在這裡插入圖片描述

多軸:
在這裡插入圖片描述
定義拐角點樣式,是圓形,還是正方形,或者三角形?如圖:
在這裡插入圖片描述
想讓拐點的符號變大,用symbolSize:10。還有符號的旋轉,還有開始的時候不顯示拐點,滑鼠經過才出現拐點,如下程式碼:

showSymbol:false,

拐點的樣式程式碼:

itemStyle:{
             color:"#0184d5",
             borderColor:"rgba(221,220,107,.1)",
             borderWidth:12
} 

如上會讓拐點看起來外面有一層光環。

如果想讓線看起來平滑一點,就用smooth:true即可。下面是高亮顯示系列,如下程式碼:

legendHoverLink:true,
//表示高亮,當滑鼠移到圖例上時,可以高亮顯示當前對應的系列

data屬性:
在這裡插入圖片描述

4.9 dataZoom

 區域縮放dataZoom:toolbox也有區域縮放dataZoom,現在講的dataZoom是一個滑塊,或者是用滑鼠的滑輪來控制區域大小,它是對資料範圍過濾,x軸和y軸都可以擁有,它是一個陣列,意味著可以配置多個區域縮放器。

在這裡插入圖片描述
slider就是滑塊的意思,那麼還有一個是通過滑鼠滑輪來控制的是inside,這個瞭解即可,用的最多的是slider。上面說了dataZoom是一個陣列,那麼它還可以放一個物件,每一個物件就是一個區域縮放器,比如上圖x軸的那個就是一個區域縮放器,這樣的話dataZoom就有兩個物件,也就是兩個區域縮放器,一個是在x軸,一個在y軸,但是,具體這個縮放器作用到哪個軸,它是不知道的,所以,我們要對它進行指定:
在這裡插入圖片描述

5. 作業案例之折線圖

作業1


在這裡插入圖片描述
上圖我並沒有百分百還原,但差不多是一樣的,下面是原始碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 1600px;
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
    <script src="js/echarts.min.js"></script>
    <div class="box"></div>  <!--有了這個容器,就可以把圖表丟在這裡面去-->
    <script>
       //初始化例項物件 echarts.init(dom容器);
       var myChart = echarts.init(document.querySelector(".box"));
       //指定配置項和資料
       // 指定圖表的配置項和資料
       option = {
          title:{
             text:"產品銷量",
             subtext:"純屬虛構"
          },
           tooltip:{
              trigger: "axis",
               backgroundColor:"black",
               textStyle:{
                   color: "white"
               }
           },
           legend: {

           },
           xAxis: {
                type:"category",
                data:["週一","週二","週三","週四","週五","週六","週日"],
               axisLine:{
                   lineStyle:{
                       color:"skyblue",
                       width:3
                   }
               },
               axisLabel:{
                    color:"black"
               },
               axisTick:{
                    length:20,
                   lineStyle:{
                       width:3
                   }
               }
           },
           yAxis: {
               type:"value",
               position:"right",
                axisLine:{
                    show: true,
                    lineStyle:{
                        color:"skyblue"
                    }
                },
               axisLabel:{
                   margin:-1300,
                   color:"black"
               },
               splitLine:{
                   lineStyle:{
                       color:["#F0F8FF","#3399FF","#F0F8FF","#CCFF33","#F0F8FF"]
                   }
               }
           },
           series:[{
              type:"line",
               name:"產品A",
               color:"#CC9933",
               data:[11,11,{
                  value:15,
                   symbol:"rect",
                   symbolRotate:0,
                   label:{
                       show:true,
                       color:"#CC9933",
                       position:"bottom"
                   }
               },13,12,13,10],
               symbol:"arrow",
               symbolSize: 15,
               symbolRotate:-100,
               itemStyle:{
                   normal:{
                       lineStyle:{
                           type:'dashed'  //'dotted'點型虛線 'solid'實線 'dashed'線性虛線
                       }
                   }
               }
           },{
               type:"line",
               name:"產品b",
               data:[3,5,3,5,2,3,6],
               smooth:true,
               color:"skyblue",
               areaStyle:{
                   color:"pink"
               },
               label:{
                   show:true,
                   color:"skyblue"
               }
           }]
       };
       // 使用剛指定的配置項和資料顯示圖表。
       myChart.setOption(option);
    </script>
</body>
</html>

在這裡插入圖片描述

作業2

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
 現在有個要求,增加兩個超連結,一個是2020,一個是2021,當你點選2020的時候,顯示2020的資料,點選2021的時候,顯示2021的資料,所以:

<div class="year">
    <a href="javascript:;;">2020</a> <a href="javascript:;;">2021</a>
</div>

 這樣的話,效果如圖:

在這裡插入圖片描述
 還有準備資料:

//模擬後臺的資料
var yearData=[
	 //每一個物件的索引跟a標籤的索引一一對應,方便後面操作
     {
         year: "2020",
         data:[ //兩個陣列是因為有兩條線,一條紅色的,一條青色的
             [24,40,101,134,90,230,210,230,120,230,210,120],//給series的第一個物件的data
             [40,64,191,324,290,330,310,213,180,200,180,79] //給series的第二個物件的data
         ]
     },
     {
         year: "2021",
         data:[
             [123,175,112,197,121,67,98,21,43,64,76,38],
             [143,131,165,123,178,21,82,64,43,60,19,34]
         ]
     }
];

完整程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 900px;
            height: 500px;
            border: 1px solid red;
        }
        a{
            text-decoration: none;
        }
    </style>
</head>
<body>
    <script src="js/echarts.min.js"></script>
    <script src="js/jquery-3.5.1.js"></script>
    <div class="year">
        <a href="javascript:;;">2020</a> <a href="javascript:;;">2021</a>
    </div>
    <div class="box"></div>  <!--有了這個容器,就可以把圖表丟在這裡面去-->
    <script>
        //模擬後臺的資料
        var yearData=[
            //每一個物件的索引跟a標籤的索引一一對應,方便後面操作
            {
                year: "2020",
                data:[ //兩個陣列是因為有兩條線,一條紅色的,一條青色的
                    [24,40,101,134,90,230,210,230,120,230,210,120],
                    [40,64,191,324,290,330,310,213,180,200,100,79]
                ]
            },
            {
                year: "2021",
                data:[
                    [123,175,112,197,121,67,98,21,43,64,76,38],
                    [143,131,165,123,178,21,82,64,43,60,19,34]
                ]
            }
        ];
       //初始化例項物件 echarts.init(dom容器);
       var myChart = echarts.init(document.querySelector(".box"));
       //指定配置項和資料
       // 指定圖表的配置項和資料
       option = {
           color:["#00f2f1","#ed3f35"],
           title:{
               text:"人員變化",
               top:"10%"
           },
           tooltip: {
               trigger: 'axis'
           },
           legend: {
               top:'10%',
               data: ['新增粉絲', '新增遊客'],
               textStyle:{
                   color:"#4c9bfd"
               },
               right:"10%"
           },
           grid: {
               top: '20%',
               left: '5%',
               right: '4%',
               bottom: '20%',
               containLabel: true,
               show:true,
               borderColor:"#012f4a"
           },
           xAxis: {
               type: 'category',
               boundaryGap: false,
               data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
               axisTick:{
                   show:false
               },
               axisLabel:{
                   color:"#4c9bfd"
               },
               axisLine:{
                   show:false
               },
               splitLine:{
                   show:true,
                   lineStyle:{
                       color:"#012f4a"
                   }
               }
           },
           yAxis: {
               type: 'value',
               axisTick:{
                   show:false
               },
               axisLabel:{
                   color:"#4c9bfd"
               },
               axisLine:{
                   show:false
               },
               splitLine:{
                   lineStyle:{
                       color:"#012f4a"
                   }
               }
           },
           series: [
               {
                   name: '新增粉絲',
                   type: 'line',
                  // data: [24, 40, 101, 134, 90, 230, 210,230,120,230,210,120],
                   data: yearData[0].data[0],
                   smooth:true
               },
               {
                   name: '新增遊客',
                   type: 'line',
                   data: yearData[0].data[1],
                   smooth:true
               }
           ]
       };

       // 使用剛指定的配置項和資料顯示圖表。
       myChart.setOption(option);
       //注意要想點選成功要引入jquery
      $(".year").on("click","a",function () {
            //alert(1);
            //console.log($(this).index());//看看你點的是哪個a標籤
            //點選a的時候根據當前a的索引號找到對應yearData的相關物件
            //console.log(yearData[$(this).index()])
            var obj = yearData[$(this).index()];
            option.series[0].data = obj.data[0];
            option.series[1].data = obj.data[1];
            myChart.setOption(option);//更換資料要重新渲染一次
      })
    </script>
</body>
</html>

6. 作業案例之散點圖

 散點圖可以幫助我們推斷出變數間的相關性,比如變數和變數之間是一種正比的關係,這個變數與變數可以是身高和體重,一般來說,身高越高,體重越重,像這種關係,用散點圖怎麼表示呢?要明白,散點散點就是由很多個點組成的散點圖,這每一個點都有對應的座標,既然是座標,我們知道,如果我們要在圖表中點上一個點,是要根據它在x軸的位置和在y軸的位置表示的,也就是(x,y),那麼x可以表示身高,y可以表示體重,所以,如果有四個人,四個人就有四個(x,y),用陣列表示,這四個陣列再放到一個陣列裡,就變成了二維陣列,而散點圖恰好需要的就是二維陣列data。
在這裡插入圖片描述
但是上副圖是不是看起來怪怪的,看座標軸,發現他從0開始,如果我不想讓它從0開始,怎麼做呢?其實是scale:true,把它加上,其實在前面就已提到過了,如下圖:
在這裡插入圖片描述

option = {
    xAxis: {
        type:'value',
        scale:true
    },
    yAxis: {
        type:'value',
        scale:true
    },
    series: [{
        type: 'scatter',
        symbolSize: 20,
        data: [
            [170, 80],
            [164, 51],
            [158, 50],
            [174, 79],
            [184, 90],
            [180, 77],
            [160, 49],
            [177, 84],
            [190, 96],
            [150, 46],
            [169, 47]
        ],
    }]
};

散點圖的常見效果

  1. 氣泡效果:水中的氣泡,有大有小,那麼散點圖也一樣,在某某條件下他是大氣泡,某某條件下又是小氣泡,比如體重不合格的,就讓它呈現大氣泡,合格就原樣,哪這要怎麼做呢?

    在這裡插入圖片描述
    完整程式碼:

     option = {
         xAxis: {
             type:'value',
             scale:true
         },
         yAxis: {
             type:'value',
             scale:true
         },
         series: [{
             type: 'scatter',
             symbolSize: function(arg){
                 //console.log(arg);
                 //動態決定不同的散點值是多少
                 var height = arg[0] / 100; //arg為cm,除以100變為m
                 var weight = arg[1];
                 //bmi= 體重kg / (身高m*身高m)  大於28代表肥胖
                 var bmi = weight / (height*height);
                 if(bmi>28){ //代表肥胖
                     return 20;  //右圖點大的哪個就是肥胖身材的
                 }
                 return 10;
             },
             data: [
                 [170, 90],
                 [164, 51],
                 [158, 70],
                 [174, 79],
                 [184, 90],
                 [180, 77],
                 [160, 49],
                 [177, 84],
                 [190, 126],
                 [150, 46],
                 [169, 47]
             ],
         }]
    };
    

    如果想讓大氣泡是一個顏色,小氣泡又是另一個顏色,怎麼弄?還是跟上面一樣,是一個函式,還是一樣在series中配置,記得在series是怎麼配置顏色的嗎,是不是在一個itemStyle物件裡配置的?其實道理都是一樣的:
    在這裡插入圖片描述

  2. 漣漪效果:所謂的漣漪就是這個點線水波一樣,那麼我們就要把type: 'scatter',變成type: 'effectScatter',這樣的話它一上場每個點就會像散發水紋一樣,如圖:
    在這裡插入圖片描述
    它是動畫效果,不是靜態的,但是我不想讓它每個點都散發水紋,我想讓滑鼠移上去某個點再散發,這要怎麼做呢?
    在這裡插入圖片描述
    完整程式碼:

     option = {
         xAxis: {
             type:'value',
             scale:true
         },
         yAxis: {
             type:'value',
             scale:true
         },
         series: [{
             type: 'effectScatter',
             rippleEffect:{ //控制漣漪動畫的作用範圍
                 scale:5//值越大,漣漪動畫越大
             },
             showEffectOn:'emphasis',//預設值是render,控制滑鼠移入產生動畫
             symbolSize: function(arg){
                 //console.log(arg);
                 //動態決定不同的散點值是多少
                 var height = arg[0] / 100; //arg為cm,除以100變為m
                 var weight = arg[1];
                 //bmi= 體重kg / (身高m*身高m)  大於28代表肥胖
                 var bmi = weight / (height*height);
                 if(bmi>28){ //代表肥胖
                     return 20;  //右圖點大的哪個就是肥胖身材的
                 }
                 return 10;
             },
             itemStyle:{
                 color:function(arg){
                     //console.log(arg);
                     var height = arg.data[0] / 100; 
                     var weight = arg.data[1];
                     var bmi = weight / (height*height);
                     if(bmi>28){ 
                         return "red";  
                     }
                     return "green";
                 }
             },
             data: [
                 [170, 90],
                 [164, 51],
                 [158, 70],
                 [174, 79],
                 [184, 90],
                 [180, 77],
                 [160, 49],
                 [177, 84],
                 [190, 126],
                 [150, 46],
                 [169, 47]
             ],       
         }]
     };
    

7. 作業案例之柱狀圖

有了上面的知識,學習柱形圖也很簡單,有些東西都是通用的,現在來介紹柱形圖方面的知識,先看官網的某個案例:https://echarts.apache.org/examples/zh/editor.html?c=bar-tick-align
一看,需要注意的是series裡的type和barWidth,其它的上面已經介紹過了,如下圖:
在這裡插入圖片描述
bar代表柱形圖,line代表折線圖,這裡要分清,跟bar相關的屬性是barWidth,柱形的寬度,不用說,更詳細請看下圖。
在這裡插入圖片描述
下一個,左右拖動工具:
在這裡插入圖片描述
對於上副圖的左右滑動,寬度可能會隨著滑動變大,可以用barMaxWidth對其做限制,寫在series裡,程式碼如下:

barMaxWidth:"60px", //最大不要超過60%

說到寬度,應該是柱形與柱形之間的距離,有兩個名詞,一個是barGap和barCategoryGap,第一個是不同series(就是series裡面的兩個物件),同一個刻度線上的柱形之間的距離。第二個是同一個series上,柱形與柱形的距離。
最後,如果柱形圖的x軸和y軸交換,就變成了條形圖,本質上還是柱形圖,如圖:
在這裡插入圖片描述

8. 作業案例之進度柱狀圖

網址:https://echarts.apache.org/examples/zh/editor.html?c=bar-y-category

在這裡插入圖片描述
在這裡插入圖片描述
完整程式碼:

var myColor=["#1089E7","#F57474","#56D0E3","#F8B448","#8B78F6"];
option = {
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: {
        show:false
        /*type: 'value',
        boundaryGap: [0, 0.01]*/
    },
    yAxis: [
        {
            type: 'category',
            data: ['HTML5', 'CSS3', 'JAVASCRIPT', 'VUE', 'NODE', 'JQUERY'],
            axisLine:{
                show:false
            },
            axisTick:{
                show:false
            },
            inverse:true //反向座標,不然HTML5在最底下
        },
        {
            type: 'category',
            data: [702,350, 610, 793, 664, 700],
            axisLine:{
                show:false
            },
            axisTick:{
                show:false
            },
            inverse:true
        }
    ],
    series: [
        {
            name: '條',
            type: 'bar',
            data: [70, 34, 60, 78, 69, 71],
            itemStyle:{
                normal:{
                    barBorderRadius:10,
                    color:function(params){//params存的是2011年的六個柱子(物件)的索引號
                        //console.log(params);
                        //注意列印出來的params裡面有dataIndex屬性,index是索引的
                        //意思,從0開始,右圖有六個柱子,那麼索引就是0~5,
                        //剛好跟上面的myColor的陣列索引是一致的,那麼就可以來完成
                        //五彩繽紛的柱子了。
                        return myColor[params.dataIndex];
                    }
                },
                
            },
            barCategoryGap:30, //柱子之間的距離,barGap是同一個型別下的柱子的距離
            //barWidth:14 //柱子的寬度
            //圖形上的文字標籤
            label:{
                normal:{
                    show:true,
                    position:"inside",//inside表示圖形內顯示
                    formatter:"{c}%"//{c}會自動解析data裡面的資料
                }
            },
            yAxisIndex:0
        },
        {
            name: '框',
            type: 'bar',
            data: [100, 100, 100, 100, 100, 100],
            itemStyle:{
                color:"none",
                borderColor:"#00c1de",
                borderWidth:3,
                barBorderRadius:15
            },
            yAxisIndex:1
        }
    ]
};

9. 作業案例之餅圖

首先,開啟網址:https://echarts.apache.org/examples/zh/editor.html?c=pie-doughnut,如圖:
在這裡插入圖片描述
完整程式碼:

option = {
    tooltip: {
        trigger: 'item',//axis是針對直角座標系的,否則,將沒有提示框元件
        formatter: '{a} <br/>{b}: {c} ({d}%)'  //這裡的{a}在tooltip那裡已經講過了
    },
    legend: {
        orient: 'vertical', //垂直顯示
        left: 10,
        //data: ['直接訪問', '郵件營銷', '聯盟廣告', '視訊廣告', '搜尋引擎'],//可以省略,因為可以看
        //series裡面的資料
        itemWidth:10,
        itemHeight:10,
        //bottom:10
        textStyle:{
            //color:"red",
            fontSize:"16"
        }
    },
    series: [
        {
            name: '訪問來源',
            type: 'pie', //pie表示餅圖
            radius: ['50%', '70%'],//直角座標系是通過grid來修改圖表的大小的,那麼此處
            //餅圖是通過radius來修改餅圖大小的,數值的第一個50%表示餅圖的內部半徑,
            //第二個70%表示外部圓的半徑,如右圖:
            //如果我把50%改為0%,就成了真正意義上的餅圖
            center:["60%","50%"],//這個可以修改餅圖的位置,此處為居中
            avoidLabelOverlap: false,
            //avoidLabelOverlap是否啟用防止標籤重疊策略,預設開啟,在標籤擁擠重疊的情況下會挪動各個標籤的位置,防止標籤間的重疊。
            label: { //label為標籤,就是給每個系列貼上一個標籤,別人一看就知道誰誰誰
                show: false, //表示對應的標籤一上來是不顯示的,要跟下面emphasis裡的label做對比
                /*position: 'center'*/ //表示中間顯示
            },
            emphasis: {//emphasis這東西,我們在前面都有接觸過,
            //在講散點圖也好,series,toolbox這些都有涉及到emphasis,經過對比,
            //它們的共同點都是當滑鼠移入到某個item的時候,觸發的事件,起到了一種
            //強調的作用,那麼右圖是不是這個道理呢?當我們移入到餅圖的item,也就是
            //外面的哪些圈圈,你一移入,在餅圖的外圍就會有對應的文字來強調你是"搜尋引擎"
            //還是啥的,沒錯,像這種外圍提示資訊在滑鼠移入的時候就是在emphasis裡面配置的,如果我們把
            //它給註釋掉的話,滑鼠移進去就不會有外圍文字的提示資訊了,所以,以後遇到emphasis的時候
            //就要注意了,它跟你滑鼠移入有關,起到的是一個強調作用。
                label: {
                    show: true,//當滑鼠移進去從上面label屬性的show為false就是不顯示變為顯示,如右圖的"搜尋引擎"
                    fontSize: '30',
                    fontWeight: 'bold'
                }
            },
            labelLine: { //連線線
                show: true
            },
            data: [
                {value: 335, name: '直接訪問'},
                {value: 310, name: '郵件營銷'},
                {value: 234, name: '聯盟廣告'},
                {value: 135, name: '視訊廣告'},
                {value: 1548, name: '搜尋引擎'}
            ]
        }
    ]
};

接下來是餅形圖的升級,叫南丁格爾玫瑰圖,網址:https://echarts.apache.org/examples/zh/editor.html?c=pie-roseType

在這裡插入圖片描述
經過了跟普通餅形圖的對比,發現南丁格爾玫瑰圖多了一個roseType屬性,因為有了這個屬性,才會呈現出南丁格爾效果。

option = {
    tooltip: {
        trigger: 'item',
        formatter: '{a} <br/>{b} : {c} ({d}%)'
    },
    legend: {
        left: 'center',
      /*top: 'bottom',*/
        //data: ['rose1', 'rose2', 'rose3', 'rose4', 'rose5', 'rose6', 'rose7', 'rose8']
    },
    series: [
        {
            name: '半徑模式', //是通過圓的半徑來表示每一個模組的大小
            type: 'pie',
            radius: [20, 110], //[內圓半徑,外圓半徑]
            center: ['25%', '50%'],
            roseType: 'radius',//radius表示以半徑的形式來展示,這個是重點,可以形成南丁格爾玫瑰圖
            label: {
                show: false
            },
            emphasis: {
                label: {
                    show: true
                }
            },
            data: [
                {value: 10, name: 'rose1'},
                {value: 5, name: 'rose2'},
                {value: 15, name: 'rose3'},
                {value: 25, name: 'rose4'},
                {value: 20, name: 'rose5'},
                {value: 35, name: 'rose6'},
                {value: 30, name: 'rose7'},
                {value: 40, name: 'rose8'}
            ]
        },
        {
            name: '面積模式',
            type: 'pie',
            radius: [30, 110],
            center: ['75%', '50%'],
            roseType: 'area',//radius表示以面積的形式來展示
            labelLine:{
                length:100,//length是連結圖形的線條
                length2:30  //是與length拼接的那條線,右圖中水平的那條線
            },
            data: [
                {value: 10, name: 'rose1'},
                {value: 5, name: 'rose2'},
                {value: 15, name: 'rose3'},
                {value: 25, name: 'rose4'},
                {value: 20, name: 'rose5'},
                {value: 35, name: 'rose6'},
                {value: 30, name: 'rose7'},
                {value: 40, name: 'rose8'}
            ]
        }
    ]
};

10. 跟隨螢幕縮放適配

比如:
在這裡插入圖片描述
這個圖表並沒有隨著螢幕的縮小而縮小,進行自適應,那麼怎麼讓其自適應呢,讓它隨著頁面的變化進行自動適配?

window.addEventListener("resize",function () {
    this.myChart.resize(); //如果不起作用,試著把外層盒子的寬度去掉,不要寫固定值
})

在這裡插入圖片描述
像這樣就ok了。

11. 學習案例之雷達圖

 雷達圖又稱為蜘蛛網圖,將多個緯度的資料量對映到起始於同一個圓心的座標軸上,結束於圓角邊緣,然後將同一組的點使用線連線起來。它適用於多維度資料集,比如遊戲人物有多個指標,什麼攻擊值呀,輸出值呀等等這些。表示一個物體在多個緯度之下的綜合資訊。比如:
在這裡插入圖片描述
上面5個評分,就有5個緯度,5個緯度在雷達圖就是5個角,那麼我們怎麼用雷達圖來表示上圖的資料呢?網址:https://echarts.apache.org/examples/zh/editor.html?c=radar,開啟這個網址,根據它做改造,完成雷達圖。
在這裡插入圖片描述
特點:雷達圖可以用來分析多個緯度的資料與標準資料的對比情況,通過它不僅可以看到自身的情況指標還可以跟其它人進行對比,比如上述的華為跟中心的對比。

12. 學習案例之儀表盤

 儀表盤主要用在進度把控以及資料範圍的監測。比如用汽車儀表盤,用儀表盤來監控商品庫存的情況等等,它可以更直觀的表現出某個指標的進度或實際情況。網址:https://echarts.apache.org/examples/zh/editor.html?c=gauge,開啟該網址,進行改造,程式碼如下:
在這裡插入圖片描述
在這裡插入圖片描述
完整程式碼:

option = {
    tooltip: {
        formatter: '{a} <br/>{b} : {c}%'
    },
    series: [
        {
            name: '庫存指標',
            type: 'gauge', //翻譯過來叫"測量",此處代表該圖表是儀表盤
            detail: {formatter: '{value}%'},
            startAngle:180,//預設是225,startAngle要大於endAngle
            endAngle:-90, //預設是-45
            splitNumber:2,//如右圖0~50,50~100
            data: [
                //一個物件表示一個指標,兩個物件就表示兩個指標
                {
                    value: 97, 
                    name: '庫存量',
                    itemStyle:{ //控制指標的樣式
                       /* color:"blue"*/
                    }
                },
                 /*{
                    value: 50, 
                    name: '庫存量',
                    itemStyle:{ //控制指標的樣式
                        color:"pink"
                    }
                }*/
            ],
            axisTick:{
                show:true,
                splitNumber:10,//0~50分10段,50~100也分為10段,因為上面splitNumber分為了兩段,所以每一段又分10段
                length:18,
                lineStyle:{
                    color:"width"
                }
            },
            axisLabel:{
                show:true,
                formatter:function(arg){
                    switch(arg+""){
                        case '0':return "非常弱";
                        case '50':return "弱";
                        case "100":return "強";
                    }
                }
                /*dformatter:function(arg){ //注意這不是formatter,而是dformatter,如果是這樣,就只是顯示數字
                    switch(arg+""){
                        case '50':return "弱";
                        case "100":return "強";
                    }
                }*/
            },
            /*min:50,
            max:150*/
            //max和min是控制儀表盤的數值範圍的,預設是0~100
            splitLine:{//表示分割線,0~50,50~100。那麼50哪裡就是分割線
                show:true,
                length:50,
                lineStyle:{
                    width:15
                }
            },
            pointer:{
                color:"auto"//auto表示直接去所指向的區域取色
            },
            title:{
                show:true,
                offsetCenter:['-65%',-30]//表示[x,y],這裡表示往左偏移百分之65,往上偏移30px
            },
            detail:{
                backgroundColor:"yellow",
                offsetCenter:['-60%',50],
                formatter:"{value}%"
            }
        }
    ]
};

13. 地圖(包括疫情實時圖,點亮城市)

製作地圖,首先要引入china.js檔案,沒有就去下載,然後引入:

<script src="js/china.js"></script>

有了它,我們就不用像下面這麼麻煩了。
在這裡插入圖片描述

引入完之後,第二步,就是在series中,type為map,map就是地圖,當然這還不夠,你還要告訴它是哪種地圖?如下:
在這裡插入圖片描述
像這樣,一個簡單的地圖就出來了。
在這裡插入圖片描述
在上面的基礎上我們疊加一個熱度圖,比如像各省份GDP大小,疫情實時地圖,重災區的顏色深,非重災區的顏色淺,這要怎麼做,下面是完整程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
           /* width: 900px;*/
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
<script src="js/echarts.min.js"></script>
<script src="js/jquery-3.5.1.js"></script>
<script src="js/china.js"></script>
<div class="box"></div>  <!--有了這個容器,就可以把圖表丟在這裡面去-->
<script language="javascript">
    //初始化例項物件 echarts.init(dom容器);
    var myChart = echarts.init(document.querySelector(".box"));
    //指定配置項和資料
    // 指定圖表的配置項和資料
    option = {
        title:{
            text:"中國疫情實時地圖"
        },
        tooltip: {

        },
        series: [
            {
               name:"確診人數",
               type:"map",
               map:"china",
               label:{
                   //控制對應省份地區的漢字
                   show:true  //預設為false,如果為true,那麼地圖一渲染包括各個省份的名字也跟隨地圖一起渲染
                   //既然是控制漢字的,那麼像color,fontSize,formatter啊這些它都有,我這裡就不列出來了。
               },
               zoom:1, //控制地圖的放大縮小,如果你覺得地圖有點小,可以使用zoom屬性來對它放大,如果值為2,表示2倍放大
               roam:true, //控制滾輪放大縮小
               itemStyle:{ //控制地圖版塊的
                   areaColor:"pink" //預設色為#eee
               },
               emphasis:{//控制滑鼠滑過之後的背景色和字型顏色
                   itemStyle:{
                       areaColor:"#83b5e7" //預設是不是yellow
                   },
               },
               data:[ //用來展示後臺給的資料的,裡面是如果是每一個物件,那麼每個物件都得有name和value

               ]
            }
        ],
        visualMap:[{
            type:"piecewise",  //翻譯過來是分段,預設分成5條
            show:true,
            /* splitNumber:4,*/
            pieces:[
                {min:10000},
                {min:1000,max:9999},
                {min:100,max:999},
                {min:10,max:99},
                {min:1,max:9}
            ],
            //align:"right", //這樣的話,方塊在右邊,字在左邊,預設是left
            //orient:"horizontal"  //控制是橫向顯示還是豎向顯示
            //showLabel:false  為false表示數字被隱藏了
            inRange:{
                //symbol:"circle"
                symbol:"rect",
                color:["#ffc0b1","#9c0505"]
            },
            itemWidth:20,
            itemHeight:10
        }]
    };
    myChart.setOption(option);
    window.addEventListener("resize",function () {
        this.myChart.resize(); //如果不起作用,試著把外層盒子的寬度去掉,不要寫固定值
    })
    $.ajax({
        type: "post",
        url: "https://interface.sina.cn/news/wap/fymap2020_data.d.json?_=1580892522427",
        dataType: "jsonp",//返回的資料型別格式,jsonp解決跨域問題
        success: function(data){
            var list = data.data.list.map(item=>({name:item.name,value:item.value}));//map是迴圈遍歷方法,我們只要name和value
            option.series[0].data = list;
            myChart.setOption(option);
        },
        error:function(msg){
            console.log(msg);
        }
    });
</script>
</body>
</html>

把上面程式碼copy到你編輯器就可以了,自己再去改改,效果如下:
在這裡插入圖片描述
可以對照著http://cov.aiiyx.cn來看,它是中國疫情資料視覺化圖。

練習:利用搜尋框輸入城市名來點亮城市

通過疫情實時地圖,我們基本對地圖的相關配置有了瞭解,再通過一個點亮城市的練習,加深理解,下面是我自己寫的程式碼實現,供大家參考:

專案結構(在前面有網盤連結,供下載):
在這裡插入圖片描述
完整程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="layui/css/layui.css"  media="all" type="text/css">
    <style>
        .box{
            /* width: 900px;*/
            height: 700px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
<script src="js/echarts.min.js"></script>
<script src="js/jquery-3.5.1.js"></script>
<script src="js/china.js"></script>
<script src="layui/layui.js"></script>
<div class="box"></div>  <!--有了這個容器,就可以把圖表丟在這裡面去-->
<script language="javascript">
    var diming = "";
    // 一種後臺傳來的資料帶有座標,一種是前臺儲存座標
    var data = [
        {name:'泉州'},
        {name:'廈門'},
        {name:'福州'},
        {name:'延安'},
        {name:'瀋陽'},
        {name:'蘇州'},
        {name:'杭州'},
        {name:'廣州'}
    ];
    // 位置對應的座標
    var geoCoordMap = {
        "泉州":[118.58,24.93],
        "廈門":[118.1,24.46],
        "福州":[119.3,26.08],
        "延安":[109.47,36.6],
        "瀋陽":[123.38,41.8],
        "蘇州":[120.62,31.32],
        "杭州":[120.19,30.26],
        "廣州":[113.18,23.10]
    };
    // 將{name:xx}處理成{name:xx,value:[x,y]};x,y為橫縱座標
    var convertData = function (data) {
        var res = [];
        for (var i = 0; i < data.length; i++) {
            var geoCoord = geoCoordMap[data[i].name];
            if (geoCoord) {
                res.push({
                    name: data[i].name,
                    value: geoCoord
                });
            }
        }
        return res;
    };
    //初始化例項物件 echarts.init(dom容器);
    var myChart = echarts.init(document.querySelector(".box"));
    var zData = convertData(data);
    var option = {
        backgroundColor: '#404a59',
        tooltip: {
            trigger: 'item',
            formatter: function (params) {
                return params.name;
            }
        },
        geo: {
            map: 'china',
            roam:true, //控制滾輪放大縮小
            label: {
                emphasis: {
                    show: false //不顯示省份名稱
                }
            },
            itemStyle: {
                normal: {
                    areaColor: '#fff',
                    borderColor: '#000'
                },
                emphasis: {
                    areaColor: '#f00'
                }
            }
        },
        series: [
            {
                type: 'effectScatter',
                showEffectOn:'render',//預設值是render,控制滑鼠移入產生動畫
                coordinateSystem: 'geo',
                data: zData,
                // 控制點大小
                symbolSize: function (arg) {
                    layui.use(['form'], function(){
                        var form = layui.form;
                        //監聽提交
                        form.on('submit(demo1)', function(data){
                            var city = data.field.title;//輸入的城市名
                            diming = city;
                            myChart.setOption(option);
                            return false;
                        });
                    })
                    if(diming==""){
                        return 2;
                    }else{
                        var zuobiao  = geoCoordMap[diming];//根據城市名拿到座標
                        if(arg.toString() == zuobiao.toString()){
                            return 30;
                        }else{
                            return 2;
                        }
                    }
                },
                label: {
                    normal: {
                        show: false
                    },
                    emphasis: {
                        show: false
                    }
                },
                itemStyle: {
                    color:"red",
                    emphasis: {
                        borderColor: 'yell',
                        borderWidth: 1
                    }
                }
            }
        ]
    };
    myChart.setOption(option);
</script>
<div style="margin: 10px auto;border: 1px solid red;width: 400px">
    <form class="layui-form" action="">
        <div class="layui-form-item">
            <label class="layui-form-label">城市:</label>
            <div class="layui-input-block" style="width: 200px">
                <input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="請輸入城市名" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button type="submit" class="layui-btn" lay-submit="" lay-filter="demo1">定位</button>
                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </div>
    </form>
</div>
</body>
</html>

14. echarts涉及到的英文名

英文名中文名
Line折線圖
Bar柱狀圖
Scatter散點圖
EffectScatter連漪效果的散點圖
Pie餅圖
CandlestickK線圖(又叫蠟燭圖,陰陽線)
Map地圖
Gauge儀表盤
Funnel漏斗圖
Axis座標軸
Grid網格
Tooltip提示
Legend圖例
DataZoom資料區域縮放
Toolbox工具箱
series資料系列
visualMap視覺對映元件
emphasis強調;重視;重要性
symbol符號;比如線上的每個拐點
smooth光滑的
Label標籤
boundary邊界
Gap差距
category類別

相關文章