1. 程式人生 > >echarts 自定義 markPoint 的 symbol 樣式

echarts 自定義 markPoint 的 symbol 樣式

兩種自定義標記

在 echarts 中 markPoint 的樣式內建了 ‘circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’ 幾種,如果這些都不太符合需要就必須自定義我們需要的樣式。

自定義標記的圖形有兩種方式:
1. 通過 ‘image://url’ 設定為圖片,其中 URL 為圖片的連結,或者 dataURI。
2. 通過 ‘path://’ 將圖示設定為任意的向量路徑。這種方式相比於使用圖片的方式,不用擔心因為縮放而產生鋸齒或模糊,而且可以設定為任意顏色。路徑圖形會自適應調整為合適的大小。

svg 的 path

<path> 標籤用來定義路徑。 使用 path 標籤時,就像用指令的方式來控制一隻畫筆,比如:移動畫筆到某一座標位置,畫一條線,畫一條曲線等等

下面的指令可用於路徑資料:

  • M = moveto(M X,Y) :將畫筆移動到指定的座標位置
  • L = lineto(L X,Y) :畫直線到指定的座標位置
  • H = horizontal lineto(H X):畫水平線到指定的X座標位置
  • V = vertical lineto(V Y):畫垂直線到指定的Y座標位置
  • C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY):三次貝賽曲線
  • S = smooth curveto(S X2,Y2,ENDX,ENDY)
  • Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY):二次貝賽曲線
  • T = smooth quadratic Belzier curveto(T ENDX,ENDY):對映
  • A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧線
  • Z = closepath():關閉路徑

說明:
座標軸為以(0,0)為中心,X軸水平向右,Y軸水平向下。
所有指令大小寫均可。大寫絕對定位,參照全域性座標系;小寫相對定位,參照父容器座標系
指令和資料間的空格可以省略
同一指令出現多次可以只用一個

比如繪製一個三角形:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
    <path d="M250 150 L150 350 L350 350 Z" />
</svg>

echarts 的 path://

在 echarts 上使用 path 只需把 path 標籤上的指令寫在 path:// 之後:

 symbol: 'path://M250 150 L150 350 L350 350 Z', 

一個繪製文字提示框的小例子:
這裡寫圖片描述

程式碼:


        var myChart = echarts.init(document.getElementById(id));
        var option = {
            title: {
                text: "標題",
                top: 20,
                left: '10%',
                textStyle:{
                    fontSize: 14,
                    fontWeight: 600
                }
            },
            legend: {
                data: ["line1"],
                top: 30,
                right: "6.5%",
                formatter: function (name) {
                    return  name;
                },
                itemGap: 40
            },
            grid:{
                top: 60,
                left: "10%",
                right: "7%",
                bottom: 40
            },
            tooltip: {
                trigger: 'axis',
                formatter: function (data){
                    var html = '';
                    if(data.componentType == 'markPoint'){
                        html = data.seriesName;
                    }else{
                        html = data[0].name;
                        for(var i=0; i<data.length; i++){
                            var now = data[i];
                            html += '</br><span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+now.color+'"></span>' + now.seriesName + ': ' + toHSpeed(now.data, 2);
                        }
                    }
                    return html
                }
            },
            xAxis: [
                {
                    type : 'category',
                    boundaryGap: false,
                    axisTick: {
                        alignWithLabel: false,
                        interval: 0
                    },
                    axisLine:{
                        lineStyle:{
                            color:'#8cccca'
                        }
                    },
                    axisLabel: {
                        textStyle: {
                            color: '#a19e9e'
                        },
                        interval:0,
                        formatter: function (value, index) {
                            return value;
                        }
                    },
                    splitLine:{
                        show: true,
                        lineStyle:{
                            color:'#dadada'
                        }
                    },
                    data:["01","02","03","04","05","06","07","08"]
                }
            ],
            yAxis: [
                {
                    type : 'value',
                    axisLine:{ // y 線樣式修改
                        lineStyle:{
                            color:'#8cccca'
                        }
                    },
                    axisLabel: { // y 名稱樣式修改
                        textStyle: {
                            color: '#a19e9e'
                        },
                        formatter: function (data){
                            return toHSpeed(data, 2);
                        }
                    },
                    splitLine:{ // 取消y軸的網格
                        show: true,
                        lineStyle:{
                            color:'#dadada'
                        }
                    },
                    min: 0,
                    max:function(value) {
                        return value.max + 100;
                    }
                }
            ],
            series: [
                {
                    name: "line1" ,
                    type: 'line',
                    color: ['#31b573'],// 顏色
                    showSymbol: false,
                    silent: true, // 取消點選事件
//                    areaStyle:{ // 填充顏色
//                        normal:{
//                            opacity: 0.1
//                        }
//                    },
                    smooth:true,
                    itemStyle:{ // 轉折點 控制
                        normal:{
                            borderColor:'#277cdc'
                        }
                    },
                    data: [35,50,44,30,60,33,70,61],
                    markPoint: {
                        symbol: 'path://m 0,0 h 48 v 20 h -30 l -6,10 l -6,-10 h -6 z', // 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', path://m 0,0 h 48 v 20 h -30 l -6,10 l -6,-10 h -6 z,  path://m 0,0 h 48 v 20 h -34 l -6,10 l -6,-10 h -2 z
                        symbolSize: function(val){
                            return [textSize(toHSpeed(val, 2),"12px").width+5,40]
                        },
                        symbolOffset: ['34%', '-50%'],
                        symbolKeepAspect: true,// 如果 symbol 是 path:// 的形式,是否在縮放時保持該圖形的長寬比。
                        label:{
                            position: "insideTop",
                            distance: 7,
                            formatter: function (data){
                                return toHSpeed(data.value, 2);
                            }
                        },
                        data: [
                            {type: 'max', name: '最大值'},
                            {type: 'min', name: '最小值'}
                        ]
                    }
                }
            ]
        };
        myChart.setOption(option,true);
        window.addEventListener("resize", function () {
            myChart.resize();
        });


    /**
     * 獲取文字寬高
     * @param text       文字
     * @param fontSize   代表漢字的大小,英文字會自動按照預設值
     * @returns {{width: *, height: *}}
     */
    function textSize(text,fontSize) {
        var span = document.createElement("span");
        var result = {
            "width": span.offsetWidth,
            "height": span.offsetHeight
        };
        span.style.visibility = "hidden";
        span.style.fontSize = fontSize || "14px";
        document.body.appendChild(span);

        if (typeof span.textContent != "undefined")
            span.textContent = text || "國";
        else span.innerText = text || "國";

        result.width = span.offsetWidth - result.width;
        result.height = span.offsetHeight - result.height;
        span.parentNode.removeChild(span);
        return result;
    }

   function toHSpeed(speed,fix) {
        if(isNaN(speed))
            return speed;
        if(!fix&&fix!=0)
            fix=2;
        if(speed>=125000000)
        {
            speed/=125000000;
            speed=speed.toFixed(fix)+"Gbps"
        }
        else if(speed>=125000)
        {
            speed/=125000;
            speed=speed.toFixed(fix)+"Mbps"
        }
        else if(speed>=125)
        {
            speed/=125;
            speed=speed.toFixed(fix)+"Kbps"
        }
        else
        {
            speed*=8;
            speed=speed.toFixed(fix)+"bps"
        }
        return speed
    }