主頁 > 前端設計 > ECharts 從入門到進階 6000字長文 圖文并茂

ECharts 從入門到進階 6000字長文 圖文并茂

2021-10-02 09:57:53 前端設計

Echarts 快速上手

  1. 引入 echarts.js 檔案
  2. 準備一個呈現圖表的盒子
  3. 初始化echarts實體物件
  4. 準備配置項
  5. 將配置項設定給echarts實體物件
<div style='width: 600px; height: 400px;'></div>
<script src="./lib/echarts.js"></script>
<script>
  // 基于準備好的dom,初始化echarts實體
  let myChart = echarts.init(document.querySelector('div'));
  // 指定圖表的配置項和資料
  let option = {
    title:{
      text:'ECharts 入門實體',
      link:'https://jiaqicoder.com',
      textStyle:{
        color:'pink',
        fontStyle:'normal'
      }
    },
    xAxis:{
      type:'category', // 類目軸
      data:['襯衫','羊毛衫','雪紡衫','褲子'] 
    },
    yAxis:{
      type:'value', // 數值軸
    },
    series:[{
      name:'銷量',
      type:'bar', //line pie
      data:[5,10,15,20]
    }]
  }
    // 使用剛指定的配置項和資料顯示圖表,
    myChart.setOption(option);
</script>

相關配置:

  • xAxis:直接坐標系中的x軸
  • yAxis:直角坐標系中的y軸
  • series:系列串列,每個系列通過type決定自己的圖表型別
  • title:標題組件,包含主標題和副標題,

image-20210924105806030

通用配置

通用配置指的就是任何圖表都能使用的配置,

標題 title

  • 文字樣式

    title:{
      text:'成績展示',
      textStyle:{
        color:'red',
        fontSize:'28px',
        fontWeight:800,
      },
    },
    
  • 標題邊框

    borderWidth:5,
    borderColor:'blue',
    borderRadius:5
    
  • 標題位置

    title:{
      text:'成績展示',
      textStyle:{
        color:'red',
        fontSize:'28px'
      },
    borderWidth:5,
    borderColor:'blue',
    borderRadius:5,
    left:100,
    top:20,
    },
    

    top 的值可以是像 20 這樣的具體像素值,可以是像 '20%' 這樣相對于容器高寬的百分比,也可以是 'top', 'middle', 'bottom'

    如果 top 的值為'top', 'middle', 'bottom',組件會根據相應的位置自動對齊,

提示 tooltip

tooltip:提示框組件,用于配置滑鼠滑過或者點擊圖表時的顯示框,

  • 觸發型別:trigger (可選)

    • 'item'

      資料項圖形觸發,主要在散點圖,餅圖等無類目軸的圖表中使用,

    • 'axis'

      坐標軸觸發,主要在柱狀圖,折線圖等會使用類目軸的圖表中使用,

    • 'none'

      什么都不觸發,

  • 觸發時機:triggerOn (可選)

    • 'mousemove'

      滑鼠移動時觸發,

    • 'click'

      滑鼠點擊時觸發,

    • 'mousemove|click'

      同時滑鼠移動和點擊時觸發,

  • 格式化:formatter

    提示框浮層內容格式器,支持字串模板和回呼函式兩種形式,

    字串模板:

    模板變數有 {a}, {b}{c}{d}{e},分別表示系列名,資料名,資料值等, 在 trigger 為 'axis' 的時候,會有多個系列的資料,此時可以通過 {a0}, {a1}, {a2} 這種后面加索引的方式表示系列的索引, 不同圖表型別下的 {a}{b}{c}{d} 含義不一樣, 其中變數{a}, {b}, {c}, {d}在不同圖表型別下代表資料含義為:

    • 折線(區域)圖、柱狀(條形)圖、K線圖 : {a}(系列名稱),{b}(類目值),{c}(數值), {d}(無)
    • 散點圖(氣泡)圖 : {a}(系列名稱),{b}(資料名稱),{c}(數值陣列), {d}(無)
    • 地圖 : {a}(系列名稱),{b}(區域名稱),{c}(合并數值), {d}(無)
    • 餅圖、儀表盤、漏斗圖: {a}(系列名稱),{b}(資料項名稱),{c}(數值), {d}(百分比)
    tooltip:{
      trigger:'axis',// 'item'
      triggerOn:'click',
      formatter:'{b} 的成績是 {c}', //{b}(類目值),{c}(數值)
    }
    

    回呼函式格式:

    支持回傳 HTML 字串或者創建的 DOM 實體,

    第一個引數 arg 是 formatter 需要的資料集

    tooltip:{
      trigger:'axis',// 'item'
      triggerOn:'click',
      formatter:function(arg){
        console.log(arg); // 可以列印看看 有什么值
        return `${arg[0].name}的分數是 ${arg[0].data}`; // 回傳值將會呈現在頁面中
      }
    },
    

工具按鈕 toolbox

內置有匯出圖片,資料視圖,動態型別切換,資料區域縮放,重置五個工具,

toolbox:{
  feature:{
    saveAsImage:{}, // 保存為圖片
    dataView:{}, //資料視圖
    restore:{}, // 重置功能
    dataZoom:{}, // 區域縮放
    magicType:{
      type:['line','bar']    // 切換圖表型別
    }
  }
},

image-20210924143614282

圖例 legend

legend:圖例,用于篩選系列,需要和series配合使用,

  • legend中的 data是一個陣列
  • legend中的data的值需要和series陣列中某組資料的name值一致
series: [
  {
    name: '語文成績',
    type: 'bar',
    data: [98, 88, 78, 80]
  },{
    name:'數學成績',
    data:[42,55,99,88],
    type:'bar'
  }
],
legend:{
  data:['語文成績','數學成績'], // 如果series中的name有值時,legend中的data可以不寫
}

image-20210924151308211

image-20210924151320748

ECharts的常用圖表

  • 柱狀圖 bar
  • 折線圖
  • 散點圖
  • 餅圖
  • 地圖
  • 雷達圖
  • 儀表盤圖

柱狀圖

實作步驟

  • ECharts 最基本的代碼結構:

    引入js檔案,設定DOM容器,初始化物件,設定options

  • x軸資料:

    資料1:[‘張三’,‘李四’,‘王五’,‘趙六’]

  • y軸資料:

    資料2:[88,92,79,79]

  • 圖表型別:

    在series下設定 type:bar

<body>
  <div style="width: 600px;height: 400px;"></div>
  <script src="./lib/echarts.js"></script>
  <script>

    let myCharts = echarts.init(document.querySelector('div'));
    myCharts.setOption({
      title: {
        text:'成績'
      },
      xAxis: {
        type: 'category',
        data: ['張三','李四','王五','趙六']
      },
      yAxis: {
        type: 'value'
      },
      series: [{
        name: '成績',
        data: [5, 10, 15, 20],
        type: 'bar'
      }],
    });
  </script>
</body>

常見效果

  • 標記:

  • 最大值 最小值(用markPoint來標記點)

    series: [{
      name: '成績',
      data: [5, 10, 15, 20],
      type: 'bar',
      markPoint:{
        data:[{
          type:'max',
          name:'最大值'
        },{
          type:'min',
          name:'最小值'
        }]
      }
    }]
    

    image-20210924114001186

  • 平均值(markLine)

```js
series: [{
  name: '成績',
  data: [5, 10, 15, 20],
  type: 'bar',
  markPoint:{
    data:[{
      type:'max',
      name:'最大值'
    },{
      type:'min',
      name:'最小值'
    }]
  },
  markLine:{
    data:[
      {
        type:'average',name:'平均值'
      }
    ]
  }
}],
```

![image-20210924114211478](https://img-blog.csdnimg.cn/img_convert/8c3d9ed360918c9ea879bfa349b9c3c5.png)
  • 顯示:

    • 數值顯示(label)

      series: [{
        name: '成績',
        data: [5, 10, 15, 20],
        type: 'bar',
        markPoint:{
          data:[{
            type:'max',
            name:'最大值'
          },{
            type:'min',
            name:'最小值'
          }]
        },
        markLine:{
          data:[
            {
              type:'average',name:'平均值'
            }
          ]
        },
        label:{
          show:true,
        }
      }],
      

      image-20210924114641529

    • 柱寬度(barWidth)

      series: [{
        name: '成績',
        data: [5, 10, 15, 20],
        type: 'bar',
        markPoint:{
          data:[{
            type:'max',
            name:'最大值'
          },{
            type:'min',
            name:'最小值'
          }]
        },
        markLine:{
          data:[
            {
              type:'average',name:'平均值'
            }
          ]
        },
        label:{
          show:true,
          position:'inside'
        },
        barWidth:'50%' // 調整為默認寬度的50%
      }],
      
    • 橫向柱狀圖

      將柱狀圖變為橫向的:

      xAxis: {
        type: 'value'
      },
      yAxis: {
        data: ['張三', '李四', '王五', '趙六'],
        type: 'category',
      }
      

      image-20210924115428763

折線圖

實作步驟

  • ECharts 最基本的代碼結構:

    引入js檔案,設定DOM容器,初始化物件,設定options

  • x軸資料:

    資料1:[‘1月’,‘2月’,‘3月’,‘4月’,‘5月’,‘6月’]

  • y軸資料:

    資料2:[88,92,79,79,39,99]

  • 圖表型別:

    在series下設定 type: line

let myChart = echarts.init(document.querySelector('div'));
myChart.setOption({
  title:{
    text:'康師傅方便面銷量',
    textStyle:{
      color:'blue'
    }
  },
  xAxis:{
    data:['1月','2月','3月','4月','5月','6月'],
    type:'category'
  },
  yAxis:{
    type:'value',
  },
  series:{
    name:'康師傅的銷量',
    type:'line',
    data:[35,29,38,88,69,89],
  },
  tooltip:{
    trigger:'item',
    formatter:'{b}的銷量為{c}'
  }
})

常見的效果

  • 標記

    • 最大值 最小值 markPoint

      series:{
        name:'康師傅的銷量',
        type:'line',
        data:[35,29,38,88,69,89],
        markPoint:{
          data:[
            {type:'max'},
            {type:'min'}
          ]
        },
      },
      
    • 平均值 markLine

      series:{
        name:'康師傅的銷量',
        type:'line',
        data:[35,29,38,88,69,89],
        markPoint:{
          data:[
            {type:'max'},
            {type:'min'}
          ]
        },
        markLine:{
          data:[
            {type:'average'}
          ]
        }
      }
      

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iKYaJfli-1632987640708)(C:\Users\singhand\AppData\Roaming\Typora\typora-user-images\image-20210924153332983.png)]

    • 標注區間 markArea

      series:{
        name:'康師傅的銷量',
        type:'line',
        data:[35,29,38,88,69,89],
        markPoint:{
          data:[
            {type:'max'},
            {type:'min'}
          ]
        },
        markLine:{
          data:[
            {type:'average'}
          ]
        },
        markArea:{
          data:[
            [
              {xAxis:'1月'}, // 開始月份
              {xAxis:'2月'}, // 結束月份
            ],
            [
              {xAxis:'3月'}, // 開始月份
              {xAxis:'5月'}, // 結束月份
            ],
          ]
        }
      },
      

      image-20210924160114696

  • 線條控制:

    • 平滑 smooth

      series:{
        name:'康師傅的銷量',
        type:'line',
        data:[35,29,38,88,69,89],
        smooth:true
      },
      

      image-20210924161756384

    • 線條樣式 lineStyle

      series:{
        name:'康師傅的銷量',
        type:'line',
        data:[35,29,38,88,69,89],
        smooth:true,
        lineStyle:{
          color:'green',
          type:'dotted', //solid dashed
        }
      },
      
    • 填充風格 areaStyle

      注意和markArea的區別,

      series:{
        name:'康師傅的銷量',
        type:'line',
        data:[35,29,38,88,69,89],
        smooth:true,
        lineStyle:{
          color:'green',
          type:'dotted', //solid dashed
        },
        areaStyle:{
          color:'pink'
        }
      },
      

      image-20210924162815962

      全部代碼:A Pen by liujiaqi222 (codepen.io)

    • 緊挨邊緣 boundaryGap

      默認和邊緣是存在距離的,注意此時bundaryGap的是放在 xAxis中的,

      image-20210924164058998

      xAxis: {
        data: ['1月', '2月', '3月', '4月', '5月', '6月'],
        type: 'category',
        boundaryGap:false, // 設定為無間隙
      },
      

      image-20210924164443113

    • 脫離0值比例縮放 scale

      如果數值相差無幾,且數值較大,此時發現y軸的坐標依舊從0開始,

      image-20210924164917454

      此時,就可以將scale屬性的值設定為true,允許坐標軸縮放,

      yAxis: {
        type: 'value',
        scale:true
      },
      

      image-20210924165202333

    • 堆疊圖 (stack的屬性值要設定為相同的)

      如果兩條不同的線,他們的數值波動較大就會出現如下的重疊情況,此時容易讓人眼花繚亂,

      image-20210924170852203

      因此可以將兩條線的stack屬性值設定為同一個值(任意設定),此時第一條仍然為第一條線,第二條線則為原來兩條線的總和(疊加),

      series: [{
        name: '康師傅的銷量',
        type: 'line',
        data: [3091, 900, 300, 2006, 1510, 1813],
        stack: 'all',
        // stack屬性值相同的serie,后面的serie的值將會疊加在前一個serie的值
        // 第二條線
      }, {
      
        name: '',
        type: 'line',
        data: [2000, 2328, 3282, 230, 1889, 1123],
        stack: 'all',
      }],
      

      image-20210924171151354

散點圖

散點圖可以幫助我們推斷變數間的相關性,

實作步驟

  • 引入js檔案,創建DOM容器,初始化物件,設定option

  • x軸資料和y軸的資料:二維陣列

    陣列1:[[身高1,體重1],[身高2,體重2],[身高3,體重3]]

  • 圖表型別:

    在series下設定type:scatter

    xAxis和yAxis的type都要設定為value

    const myChart = echarts.init(document.querySelector('div'));
    myChart.setOption({
      xAxis: {
        type: 'value',
        scale:true
      },
      yAxis: {
        type: 'value',
        scale:true
      },
      series: [{
        data: axisdata,
        type: 'scatter'
      }]
    })
    

常見的效果

  • 氣泡圖效果不同

    • 散點的大小不同

    • 散點的顏色不同

      series: [{
        data: axisdata,
        type: 'scatter',
        // symbolSize:10 ,// 改變散點的大小
        // 不同的元素,散點的大小不同
        symbolSize: function (arg) {
          const height = arg[0];
          const weight = arg[1];
          if ((weight / Math.pow(height / 100, 2) > 25)) {
            return 15;
          } 
            return 5;
          
        },
        // 控制樣式
        itemStyle: {
          // color:'green'
          color: function (arg) {
            const height = arg.data[0];
            const weight = arg.data[1];
            if ((weight / Math.pow(height / 100, 2) > 25)) {
            return 'pink';
          } 
            return 'blue';
          
          }
        }
      }]
      

      image-20210928121227440

  • 漣漪影片效果

    type: effectScatter

    series: [{
      data: axisdata,
      type: 'effectScatter',
      showEffectOn:'emphasis', // render(頁面加載完成后顯示) emphasis(滑鼠滑過的時候顯示)
      rippleEffect:{
        scale:5
      },
    }]
    

直角坐標系的常用配置

直角坐標系圖表:柱狀圖 折線圖 散點圖

配置1:網格grid

grid 是用來控制直接坐標系的布局和大小,

grid:{
  show:true, // 顯示grid
  borderWidth:10, // 邊框
  borderColor:'pink', //邊框顏色
  // grid的位置和大小
  top:120,  
  left:120,
  width:600,
  height:140,
},

image-20210928143034621

配置2:坐標軸axis

坐標軸分為x軸和y軸,一個grid中最多有兩種位置的x軸和y軸,

  • 坐標軸型別type

    value:數值軸,自動從目標資料中讀取資料

    category:類目軸,該型別需要通過data設定類目資料

  • 顯示位置 position

    xAxis:可取值為top或者bottom

    yAxis:可以取值left或者right

配置3:區域縮放 dataZoom

dataZoom 用于資料縮放,對資料范圍過濾,x軸和y軸都可以擁有,

dataZoom 是一個陣列,意味著可以配置多個區域縮放器,

  • type

    slider:滑塊

    image-20210928145615405

    inside:內置,依靠滑鼠滾輪或者雙指縮放

    image-20210928145636483

    dataZoom:[{
      type: 'inside' // slider 滑塊 inside:內置,依靠滑鼠滾輪或者雙指縮放
    }],
    
  • 指明 dataZoom 作用的坐標軸

    xAxisIndex:設定縮放組件控制的是哪個x軸,一般寫0即可

    yAxisIndex:設定縮放組件控制的是哪個y軸,一般寫0即可

    dataZoom: [
      {
        // slider 滑塊 inside:內置,依靠滑鼠滾輪或者雙指縮放
        type: 'slider', 
        xAxisIndex:0
      },
      {
        type: 'slider', 
        yAxisIndex:0
      }
    ],
    
  • 指明初始狀態的縮放情況

    start:資料視窗范圍的起始百分比

    end:資料視窗范圍結束的百分比

    dataZoom: [
      {
        // slider 滑塊 inside:內置,依靠滑鼠滾輪或者雙指縮放
        type: 'slider', 
        xAxisIndex:0
      },
      {
        type: 'slider', 
        yAxisIndex:0,
        start:0,
        end:50 //指的是最高點的50%
      }
    ],
    

餅圖

餅圖可以很好地幫助用戶快速了解不同分類的資料占比情況,

實作步驟

  • ECharts 最基本的代碼結構:

    引入js檔案,設定DOM容器,初始化物件,設定options

  • 資料準備:

    [{name:'淘寶',value:11232},{name:'閑魚',value:5632},{name:'京東',value:7885},{name:'拼多多',value:4632}]

  • 圖表型別:

    在series下設定type:pie

    const myChart = echarts.init(document.querySelector('div'));
    myChart.setOption({
      series:[{
        type:'pie',
        data:[{name:'淘寶',value:11232},{name:'閑魚',value:5632},{name:'京東',value:7885},{name:'拼多多',value:4632}]
      }]
    });
    

常見效果

  • 顯示數值

    label.formatter

    series:[{
      type:'pie',
      data:[{name:'淘寶',value:11232},{name:'閑魚',value:5632},{name:'京東',value:7885},{name:'拼多多',value:4632}],
      label:{
        // 是否顯示標簽 
        show:true, //默認為true
        //決定文字顯示的內容
        // formatter:'{b}-{c}-{d}%', // 淘寶-11232-28.23%
        formatter:function(arg){
          return `${arg.name}-${arg.value}`;
        }
      }
    }]
    

    image-20210928153224578

  • 圓環

    設定兩個半徑 radius:['40%','80%']

    series: [{
      type: 'pie',
      data: [{ name: '淘寶', value: 11232 }, { name: '閑魚', value: 5632 }, { name: '京東', value: 7885 }, { name: '拼多多', value: 4632 }],
      // 20代表20px;20%代表相對于其容器的高度或者寬度較小的值的一半
      radius: ['40%', '80%'],   // 較小的圓半徑為40%,較大的為80%
    
    }]
    
    image-20210928153703675
  • 南丁格爾圖:

    roseType:'radius'

    myChart.setOption({
      series: [{
        type: 'pie',
        data: [{ name: '淘寶', value: 11232 }, { name: '閑魚', value: 5632 }, { name: '京東', value: 7885 }, { name: '拼多多', value: 4632 }],
        roseType: 'radius' //南丁格爾圖 餅圖的每塊半徑都不一樣
      }]
    });
    

    image-20210928154303804

  • 選中效果

    // 設定為single 選中的一部分會偏離圓點一小段 選中其他的之前的選中塊又會回來
    // selectedMode:'single' 
    selectedMode:'multiple', // 選中其他塊,偏離不會回來
    // 設定偏離的距離
    selectedOffset:30
    

    image-20210928154757511

地圖

地圖可以幫助我們從宏觀的角度快速地分析出不同地理位置上的資料差異,官網檔案

地圖圖表的使用方式:

  • 百度地圖Api

    需要申請百度地圖的 access key

  • 矢量地圖

    需要準備矢量地圖的資料

實作步驟

  • ECharts 最基本的代碼結構:

    引入js檔案,設定DOM容器,初始化物件,設定options

  • 準備中國的矢量地圖json檔案,放到json/map/的目錄下

  • 使用ajax獲取china.json

  • 在回呼函式中向echarts全域物件注冊地圖json資料

    echarts.registerMap('chinaMap',chinaJson)

  • 在geo節點下設定 type:'map' map:'chinaMap'

    const myChart = echarts.init(document.querySelector('div'));
    fetch('./JSON/map/china.json').then(res=>res.json()).then((data)=>{
      echarts.registerMap('chinaMap',data); //echarts全域物件注冊地圖json資料
      myChart.setOption({
        geo:{
          type:'map', 
          map:'chinaMap'
        }
      })
    })
    

    image-20210928162654623

常用配置

  • 縮放拖動

    roam

  • 名稱顯示

    label

  • 初始縮放比例

    zoom

  • 地圖中心點

    center

const myChart = echarts.init(document.querySelector('div'));
fetch('./JSON/map/china.json').then(res=>res.json()).then((data)=>{
  echarts.registerMap('chinaMap',data);
  myChart.setOption({
    geo:{
      type:'map',
      map:'chinaMap',
      roam:true, // 設定允許縮放以及允許拖動地圖
      // 只縮放 scale 只拖動 move
      label:{
        show:true, //展示所有標簽
      },
      zoom:1,//設定初始化縮放比例
      center:[99,40] //根據經度緯度設定 某個地區為中心
    }
  })
})

常見效果

不同的城市顯示不同的顏色

  1. 顯示基本的中國地圖

  2. series中設定城市的空氣質量

  3. 將series下的資料和geo關聯在一起

    geoIndex:0 ,type:'map'

  4. 結合visualMap配合使用

    min max inRange

        const myChart = echarts.init(document.querySelector('div'));
        const airData = [
            { name: '北京', value: 39.92 },
            { name: '天津', value: 39.13 },
            { name: '上海', value: 31.22 },
            { name: '重慶', value: 66 },
            { name: '河北', value: 147 },
            { name: '河南', value: 113 },
            { name: '云南', value: 25.04 },
            { name: '遼寧', value: 50 },
            { name: '黑龍江', value: 114 },
            { name: '湖南', value: 175 },
            { name: '安徽', value: 117 },
            { name: '山東', value: 92 },
            { name: '新疆', value: 84 },
            { name: '江蘇', value: 67 },
            { name: '浙江', value: 84 },
            { name: '江西', value: 96 },
            { name: '湖北', value: 273 },
            { name: '廣西', value: 59 },
            { name: '甘肅', value: 99 },
            { name: '山西', value: 39 },
            { name: '內蒙古', value: 58 },
            { name: '陜西', value: 61 },
            { name: '吉林', value: 51 },
            { name: '福建', value: 29 },
            { name: '貴州', value: 71 },
            { name: '廣東', value: 38 },
            { name: '青海', value: 57 },
            { name: '西藏', value: 24 },
            { name: '四川', value: 58 },
            { name: '寧夏', value: 52 },
            { name: '海南', value: 54 },
            { name: '臺灣', value: 88 },
            { name: '香港', value: 66 },
            { name: '澳門', value: 77 },
            { name: '南海諸島', value: 55 }
        ]
        fetch('./JSON/map/china.json').then(res => res.json()).then(data => {
          // console.log(data);
          echarts.registerMap('chinaMap',data);
          myChart.setOption({
            geo:{
              map:'chinaMap',
              type:'map'
            },
            series:[{
              data:airData,
              // 將series下的資料和geo關聯起來
              geoIndex:0, //將空氣質量的資料和第0個geo配置關聯在一起
              type:'map',
            }],
            visualMap:{
              min:0,
              max:300,
              inRange:{
                color:['white','red'] //修改顏色
              }
            }
          })
        })
    

    image-20210928175640244

    另外,還有一個屬性為 calcuable, 將其設定為 true,通過拖動手柄可以對其篩選,下圖篩選的是0~118的資料

    image-20210928175816418

地圖和散點圖結合使用

  1. 給series下增加新的物件

  2. 準備好散點資料,設定給新物件的data

  3. 配置新物件的type

    type:effectScatter

  4. 讓散點圖使用地圖坐標系統

    coordinateSystem:‘geo’

  5. 讓漣漪效果更加明顯

    rippleEffect:{scale:10}

    series: [
      {
        type: 'effectScatter',
        data: scatterData,
        coordinateSystem: 'geo', // 指明散點使用的坐標系,geo的坐標系
        rippleEffect: {
          scale: 10, //設定漣漪影片的效果的大小
        }
      }
    ],
    

    image-20210929170828567

雷達圖

雷達圖可以用來分析多個維度的資料與標準資料的對比情況,

實作步驟

  • ECharts 最基本的代碼結構:

    引入js檔案,設定DOM容器,初始化物件,設定options

  • 在radar節點下定義各個維度的最大值

    indicator:[{name:‘易用性’,max:100},{name:‘功能’,max:100},{name:‘拍照’,max:100},{name:‘跑分’,max:100},{name:‘續航’,max:100}]

  • 準備具體產品的資料

    data: [{ name: ‘華為手機1’, value: [48, 88, 99, 66, 77] }, { name: ‘小米手機’, value:[88, 90, 89, 95, 87] }]

  • 圖表型別

    在series下設定type:radar

    const myChart = echarts.init(document.querySelector('div'));
    myChart.setOption({
      radar: {
        indicator: [{ name: '易用性', max: 100 }, { name: '功能', max: 100 }, { name: '拍照', max: 100 }, { name: '跑分', max: 100 }, { name: '續航', max: 100 }],
    
      },
      series: [{
        type: 'radar',
        data: [{ name: '華為手機1', value: [48, 88, 99, 66, 77] }, { name: '小米手機', value:[88, 90, 89, 95, 87] }]
      }]
    })
    

    image-20210929172444874

常用配置

  • 顯示數值

    label:true

  • 區域面積(配置在series節點下)

    areaStyle:{}

  • 配置雷達圖最外層的展示型別(配置在radar節點下)

    shape:‘circle’ // 默認為polygen

    myChart.setOption({
      radar: {
        indicator: [{ name: '易用性', max: 100 }, { name: '功能', max: 100 }, { name: '拍照', max: 100 }, { name: '跑分', max: 100 }, { name: '續航', max: 100 }],
        shape:'circle' // 默認值為polygon
      },
      series: [{
        type: 'radar',
        data: [{ name: '華為手機1', value: [48, 88, 99, 66, 77] }, { name: '小米手機', value:[88, 90, 89, 95, 87] }],
        areaStyle:{}
      }],
      label:{
        show:true
      },
       legend:{}
    })
    

    image-20210929173611589

儀表盤

儀表盤主要用在進度把控以及資料范圍的監控,

實作步驟

  • ECharts 最基本的代碼結構:

    引入js檔案,設定DOM容器,初始化物件,設定options

  • 準備資料,設定給series下的data

    data:[{value:97}]

  • 圖表型別:

    在series下設定type:gauge

    const myChart = echarts.init(document.querySelector('div'));
    myChart.setOption({
      series: [
        {
          data: [
            { value: 97 },// 每一個物件就代表一個指標
            // 每一個物件就代表一個指標
          ],
          type: 'gauge'
        }
      ]
    })
    

    image-20210929175100354

常見效果

  • 數值范圍:

    min、max來控制

    myChart.setOption({
      series: [
        {
          data: [
            { value: 97 },// 每一個物件就代表一個指標
            // 每一個物件就代表一個指標
          ],
          type: 'gauge',
          min:50 //控制儀表盤的范圍
        }
      ],
    })
    

    image-20210929175328268

總結

特點總結

  • 柱狀圖:柱狀圖描述的是分類資料,呈現的是每一個分類中有多少?,圖表所表達出來的含義在于不同類別 資料的排名對比情況
  • 折線圖:折線圖更多的使用來呈現資料隨時間的『變化趨勢』
  • 散點圖:散點圖可以幫助我們推斷出不同維度資料之間的相關性,比如在之前的例子中,看得出身高和體重是正相關, 身高越高, 體重越重;散點圖也經常用在地圖的標注上,
  • 餅圖:餅圖可以很好地幫助用戶快速了解不同分類的資料的占比情況
  • 地圖:地圖主要可以幫助我們從宏觀的角度快速看出不同地理位置上資料的差異
  • 雷達圖:雷達圖可以用來分析多個維度的資料與標準資料的對比情況
  • 儀表盤:儀表盤可以更直觀的表現出某個指標的進度或實際情況

配置項總結

image-20210930093001344

Echarts 進階

顯示相關

主題

內置主題

Echarts 內置了兩套主題:light dark,

  • 在初始化物件方法init中可以宣告

    const chart = echarts.init(dom,'light');

    dark主題

自定義主題

  1. 在主題編輯器中編輯主題

    image-20210930102607631

  2. 下載主題,是一個js檔案

  3. 引入主題js檔案

  4. 在init方法中使用主題

調色板

調色盤

它是一組顏色,圖形和系列會自動從中選取顏色,

  • 主題調色盤

    操作上面定義主題一樣

  • 全域調色盤

    如果配置了,將會覆寫主題的調色盤:myCharts.setOption({color:['red','green','blue']})

  • 區域調色盤

    series:[{type:'bar',color:['red','green','blue']}]

顏色漸變

  • 線性漸變

    series: {
      data: [83, 98, 90, 89, 92],
      type: 'bar',
      markPoint: {
        data: [
          {
            type: 'max',
            name: '最大值'
          },
          {
            type:'min',
            name:'最小值'
          }
        ]
      },
      markLine:{
        data:[{
          type:'average',
          name:'平均值'
        }]
      },
      label:{
        show:true,
        position:'inside'
      },
      barWidth:'40%',
      itemStyle:{
        color:{
          type:'linear', // 線性漸變
          x:0, // 定義顏色漸變的方向
          y:0,
          x2:0,
          y2:1,
          colorStops:[
            {offset:0,color:'red'}, // 百分之0處的顏色為紅色
            {offset:1,color:'pink'} // 百分之100處的顏色為藍色 
          ]
        }
      }
    }
    

    image-20210930105849775

  • 徑向漸變

    itemStyle:{
      // color:{
      //   type:'linear', // 線性漸變
      //   x:0, // 定義顏色漸變的方向
      //   y:0,
      //   x2:0,
      //   y2:1,
      //   colorStops:[
      //     {offset:0,color:'red'}, // 百分之0處的顏色為紅色
      //     {offset:1,color:'pink'} // 百分之100處的顏色為藍色 
      //   ]
      // }
      color:{
        type:'radial',
        x:0.5, // 圓心的x坐標
        y:0.5, // 圓心的y坐標
        r:1, // 半徑
        colorStops:[
          {offset:0,color:'red'},
          {offset:1,color:'blue'}
        ]
    
      }
    }
    

    image-20210930110554025

樣式

直接樣式和高亮樣式,優先級較高,會覆寫主題和調色盤的效果

直接樣式

itemStyle, textStyle, lineStyle, areaStyle, label

myChart.setOption({
  title:{
    text:'餅圖的測驗',
    // 2.textStyle
    textStyle:{
      color:'red'
    }
  },
  series: {
    color: ['blue', 'red', 'purple', 'pink', 'green'],
    type: 'pie',
    data: [{
      name: '張三', value: 33,
      // 1.itemStyle控制張三這一區域的樣式
      itemStyle: {
        color:'yellow'
      },
      // 3.label
      label:{
        color:'green'
      }
    },
    { 'name': '王五', value: 44 },
    { 'name': '趙六', value: 54 },
    { 'name': '李四', value: 39 },
    { 'name': '老張', value: 63 }
    ],
    label: {
      show: true,
      formatter: '{b}-{c}',
    }
  }
})

image-20210930112829865

高亮樣式

在 emphasis 中包裹 itemStyle, textStyle, lineStyle, areaStyle, label

series: {
  color: ['blue', 'red', 'purple', 'pink', 'green'],
  type: 'pie',
  data: [{
    name: '張三', value: 33,
    // 1.itemStyle控制張三這一區域的樣式
    itemStyle: {
      color:'yellow'
    },
    // 3.label
    label:{
      color:'green'
    },
    // 高亮樣式
    emphasis:{
      itemStyle:{color:'pink'},
      label:{color:'black'}
    }
  },
  { 'name': '王五', value: 44 },
  { 'name': '趙六', value: 54 },
  { 'name': '李四', value: 39 },
  { 'name': '老張', value: 63 }
  ],
  label: {
    show: true,
    formatter: '{b}-{c}',
  }
}
})

自適應

當瀏覽器的大小發生變化的時候,圖表也能隨之適配變化,

  1. 監聽視窗大小變化的事件(resize)

  2. 在事件處理函式中呼叫Echarts實體物件中的resize即可,

    window.addEventListener('resize',()=>{
        myChart.resize();
    })
    

影片的使用

加載影片

ECharts已經內置好了加載資料的影片,我們只需要在合適的時機顯示或者隱藏即可

  • 顯示加載影片

    myChart.showLoading()

  • 隱藏加載影片

    myChart.hideLoading()

    const myChart = echarts.init(document.querySelector('div'));
    myChart.showLoading();
    fetch('./Json/data.json').then(res => res.json()).then(data =>{
      myChart.hideLoading();
      const dataArr = data.map(item =>[item.height,item.weight]);
      myChart.setOption({
        xAxis:{
          type:'value',
          scale:true
        },
        yAxis:{
          type:'value',
          scale:true,
        },
        series:{
          type:'scatter',
          data:dataArr
        }
      })
    })
    

    image-20210930120726408

增量影片

所有資料的更新都是通過setOption來實作,不需要考慮資料到底發生了那些變化,

新舊option并不是相互覆寫的關系,是相互整合的關系,設定新的option時,只需要考慮變化的部分就可以了,

const btnmodify = document.querySelector('#modify');
const btnadd = document.querySelector('#add');
btnmodify.addEventListener('click', () => {
  const newData = [25, 33, 55, 66];
  // 新舊option并不是相互覆寫的關系,是相互整合的關系
  // 設定新的option時,只需要考慮變化的部分就可以了,
  myCharts.setOption({
    series: [{
      data: newData,

    }],
  });
})
btnadd.addEventListener('click', () => {
  const newData = [66, 72, 65, 88, 43];
  const newName = ['張三', '李四', '王五', '趙六', '小吳'];
  myCharts.setOption({
    xAxis: {
      data: newName
    },
    series: [{
      data: newData,

    }],
  })
})

全部代碼:https://codepen.io/liujiaqi222/pen/ZEyPGNp

影片配置

  • 開啟影片

    animation:true

  • 影片時長

    animationDuration:1000 (以毫秒為單位)

  • 緩動影片

    animationEasing:‘bounceOut’

    myCharts.setOption({
      animation: true,
      animationDuration: function (arg) {
        console.log(arg); // 會列印影片元素的索引值
        return arg * 2000;
      },
      animationEasing: 'bounceOut', // linear 等等
    });
    
  • 影片閾值

    animationThreshold:10 // 同一類的影片,最多只展示10個

互動API

全域的echarts物件

全域echarts物件是引入echarts.js檔案之后就可以直接使用的物件

  • init 初始化echarts實體物件,使用主題

  • registerTheme 注冊主題,只有注冊過的主題,才能在init方法中使用該主題

  • registerMap 注冊地圖資料

    fetch('./JSON/map/china.json').then(res=>res.json()).then((data)=>{
      // 注冊地圖
      echarts.registerMap('chinaMap',data);
      myChart.setOption({
        geo:{
          type:'map',
          map:'chinaMap',
          roam:true, // 設定允許縮放以及允許拖動地圖
          // 只縮放 scale 只拖動 move
          label:{
            show:true, //展示所有標簽
          },
          zoom:1,//設定初始化縮放比例
          center:[99,40] //根據經度緯度設定 某個地區為中心
        }
      })
    })
    
  • connect

    一個頁面中可以有多個獨立的圖表,每一個圖表都對應著一個ECharts實體物件,

    connect可以實作多圖關聯,傳入聯動目標為ECharts實體物件,支持陣列,保存圖片的時候會自動拼接,重繪按鈕,重置按鈕,提示框聯動,圖例選擇,資料范圍修改等,

    echarts.connect([mychart1,mychart2])
    

echartsInstance物件

eChartsInstance物件是通過echarts.init方法呼叫后的回傳值

  • setOption

    設定或修改圖表實體的配置項以及資料,可多次呼叫setOption方法(會合并新的配置和舊的配置),

  • resize

    重新計算和繪制圖表

    const myChart = echarts.init(dom);
    window.addEventListener('resize',()=>{
        myChart.resize();
    })
    
  • on\off

    系結或者解綁事件處理函式

    • 滑鼠事件

      // 對事件監聽
      myChart.on('click',function(arg){
        console.log(arg);
        console.log('click...');
      });
      
    • ECharts事件

      常見事件:legendSelectChanged, ‘dataZoom’,‘pieSelectChanged’,'mapSelectChanged’等

      myChart.on('legendSelectChanged',function(arg){
        console.log(arg); //列印選中狀態
      })
      
  • dispatchAction

    觸發某些行為(使用代碼模擬用戶的行為)

    mCharts.dispatchAction({
        type:'hightlight', //事件型別
        seriesIndex:0, //圖表索引
        dataIndex:1 //圖表中哪一項高亮
    })
    
  • clear

    清空當前實體,會移除實體中所有的組件和圖表;

    清空之后,可以再次setOption

    myChart.clear(); // 整個圖表將不會顯示
    myChart.setOption(option); // 圖表將會重新展示
    
  • dispose

    銷毀實體,實體銷毀后無法再被使用

    myChart.clear(); 
    myChart.setOption(option);   // 會報錯
    

Map’,
roam:true, // 設定允許縮放以及允許拖動地圖
// 只縮放 scale 只拖動 move
label:{
show:true, //展示所有標簽
},
zoom:1,//設定初始化縮放比例
center:[99,40] //根據經度緯度設定 某個地區為中心
}
})
})




- connect

一個頁面中可以有多個獨立的圖表,每一個圖表都對應著一個ECharts實體物件,

connect可以實作多圖關聯,傳入聯動目標為ECharts實體物件,支持陣列,保存圖片的時候會自動拼接,重繪按鈕,重置按鈕,提示框聯動,圖例選擇,資料范圍修改等,

```js
echarts.connect([mychart1,mychart2])

echartsInstance物件

eChartsInstance物件是通過echarts.init方法呼叫后的回傳值

  • setOption

    設定或修改圖表實體的配置項以及資料,可多次呼叫setOption方法(會合并新的配置和舊的配置),

  • resize

    重新計算和繪制圖表

    const myChart = echarts.init(dom);
    window.addEventListener('resize',()=>{
        myChart.resize();
    })
    
  • on\off

    系結或者解綁事件處理函式

    • 滑鼠事件

      // 對事件監聽
      myChart.on('click',function(arg){
        console.log(arg);
        console.log('click...');
      });
      
    • ECharts事件

      常見事件:legendSelectChanged, ‘dataZoom’,‘pieSelectChanged’,'mapSelectChanged’等

      myChart.on('legendSelectChanged',function(arg){
        console.log(arg); //列印選中狀態
      })
      
  • dispatchAction

    觸發某些行為(使用代碼模擬用戶的行為)

    mCharts.dispatchAction({
        type:'hightlight', //事件型別
        seriesIndex:0, //圖表索引
        dataIndex:1 //圖表中哪一項高亮
    })
    
  • clear

    清空當前實體,會移除實體中所有的組件和圖表;

    清空之后,可以再次setOption

    myChart.clear(); // 整個圖表將不會顯示
    myChart.setOption(option); // 圖表將會重新展示
    
  • dispose

    銷毀實體,實體銷毀后無法再被使用

    myChart.clear(); 
    myChart.setOption(option);   // 會報錯
    

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/304776.html

標籤:其他

上一篇:練習vue-x的小demo

下一篇:請求圖書洗掉案例

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more