echarts graphChart关系图简单逻辑实现

news2024/12/23 16:10:07

ECharts 的 graph 图表类型非常适合用来展示节点之间的关系,比如社交网络分析、系统架构图等。下面是一个简单的关系图功能,用来展示疾病与一些因素的关联关系。
在这里插入图片描述

1、数据之间的关系

首先,你需要准备数据来表示节点(nodes)和它们之间的边(links)。节点通常包括节点的名称或 ID,而边则包含两个节点之间的连接信息。

var data = {
    nodes: [
   	   {
         name: '疾病名称',
         symbolSize: [100, 100],
         itemStyle: {
           color: '#C280FF',
           borderColor: '#000'
         },
         value: '123456'
       }, {
         name: '食物1',
         symbolSize: [80, 80],
         itemStyle: {
           color: '#CAF982'
         },
         value: '123457'
       }, {
         name: '化合物1',
         symbolSize: [80, 80],
         itemStyle: {
           color: '#FACD91'
         },
         value: '123458'
       }, {
         name: '生活方式1',
         symbolSize: [80, 80],
         itemStyle: {
           color: '#FFFF80'
         },
         value: '123459'
       }, {
         name: '膳食模式1',
         symbolSize: [80, 80],
         itemStyle: {
           color: '#80FFFF'
         },
         value: '1234510'
       }
    ],
    links: [
        {
           target: '食物1',
           source: '疾病名称',
           category: 'Food'
         }, {
           target: '化合物1',
           source: '疾病名称',
           category: 'Compound'
         }, {
           target: '生活方式1',
           source: '疾病名称',
           category: 'lifestyle'
         }, {
           target: '膳食模式1',
           source: '疾病名称',
           category: 'dietary_pattern'
         }
    ]
};

通过仔细观察你会发现,nodes里面的数组存放的是将要展示倒关系图中的节点数据,links里面的数组存放的是,节点直接的联系。在我这个功能里,nodes的第一个节点元素是中间节点,其他节点要以它为中心进行环形分布。links中节点的target属性表示指向那个node节点,source表示将要围绕的节点,category是节点的分类,在下面的操作中我们将根据这个属性找到节点关系饼图的数据。

2、点击事件

chartClick (params) {
  console.log('click', params)
  if (params.componentType === 'series') {
    if (params.seriesType === 'graph') {
      if (params.dataType === 'edge') {
        // 点击到了 graph 的 edge(边)上。
        console.log('点击到了 graph 的 edge(边)上')
        this.showLinkModal(params)
      } else {
        // 点击到了 graph 的 node(节点)上。
        console.log('点击到了 graph 的 node(节点)上')
        if (params.dataIndex > 0) {
          this.showNodeModal(params)
        }
      }
    }
  }
}

通过click事件执行一个回调函数,就可以拿到我们想要的信息,然后去执行一些业务操作。

this.myChart.on('click', function (params) {
 _this.$emit('chartClick', params)
})

3、echarts 组件模板

<template>
  <div
    :ref="`echartsComponent${random}`"
    :style="{ width: width, 'height': height }"
  ></div>
</template>

<script>
import { createRandomId } from '@/libs'
import * as echarts from 'echarts'
export default {
  computed: {
    random: function () {
      return createRandomId()
    }
  },
  props: {
    width: {
      default: '100%',
      type: String
    },
    height: {
      default: '100px',
      type: String
    }
  },
  data () {
    return {
      myChart: null
    }
  },
  mounted () {
  },
  methods: {
    initData (data) {
      const _this = this
      this.$nextTick(() => {
        this.myChart = echarts.init(this.$refs[`echartsComponent${this.random}`])
        this.myChart.setOption(data)
        this.myChart.on('click', function (params) {
          _this.$emit('chartClick', params)
        })
      })
    },
    disposeCharts () {
      this.myChart.dispose()
    },
    resetData (data) {
      this.myChart.setOption(data)
    }

  }
}
</script>

4、简单关系图示例

<template>
  <Modal
    v-model="visible"
    :title="title"
    width="1000"
    footer-hide
    @on-cancel="cancel"
  >
    <echarts-item ref="graphChart" height="900px" @chartClick="chartClick" />
    <node-modal ref="nodeModalRef" />
    <link-modal ref="linkModalRef" />
  </Modal>
</template>
<script>
  import EchartsItem from '@/components/EchartsItem'
  import NodeModal from './NodeModal'
  import LinkModal from './LinkModal'
  export default {
    components: {
      EchartsItem,
      NodeModal,
      LinkModal
    },
    data () {
      return {
        title: '',
        visible: false,
        // 关系图数据
        nodeData: [],
        chartData: []
      }
    },
    methods: {
      init (nodeData, options) {
        this.visible = true
        this.nodeData = nodeData
        this.$nextTick(() => {
          this.initChart(options)
        })
      },
      cancel () {
        this.visible = false
        this.$refs.nodeModalRef.cancel()
        this.$refs.linkModalRef.cancel()
      },
      initChart () {
        const options = {
          title: '',
          tooltip: {
            show: false
          },
          legend: {
            show: false
          },
          xAxis: {
            show: false
          },
          yAxis: {
            show: false
          },
          series: [{
            type: 'graph',
            roam: true,
            focusNodeAdjacency: true,
            force: {
              // 节点之间的斥力因子
              repulsion: 1400,
              // 边的两个节点之间的距离
              edgeLength: [300, 350]
            },
            layout: 'force',
            symbol: 'circle',
            // 图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。
            // silent: true,
            // 是否开启动画
            animation: false,
            itemStyle: {
              borderColor: '#333'
            },
            lineStyle: {
              color: '#333',
              width: 2,
              type: 'solid',
              opacity: 0.5,
              // curveness: 0.5
            },
            label: {
              show: true,
              position: 'inside',
              textStyle: {
                fontSize: 16
              }
            },
            // 关系线上的lable
            edgeLabel: {
              normal: {
                show: false,
                textStyle: {},
                formatter: function (param) {
                  return param.data.category
                }
              }
            },
            data: [{
              name: '疾病名称',
              symbolSize: [100, 100],
              itemStyle: {
                color: '#C280FF',
                borderColor: '#000'
              },
              value: '123456'
            }, {
              name: '食物1',
              symbolSize: [80, 80],
              itemStyle: {
                color: '#CAF982'
              },
              value: '123457'
            }, {
              name: '化合物1',
              symbolSize: [80, 80],
              itemStyle: {
                color: '#FACD91'
              },
              value: '123458'
            }, {
              name: '生活方式1',
              symbolSize: [80, 80],
              itemStyle: {
                color: '#FFFF80'
              },
              value: '123459'
            }, {
              name: '膳食模式1',
              symbolSize: [80, 80],
              itemStyle: {
                color: '#80FFFF'
              },
              value: '1234510'
            }],
            // 节点间的关系数据
            links: [{
              target: '食物1',
              source: '疾病名称',
              category: 'Food'
            }, {
              target: '化合物1',
              source: '疾病名称',
              category: 'Compound'
            }, {
              target: '生活方式1',
              source: '疾病名称',
              category: 'lifestyle'
            }, {
              target: '膳食模式1',
              source: '疾病名称',
              category: 'dietary_pattern'
            }]
          }]
        }
        this.$refs.graphChart.initData(options)      
      },
      chartClick (params) {
        console.log('click', params)
        if (params.componentType === 'series') {
          if (params.seriesType === 'graph') {
            if (params.dataType === 'edge') {
              // 点击到了 graph 的 edge(边)上。
              console.log('点击到了 graph 的 edge(边)上')
              this.showLinkModal(params)
            } else {
              // 点击到了 graph 的 node(节点)上。
              console.log('点击到了 graph 的 node(节点)上')
              if (params.dataIndex > 0) {
                this.showNodeModal(params)
              }
            }
          }
        }
      },
      showNodeModal (params) {
        const node = this.nodeData[params.dataIndex - 1]
        const options = {
          legend: {
            icon: 'circle',
            left: 'center',
            bottom: '5%',
            itemWidth: 10
          },
          label: {
            formatter: '{c}'
          },
          color: ['#6395fa','#f56e53','#fbb120'],
          series: [
            {
              name: 'Access From',
              type: 'pie',
              radius: '50%',
              center: ['50%', '40%'],
              data: [
                { value: 1048, name: 'Positive' },
                { value: 735, name: 'Negative' },
                { value: 580, name: 'Relative' }
              ],
              emphasis: {
                itemStyle: {
                  shadowBlur: 10,
                  shadowOffsetX: 0,
                  shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
              }
            }
          ]
        }
        // 食物和化合物的时候显示
        if (node.category === 'Disease' || node.category === 'Food' || node.category === 'Compound') {
          this.$refs.nodeModalRef.init(node.name, node.category, options, node.showType)
        }
      },
      showLinkModal (params) {
        const infoList = [
          {
            category: 'Ariticles',
            list: [
              {
                id: 1,
                title: 'The optimal ratio of fat-to-carbohydrate in the diet.'
              },
              {
                id: 2,
                title: 'The hypobetalipoproteinemias.'
              }
            ]
          },
          {
            category: 'Clinical Trials',
            list: [
              {
                id: 3,
                title: 'Microbiota, Metabolome and Nutrition: an \'Artificially Intelligent\' Way to Personalized Nutrition'
              }
            ]
          }
        ]
        this.$refs.linkModalRef.init(infoList)
      }
    }
  }
</script>

你可以根据需要调整各种配置项来改善图表的外观和交互性。例如,改变颜色方案、增加更多动画效果等。

总结

以上就是一个简单的使用 ECharts 绘制关系图的例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2099483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C ++初阶:类和对象(中)

目录 &#x1f31e;0.前言 &#x1f688;1. 类的6个默认成员函数 &#x1f688;2. 构造函数 &#x1f69d;2.1 概念 &#x1f69d;2.2特性 &#x1f69d;2.3编译器默认生成的构造函数。 ✈️补充1&#xff1a; ✈️补充2&#xff1a;开空间问题 &#x1f688;3. 析构函…

C++相关概念和易错语法(30)(异常、智能指针)

1.异常 在C语言这样的面向过程编程的语言来说&#xff0c;处理错误一般有两种方式&#xff1a;终止程序&#xff0c;如assert&#xff1b;返回错误码&#xff0c;比如打开文件失败&#xff0c;errno就会改变&#xff0c;perror就会打印错误码对应的错误信息 在面向对象的语言…

云原生存储Rook部署Ceph

Rook 是一款云原生存储编排服务工具&#xff0c;Ceph 是一种广泛使用的开源分布式存储方案&#xff0c;通过Rook 可以大大简化 ceph 在 Kubernetes 集群中的部署和维护工作。 Rook 由云原生计算基金会( CNCF )孵化&#xff0c;且于 2020 年 10 月正式进入毕业阶段。Roo…

【python因果推断库3】使用 CausalPy 进行贝叶斯geolift 分析

目录 导入数据 丹麦的销售额是否有地理提升&#xff08;GeoLift&#xff09;&#xff1f; 结果 本笔记本介绍如何使用 CausalPy 的贝叶斯{术语}合成控制功能来评估“地理提升”&#xff08;GeoLift&#xff09;。我们的假设情景如下&#xff1a; 你是一家在欧洲运营的公司的…

集成电路学习:什么是ISP系统编程

一、ISP&#xff1a;系统编程 ISP&#xff08;In-System Programming&#xff09;即系统编程&#xff0c;是一种在系统内部进行的编程方法&#xff0c;主要用于对闪存&#xff08;FLASH&#xff09;、EEPROM等非易失性存储器的编程。ISP编程提供了巨大的灵活性&#xff0c;允许…

SaaS用户增长:提升转化率的实践路径

在SaaS&#xff08;软件即服务&#xff09;行业这片竞争激烈的蓝海中&#xff0c;企业要实现稳健的用户增长&#xff0c;必须聚焦于优化用户获取与转化策略&#xff0c;以提升用户转化率。用户转化率&#xff0c;作为衡量SaaS产品市场吸引力和用户接纳度的核心指标&#xff0c;…

图文解析保姆级教程: IDEA里面创建SpringBoot工程、SpringBoot项目的运行和测试、实现浏览器返回字符串

文章目录 一、创建SpringBoot工程&#xff08;需要联网&#xff09;二、 定义请求处理类三、运行测试 此教程摘选自我的笔记&#xff1a;黑马JavaWeb开发笔记13——Springboot入门&#xff08;创建、运行&测试项目&#xff09;、Http协议&#xff08;请求&响应协议&…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院&#xff0c;十分感谢教程中的老师 本文仅作学习笔记分享交流&#xff0c;不作任何商业用途 预制体 在这个小案例中&#xff0c;水可以做成圆形但是带碰撞体&#xff0c;碰撞体比图形小一圈&#xff0c;顺便加上Trail renderer组件 材质 将碰撞…

SVN介绍和使用

一、SVN&#xff08;Subversion&#xff09; SVN 是一种版本控制系统&#xff0c;可以用于管理和控制文件的变更。以下是SVN的基本使用步骤&#xff1a; 安装SVN&#xff1a;首先&#xff0c;您需要在计算机上安装SVN客户端。您可以从Subversion官方网站下载安装程序&#xff…

sql-labs61-65关通关攻略

第61关 一&#xff1a;查看数据库 ?id1)) and updatexml(1,concat(1,(select database())),1)-- 二&#xff1a;查看表名 ?id1)) and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)-- 三&#…

MATLAB/Simulink 汽车ABS仿真模型 防抱死刹车 教程 资料 程序 模型 论文 视频

项目概述 防抱死制动系统&#xff08;ABS&#xff09;是现代车辆中的一项重要安全技术&#xff0c;它能够在紧急制动时防止车轮锁死&#xff0c;从而提高车辆的稳定性和操控性。本项目旨在使用MATLAB/Simulink建立一个完整的ABS仿真模型&#xff0c;帮助学习者理解ABS的工作原理…

WebRTC协议下的视频汇聚融合技术:EasyCVR构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

【杭州】目前就业情况-自述

博主在今年6月份&#xff0c;被自己领导下达了裁员通知&#xff0c;所以近期一直都没有更新博文。那么接下来简单介绍下杭州2024年就业情况吧&#xff01; 目录 一、行情 二、薪资 三、外包 四、如果你真快吃不上饭了 五、博主被问的面试题 一、行情 今年应该是有史以…

低代码技术助力移动端开发:简化开发流程,实现快速创新

在移动互联网快速发展的今天&#xff0c;企业和开发者面临着越来越高的需求&#xff0c;要求开发高质量、功能强大的移动应用&#xff0c;以满足用户的期待和市场的变化。然而&#xff0c;传统的移动端开发流程通常复杂且耗时&#xff0c;需要投入大量的资源和开发人员。为了应…

Unity坐标系计算3D中两直线的最短距离及最近点的几何原理

方法1&#xff1a; 已知空间中两直线AB, CD&#xff0c;判断它们是否相交 问题的关键是求出这两条直线之间的最短距离&#xff0c;以及在这个距离上最接近两线的点坐标&#xff0c;判断该点是否在直线AB和直线CD上。 首先将直线方程化为对称式&#xff0c;分别得到两直线方向向…

VUE 实现三级权限选中与全选

功能&#xff1a;点击全选时所有子级选中&#xff0c;点击子级时对应的所有父级要选中。 实现思路&#xff1a;通过递归将所有子级转化为一级&#xff0c;选中时将选中的ID存为一个二级数组。循环时判断当前项在选中的数组中存在时即为勾选状态。 1、所有子级选中&#xff1a…

【盖世汽车-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

python django 使用教程

前言 python django使用起来简单方便&#xff0c;大大节省开发时间&#xff0c;提高开发效率&#xff0c;现在介绍下如何使用 一、创建 Django 项目 首先&#xff0c;建立虚拟环境&#xff0c;&#xff08;最好养成一个项目一个环境的习惯&#xff0c;防止多个项目pip包混乱问…

Web3与AI的融合:开启去中心化应用的新纪元

在数字科技不断发展的今天&#xff0c;Web3与人工智能&#xff08;AI&#xff09;的融合正引领去中心化应用&#xff08;DApps&#xff09;的新纪元。这种结合不仅扩展了去中心化技术的应用场景&#xff0c;还为智能应用提供了更加高效和创新的解决方案。本文将深入探讨Web3与A…

深入理解HTTP连接池及其在Java中的应用

更多内容前往个人网站&#xff1a;孔乙己大叔 在现代的Web开发中&#xff0c;HTTP请求已经成为应用程序与外部服务交互的主要方式。随着微服务架构的流行&#xff0c;一个应用可能需要同时与多个外部服务进行通信&#xff0c;这导致HTTP请求的数量显著增加。为了提升性能和资源…