首页 > 其他分享 >echarts画桑基图,并根据选择的分析因子画图

echarts画桑基图,并根据选择的分析因子画图

时间:2023-12-20 11:37:49浏览次数:37  
标签:画桑 const links value source 基图 key data echarts

最近要在系统中增加一个桑基图,要求桑基图可以根据选择的分析因子重新绘图。

仔细看了下echarts的示例,桑基图本身很简单,困难的是如何根据数据资料整理成桑基图的数据格式,并且实现选择分析因子重新绘图。

研究了几天的数据资料,特将方法写个demo记录下。

<script src="./plugins/echarts.min.js"></script>
<div>
  <label><input type="checkbox" name="factor" value="city" />city</label>
  <label><input type="checkbox" name="factor" value="degree" />degree</label>
  <label><input type="checkbox" name="factor" value="type" />type</label>
  <button onclick="handleSankeyChart()">确定</button>
</div>
<div id="main3" style="height: 400px"></div>
<script>
  const data_orig = [
    { city: "北京", degree: "本科", value: 300, type: "减少" },
    { city: "广州", degree: "硕士", value: 400, type: "增加" },
    { city: "深圳", degree: "硕士", value: 360, type: "增加" },
    { city: "北京", degree: "硕士", value: 250, type: "减少" },
    { city: "上海", degree: "本科", value: 350, type: "减少" },
    { city: "重庆", degree: "本科", value: 300, type: "增加" },
    { city: "深圳", degree: "本科", value: 230, type: "增加" },
  ];

  //统计数据
  const data = {};
  for (let i in data_orig) {
    const key_arr = [];
    for (let key in data_orig[i]) {
      if (key != "value") {
        key_arr.push(data_orig[i][key]);
      }
    }
    const key_str = key_arr.join("|");
    if (!(key_str in data)) data[key_str] = 0;
    data[key_str] += data_orig[i]["value"];
  }
  //数据key中分析因子的顺序,后面可根据此顺序获取对应的值
  const key_order = ["city", "degree", "type"];

  function handleSankeyChart() {
    const params = [];
    document.querySelectorAll("input[name=factor]").forEach((e, i) => {
      if (e.checked) params.push(e.value);
    });

    const data_links_all = [];
    for (let key in data) {
      const key_arr = key.split("|");

      for (let i = 1; i < params.length; i++) {
        const order_index = key_order.indexOf(params[i]);
        const target = key_arr[order_index];
        const source = key_arr[key_order.indexOf(params[i - 1])];

        data_links_all.push({
          source: source,
          target: target,
          value: data[key],
        });
      }
    }

    //links 去掉source=target的项(会报错),合并source和target分别相同的项
    const data_links = [];
    const pairs = [];
    for (let i in data_links_all) {
      const key = data_links_all[i]["source"] + "|" + data_links_all[i]["target"];
      const index = pairs.indexOf(key);
      if (index == -1 && data_links_all[i]["source"] != data_links_all[i]["target"]) {
        pairs.push(key);
        data_links.push(data_links_all[i]);
      } else if (data_links_all[i]["source"] != data_links_all[i]["target"]) {
        data_links[index]["value"] += data_links_all[i]["value"];
      }
    }

    //根据links,组装节点数据
    const data_nodes = [];
    const items = [];
    if (data_links.length > 0) {
      for (let i in data_links) {
        if (items.indexOf(data_links[i]["source"]) === -1) {
          data_nodes.push({
            name: data_links[i]["source"],
          });
          items.push(data_links[i]["source"]);
        }

        if (items.indexOf(data_links[i]["target"]) === -1) {
          data_nodes.push({
            name: data_links[i]["target"],
          });
          items.push(data_links[i]["target"]);
        }
      }
    }

    drawSankeyChart(data_nodes, data_links);
  }

  function drawSankeyChart(data_nodes, data_links) {
    var chartDom = document.getElementById("main3");
    var myChart = echarts.init(chartDom);
    var option;

    option = {
      tooltip: {
        trigger: "item",
        triggerOn: "mousemove",
      },
      series: [
        {
          type: "sankey",
          //严格按照数据节点的顺序显示
          layoutIterations: 0,
          emphasis: {
            focus: "series",
          },
          //定义文本宽度及超出后的换行
          label: {
            width: 100,
            overflow: "break",
          },
          data: data_nodes,
          links: data_links,
        },
      ],
    };
    option && myChart.setOption(option);
  }
</script>

 

实现了如下的效果:

 当桑基图中 layoutIterations 配置项取默认的值32时,echarts会优化图形的显示,减少连线交叉

  

 

标签:画桑,const,links,value,source,基图,key,data,echarts
From: https://www.cnblogs.com/caroline2016/p/17916134.html

相关文章

  • echarts柱形图给X轴坐标类目添加点击事件
    在项目中遇到这么个需求要在柱形图上的x轴添加点击事件,当点击对应x轴文字的时候要弹出模态框展示子图表根据echarts的Api给图表实例绑定点击事件myChartInstance?.on('click','xAxis.category',(params)=>{if(params.value==='其他变动成本'){set......
  • v-echarts 使用折线图
    <ve-linestyle="top:-40px"height="100%"width="100%":loading="yearChartLoading":data="yearChartData":extend="chartExtend":legend-visible="false":settings="yearSetting......
  • echarts设置多条折线不是你想的那样简单
    简单的多条折线图小伙伴写过多条折线图的都知道,常见的折线图是xAxis配置项下的data属性上设置时间或者日期。series配置项下是对应的legend中的数据以及该条折线的数据。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"con......
  • vue中echarts图表---正负轴柱状图
    一、安装npmiecharts--save二、引入//全局引入importechartsfrom'echarts'Vue.prototype.$echarts=echarts//局部【这里使用局部引入】importechartsfrom'echarts';三、代码1<!--容器-->2<divid="cylinderEcharts"ref="cyl......
  • 记录--Echarts绘制气泡图
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助Echarts绘制气泡图气泡图是一种用于可视化三维数据的图表类型,其中两个变量用于确定数据点在平面上的位置,另一个变量用于确定气泡的大小。Echarts是一款基于JavaScript的数据可视化库,它提供了丰富的图表类型,包括灵......
  • echarts 图
    ECHARTS官网:Examples-ApacheECharts各图图标可以参考:iconfont-阿里巴巴矢量图标库ECHARTS官网找想要的图,然后打开:右边是可视化的图形显示,左边是:代码编辑:只有内含的属性配置,可以在里面编写属性,然后即刻运行在右侧显示完整代码:显示右侧图形的整个vue代码,拿来......
  • 软件测试/人工智能|Python数据可视化神器pyecharts教程(一)
    前言在很多时候,枯燥的数字并不能很直观的展示地域的差别,比如一个企业,想要分析产品在国内的销售情况,报表可能并不能最直接的展示差异,而一个结合地图的展示,就会直观得多,更便于大家去看到差距,更利于决策。当然,除了做商业决策,将数据与地图结合,也更便于我们展示诸如人口密度,经济总量等数......
  • 软件测试/人工智能|Python数据可视化神器pyecharts教程(二)
    前言上一篇文章,我们介绍了如何使用pyecharts展示带地图的数据分析结果,并且实际绘制了省份图和全国城市图,用于展示数据。本文我们继续来使用pyecharts绘制以地图为基础的图像。绘制分段图但是我们在绘制全国的图形时,没有考虑考虑到将不同级别的数据进行分层,比如每一段的颜色不一......
  • 软件测试/人工智能|Python数据可视化神器pyecharts教程(三)
    前言前面两篇文章,我们主要介绍了绘制基本的地图以及数据展示图,其实我们可以在地图上绘制更多类型的图形,本文就来继续介绍在地图的基础上进行我们的数据可视化工作。绘制轨迹图每年春运,都是大部分的人从北上广深等发达地区回到广大的中西部地区,春节之后,再从广大的中西部地区回到......
  • 软件测试/人工智能|Python数据可视化神器pyecharts教程(一)
    前言在很多时候,枯燥的数字并不能很直观的展示地域的差别,比如一个企业,想要分析产品在国内的销售情况,报表可能并不能最直接的展示差异,而一个结合地图的展示,就会直观得多,更便于大家去看到差距,更利于决策。当然,除了做商业决策,将数据与地图结合,也更便于我们展示诸如人口密度,经济总量......