Echarts的坑

Echarts總結(jié)

簡介:js圖標庫,可以兼容在pc和移動端。Echarts底層使用canvas實現(xiàn),支持多圖表、組件的聯(lián)動和混搭展現(xiàn)。

常用圖表類型:折線圖(區(qū)域圖)、柱狀圖(條狀圖)、散點圖(氣泡圖)、餅圖(環(huán)形圖)、雷達圖(填充雷達圖)等圖表。

常用配置子組件:標題,詳情氣泡、圖例、值域、數(shù)據(jù)區(qū)域、軸、工具箱等。

注: 本篇總結(jié)僅針對項目中使用的功能點整理總結(jié),并不能涵蓋Echart全部內(nèi)容,更多需求請參考Echarts官方文檔。

1.tooltip(詳情氣泡)

配置實例:


tooltip: {

        trigger: 'axis',

        confine: true,

        backgroundColor: pointColor,

        textStyle: {

          color: '#fff',

        },

        formatter: function(params) {

// 區(qū)別定制每個tooltip浮動層中的文案

          return params[0].data.hasVal ? `${params[0].value} ${params[0].data.tipText}` : `${params[0].data.noValueText}`

        },

        axisPointer: {

          lineStyle: {

            color: 'rgba(139,185,255, 0.2)',

          },

        },

        // pos 鼠標當前位置, dom tooltip的dom對象, Echart容器當前尺寸

        position: function (pos, params, dom, rect, size) {

          let yPos = '0%' // 垂直方向固定在畫布頂部

          let xPos = 0

          // 左側(cè)的一部分數(shù)據(jù)

          if (pos[0] < size.viewSize[0] / 2) {

            xPos = pos[0] + 0  // 鼠標點位置,tootip在右

          } else { // 右側(cè)的一部分數(shù)據(jù)

            xPos = pos[0] - dom.offsetWidth - 0 // 鼠標點位置減去tooltip的寬度,tooltip在左

          }

          return [xPos, yPos]

        },

      } 

各項說明如下:

-trigger: tooltip浮動層的觸發(fā)方式, 'axis': 鼠標在整個畫布上任意位置(整個坐標軸范圍)均能觸發(fā),觸發(fā)時會在鼠標最近圖形上疊加顯示軸線,主要在柱狀圖,折線圖使用;'item':鼠標只能在數(shù)據(jù)項圖形上面觸發(fā),例如折現(xiàn)圖時,點擊折點才能觸發(fā)。注意: trigger的配置方式會影響其他tooltip配置項的配置。

-confine: 是否將 tooltip 框限制在圖表的區(qū)域內(nèi)。當圖表外層的 dom 被設(shè)置為 'overflow: hidden',或者移動端窄屏,導(dǎo)致 tooltip 超出外界被截斷時,此配置比較有用。

-backgroundColor/borderColor: tooltip浮層的背景顏色及邊框顏色。注意: 此兩種樣式所有的tooltip均保持統(tǒng)一,不能根據(jù)數(shù)據(jù)進行對于某一個數(shù)據(jù)的tooltip特殊設(shè)置。

-textStyle: tooltip符層中字體的統(tǒng)一樣式設(shè)置。

-axisPointer: 僅當tooltip的trigger配置為'axis'時有效

,設(shè)置疊加軸線的樣式。

-formatter: formatter是tooltip中非常有用的一項配置。此項配置可以根據(jù)數(shù)據(jù)定制生成tooltip中的文本內(nèi)容。如果沒有改項配置,默認文本內(nèi)容是橫軸和縱軸的值。


  // formatter的配置

  // 1.字符串模版 

  // 模板變量有 {a}, ,{c},u0z1t8os,{e},分別表示系列名,數(shù)據(jù)名,數(shù)據(jù)值等。 詳細內(nèi)容請查詢官網(wǎng)



  formatter: '{b0}: {c0}
{b1}: {c1}'



  // 2.回調(diào)函數(shù)

  // 回調(diào)函數(shù)參數(shù) 

  // (params: Object|Array, ticket: string, callback: (ticket: string, html: string)) => string

  // 在 trigger 為 'axis' 的時候,params 是多個系列的數(shù)據(jù)數(shù)組。每一項的格式如下

  {

    componentType: 'series', // 系列類型



    seriesType: string, // 系列在傳入的 option.series 中的 index



    seriesIndex: number, // 系列名稱



    seriesName: string, // 數(shù)據(jù)名,類目名

    name: string, // 數(shù)據(jù)在傳入的 data 數(shù)組中的 index



    dataIndex: number, // 傳入的原始數(shù)據(jù)項



    data: Object, // 傳入的數(shù)據(jù)值



    value: number|Array, // 數(shù)據(jù)圖形的顏色

    color: string,

}

  其中的data項可以用來區(qū)別每一項數(shù)據(jù)的文案,data的格式與series中的data項配置相關(guān)聯(lián),詳細可見上例代碼。

-position: tooltip的顯示位置。指可以是數(shù)組,也可以是回調(diào)函數(shù)。


// 回調(diào)函數(shù)參數(shù) (point, params, dom, rect, size),需要return出一個數(shù)組表示tooltip的位置。

point: 鼠標位置,如 [20, 40]。

params: 同 formatter 的參數(shù)相同。

dom: tooltip 的 dom 對象。

rect: 只有鼠標在圖形上時有效,是一個用x, y, width, height四個屬性表達的圖形包圍盒。

size: 包括 dom 的尺寸和 echarts 容器的當前尺寸

<font size=3 color=#D2691E>其中僅有point參數(shù)是與用戶操作相關(guān)的位置變量,代表了用戶觸摸鼠標在畫布上的位置。因此我們僅能跟據(jù)此項計算tooltip的位置,暫無方法知道距離鼠標點最近的數(shù)據(jù)點的位置,并讓tooltip根據(jù)折點定位。</font>

tooltip未能實現(xiàn)的功能點:

tooltip根據(jù)距離鼠標點最近的數(shù)據(jù)點進行定位;軸線的高度與數(shù)據(jù)的高度一致,而不是縱向貫穿畫布;折點覆蓋軸線,層級在上

2. xAxis 及yAxis (橫縱坐標軸)


  xAxis: {

      type: 'category',

      boundaryGap: false,

      data: xAxisData,

      axisLine: {

        show: false,

      },

      axisTick: {

        show: false,

      },

      axisLabel: {

        interval: 0,

        color: '#666',

      },

      formatter: function(params) {

return `${params}\\nn2017` // \\nn 換行符

      },

  },

  yAxis: {show: false},

-type: 'value',連續(xù)數(shù)據(jù);'category',離散數(shù)據(jù),最常用,必須通過data項來設(shè)置數(shù)據(jù);'time',時間軸;'log': 對數(shù)軸

-boundaryGap: 坐標軸兩邊是否留白。

-data: 軸刻度點的數(shù)據(jù)。如果需要定制軸標簽文字內(nèi)容,需搭配使用formatter配置。

-axisLine:坐標軸線相關(guān)樣式

-axisTick: 軸線上的刻度的相關(guān)樣式。其中interval項控制刻度顯示,有的時候需要間隔幾個刻度顯示一個,可以用此項來控制。或者手動將data中不顯示的刻度值設(shè)置為空字符串。

-axisLabel: 軸標簽的相關(guān)樣式。

-formatter: 此項配置在官網(wǎng)xAxis配置文檔中并不能查詢到,但是可以使用??梢杂脕矶ㄖ戚S標簽的顯示內(nèi)容,接收的params參數(shù)即為刻度點的data值。

<font size=3 color=#D2691E>注: 軸的formatter配置的換行效果與tooltip的formatter配置沖突,暫不明原因。</font>

3.grid(網(wǎng)格)

grid主要用來配置網(wǎng)格組件的顯示及樣式等

最常用的四個配置是<font size=3 color=#D2691E>left,top,right, bottom。這四項用來控制圖形區(qū)域到畫布邊緣的留白。</font>取值可以是數(shù)字也可以是百分比。

4.series(圖表類型及配置)

series是Echarts最必要也是最重要的配置。series是有單個圖表配置對象組成的數(shù)組,當其length > 1時,表示了有多個分別設(shè)置的圖表在畫布上進行了疊加。由于圖表類型過多,本篇僅選擇折線圖舉例說明。


series: [{

          data: seriesData,

          // data: [820, 932, 901, 934, 1290, 1330, 1320],

          type: 'line',

          areaStyle: {color: areacolor},

          symbol: 'circle',

          symbolSize: 6,

          itemStyle: {

            normal: {

                color: pointColor,

                lineStyle: {

                    color: lineColor

                }

          }

        },

      }],

-data: 圖表的數(shù)據(jù)。舉例如下:


const datalist = [

{y: '1', color: 'red', tipText: '重度污染',hasVal: true},

{y: '1', color: 'blue', tipText: '空氣良好',hasVal: true},

{y: '1', color: 'yellow', tipText: '中度污染',hasVal: true},

{y: '0', color: '', tipText: '',hasVal:false},

]

const seriesData = datalist.map((item,index) => {

    return {

        value: item.y, // Echart自帶配置

        tipText: `${item.y} ${item.tipText}`, 

        hasVal: item.hasVal,

        noValueText: '空數(shù)據(jù)',

        emphasis: {

          itemStyle: {

              color:item. color

          }

        },

        themeColor,

        symbolSize: item.hasVal ? 8 : 0, // 有值的點展示,沒有值的點不展示

      }

  })

其中,value, emphasis, symbolSize 是Echarts自帶的配置,除此之外可任意添加配置項,注意不要與自帶配置的key重讀。

<font size=3 color=#D2691E>data中配置的每個字段都可以在tooltip中的formatter的通過其參數(shù)params[0].data來獲取,可以用來幫助我們實現(xiàn)tooltip文案自定義。</font>具體請參閱上文tooltip中代碼。

emphasis用來設(shè)置當某個折點被高亮時候的樣式;symbolSize用來設(shè)置折點被高亮時候的大小。此兩項是可以針對單個數(shù)據(jù)點進行設(shè)置的。

-type: 圖表的類型。

-areaStyle: 圖表的區(qū)域顏色,可以設(shè)置為漸變色。

-symbol: 折點的圖形。ECharts 提供的標記類型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'??梢酝ㄟ^ 'image://url' 設(shè)置為圖片,其中 URL 為圖片的鏈接,或者 dataURI。

-symbolSize: 折點沒有高亮時大小,統(tǒng)一設(shè)置。

-itemStyle: 折線拐點的樣式。

5.在React Native 項目中的使用

簡單的圖表,當要給Echart組件設(shè)置一個固定的寬高,組件會自動計算每個刻度的值,并在畫布上畫出。

而在RN項目中,當data的數(shù)據(jù)長度并不固定時,我們需要每個刻度的長度固定,則需要根據(jù)data的長度來計算Echart的長度值,對width屬性進行設(shè)置。這樣圖表會更加美觀,不會因為data數(shù)據(jù)變化時,刻度的長短變化出現(xiàn)跳動感。

也可以在Echart組件外面使用scrollView組件,以實現(xiàn)Echart的滾動。如下代碼所示:


const {

  width: windowWidth,

  height: windowHeight,

} = Dimensions.get('window');

 // data是圖表數(shù)據(jù)

  getChartWidth() {

    const {data} = this.props;

    return (windowWidth / 6) * data.length;

  } 



<ScrollView

    ref={(r) => { this.chartScroll = r; }}

    horizontal

    showsHorizontalScrollIndicator={false}

    onContentSizeChange={this.onContentSizeChange}

  >

    {

      seriesData.length > 0 ? 

      : null

    }





?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容