亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我單擊特定節點并繪制通往其子葉的路徑時,是否有用于著色或突出顯示樹枝的 ECharts 選項?

當我單擊特定節點并繪制通往其子葉的路徑時,是否有用于著色或突出顯示樹枝的 ECharts 選項?

蝴蝶不菲 2022-07-08 15:57:53
在閱讀了 ECharts 文檔并查看了示例之后,當我單擊特定節點并繪制通往其子葉的路徑時,我沒有找到任何允許著色或突出顯示樹枝的內容?;旧?,我正在嘗試做這樣的 ECharts 樹示例:
查看完整描述

1 回答

?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

理論上是可以的,但是我沒有時間練習。總的來說,我在接下來的步驟中的想法:

  1. 訂閱click符號的監聽事件,見 events。

  2. 獲取當前(點擊)系列并擺脫另一個系列以排除父母,可以使用instance.getModel().getSeries()instance.getModel().eachSeries(...)

  3. 在它之后,我們有唯一的子節點?,F在您可以更改(使用instance.setOption({...}))子葉的 lineStyle 并將其涂成黑色。

如果不成功,我稍后再試。


更新

我做了你想要的,但是代碼很臟而且不容易學習,抱歉我很著急。如果您有任何問題,請告訴我。

var container = document.getElementById('main');

var chart = echarts.init(container);


var data = {

  name: "node 1",

  children: [{

    name: "node 1.1",

    children: [{

      name: "node 1.1.1",

      children: [{

        name: "node 1.1.1.1",

        value: 721

      }]

    },

    {

      name: "node 1.1.2",

      children: [{

        name: "node 1.1.2.1",

        value: 727,

        children: [{

          name: "node 1.1.2.1.1",

          children: [{

            name: "node 1.1.2.1.1.1",

            value: 727

          }]

        }, {

          name: "node 1.1.2.1.2",

          children: [{

            name: "node 1.1.2.1.2.1",

            value: 727

          }]

        }]

      }]

    },

    {

      name: "node 1.1.3",

      children: [{

        name: "node 1.1.3.1",

        value: 725

      }]

    }]

  }]

};


var option = {

  tooltip: {

    trigger: 'item',

    triggerOn: 'mousemove'

  },

  series: [{

    type: 'tree',

    id: 0,

    name: 'tree1',

    data: [data],

    top: '10%',

    left: '8%',

    bottom: '22%',

    right: '20%',

    symbolSize: 7,

    edgeShape: 'curve',

    edgeForkPosition: '10%',

    initialTreeDepth: 5,

    lineStyle: {

      width: 3,

      curveness: 0.3

    },

    label: {

      backgroundColor: '#fff',

      position: 'left',

      verticalAlign: 'middle',

      align: 'right',

      borderColor: 'red',

      borderWidth: 1,

      borderRadius: 10,

      padding: 10

    },

    leaves: {

      label: {

        position: 'right',

        verticalAlign: 'middle',

        align: 'left'

      }

    },

    expandAndCollapse: true,

    animation: false,

  }]

};


chart.setOption(option);


var hoverStyle = { lineStyle: { color: 'black' }};


// Traverse each node in tree

function traverse(node, callback){

  if(node.children){

    callback(node);

    node.children.forEach(subNode => traverse(subNode, callback))

  } else {

    callback(node)

  }

}


// Traverse from target node

function traverseFrom(opts){

  var defaults = { tree: data, nodeName: null, callback: null, skipStartNode: false };

      Object.assign(defaults, opts);


  var targetNode = null;


  // Find node for start paint

  traverse(defaults.tree, node => {

    if(node.name === defaults.nodeName){

      targetNode = node;

    }

  });


  // Find all children of found node

  traverse(targetNode, node => {

    if(defaults.skipStartNode && node.name === defaults.nodeName){

      // Skip first because it is start branch

    } else {

      defaults.callback(node)

    }

  });

}


// Build new config with painted nodes

function buildSeriesConfig(nodes, style){

  var seriesConfig = echarts.util.clone(data);

  var nodes = [...nodes].flat();


  traverse(seriesConfig, node => {

    if(nodes.includes(node.name)){

      Object.assign(node, style);

    }

  });

  return seriesConfig

};


// General paint function

function paintBranch(chartInstance, nodeName){

  var nodesForPaint = [];

  var newSeries     = null;

  var mainOption    = null;


  traverseFrom({

    nodeName: nodeName,

    callback: node => nodesForPaint.push(node.name),

    skipStartNode: true

  });


  if(nodesForPaint){

    newSeries = buildSeriesConfig(nodesForPaint, hoverStyle)

  } else {

    throw 'Nodes for paint is not exists'

  }


  if(newSeries){

    chartInstance.setOption({

      series: [{ type: 'tree', id: '0', data: [newSeries] }]

    }, false);

  } else {

    throw 'New series config is not builded'

  }

};


function isNodeSelected(tree, nodeName){

  var status = false;

  traverseFrom({

    tree: tree,

    nodeName: nodeName,

    callback: node => {

      if(node.hasOwnProperty('lineStyle')) status = true;

    },

    skipStartNode: true

  })

  return status

}


function cleanTree(chartInstance){

  var clonedData = echarts.util.clone(data);

  chartInstance.setOption({

    series: [{ type: 'tree', id: '0', data: [clonedData] }]

  }, false);

};


chart.on('click', (e) => {

  var chartTree = chart.getOption().series[0].data[0];

  var nodeSelected = isNodeSelected(chartTree, e.name);


  if(nodeSelected){

    cleanTree(chart)

  } else {

    paintBranch(chart, e.name)

  }


});

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.js"></script>

<div id="main" style="width: 800px;height:600px; margin: 100px"></div>


查看完整回答
反對 回復 2022-07-08
  • 1 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號