echarts折线图实现矩形圈中的点可拖拽,圈外的点不可拖拽

原生HTML + JavaScript版本

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>曲线形式的统计图示例</title><script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/4.9.0-rc.1/echarts.min.js"></script><!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/4.2.1/echarts.min.js"></script> --><style>* {margin: 0;padding: 0;}#ecDiv {width: 1400px;height: 600px;box-shadow: 0px 0px 10px #ccc;margin: 10px auto;}</style>
</head><body><div id="ecDiv"></div><button id="buttonid">保存数据</button>
</body><script type="text/javascript">function deepClone(obj) {if (obj === null || typeof obj !== 'object') {return obj; // 如果是原始值或函数,直接返回}let clone;if (Array.isArray(obj)) {clone = []; // 如果是数组,创建一个空数组for (let i = 0; i < obj.length; i++) {clone[i] = deepClone(obj[i]); // 递归深拷贝数组的每个元素}} else {clone = {}; // 如果是对象,创建一个空对象for (let key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key]); // 递归深拷贝对象的每个属性}}}return clone; // 返回深拷贝后的对象或数组}let color = ['#0071db', '#ff4868', 'yellow', 'green']let xdata = ["2024-07-10 00:00:00","2024-07-10 00:15:00","2024-07-10 00:30:00","2024-07-10 00:45:00","2024-07-10 01:00:00","2024-07-10 01:15:00","2024-07-10 01:30:00","2024-07-10 01:45:00","2024-07-10 02:00:00","2024-07-10 02:15:00",]const data = [{name: '预测功率',data: [1.415,2.685,4.237,5.993,7.869,9.818,12.677,16.624,20.0,20.0,]},{name: '手动修正',data: [1.415,2.685,4.237,5.993,7.869,9.818,12.677,16.624,20.0,20.0,]},{name: '置信上限',data: [1.698,3.222,5.085,7.191,9.443,11.782,15.213,19.949,24.0,24.0,]},{name: '置信下限',data: [1.132,2.148,3.39,4.794,6.296,7.854,10.142,13.299,16.0,16.0,]}]const lineStyle = {type: 'scatter',smooth: true,coordinateSystem: 'cartesian2d'}let batchSelected = [];const computedSeries = (Data, dif = 0) => {let selected = batchSelected;let items = [];Data.map((item, key) => {let point = {name: item.name,data: item.data.map((val, i) => {let dataValue = {value: val,symbolSize: 1,}return dataValue}),...lineStyle}items.push(point);})selected.map((item) => {let seriesIndex = item.seriesIndex;let findItem = items.find((v, k) => {if (item.seriesIndex === k) {return v;}});findItem && findItem.data.map((val, key) => {if (item.dataIndex.includes(key) && seriesIndex === 1) {val['symbolSize'] = 10;val['value'] = val.value + dif;}})})let lines = items.map((v, k) => {let itemData = v.data.map((v) => v.value);return {z: 1,type: 'line',name: v.name,data: itemData}})items.push(...lines)return items;}const echartDataSetData = (Data, dif = 0) => {if (dif == 0) return;let selected = batchSelected;selected.map((item) => {let seriesIndex = item.seriesIndex;let Dataitem = Data[seriesIndex];Dataitem && Dataitem.data.map((val, key) => {if (item.dataIndex.includes(key) && seriesIndex === 1) {Dataitem.data[key] = val + dif;}})})}let onmousedownY = 0;let oldDif = 0;const seriesDataToGraphic = (series) => {let dom = document.getElementById('ecDiv');let myChart = echarts.getInstanceByDom(dom);let graphic = [];series.map((item, sindex) => {if (item.type === 'scatter') {item.data.map((dt, tk) => {//! 等于10 标识选中if (dt.symbolSize && dt.symbolSize === 10) {let dataIndex = tk;let position = myChart.convertToPixel({ seriesIndex: sindex }, [dataIndex, dt.value]);let graphicItem = {type: 'circle',position: position,shape: {r: 5},invisible: true,draggable: true,onmousedown: echarts.util.curry((e) => {onmousedownY = e.offsetY;// myChart.dispatchAction({//     type: 'restore'// })myChart.dispatchAction({type: 'takeGlobalCursor',key: null,})myChart.dispatchAction({type: 'brush',areas: []})}),ondrag: echarts.util.curry((dataI, e) => {let onmousedownYToValue = myChart.convertFromPixel({ seriesIndex: sindex }, [dataI, onmousedownY])[1];let ondragYToValue = myChart.convertFromPixel({ seriesIndex: sindex }, [dataI, e.offsetY])[1];let dif = onmousedownYToValue - ondragYToValue;let seriesData = computedSeries(data, -dif);let graphics = seriesDataToGraphic(seriesData);myChart.setOption({series: seriesData,graphic: graphics})oldDif = dif;}, dataIndex),ondragend: echarts.util.curry(() => {echartDataSetData(data, -oldDif);setSelectTitle(batchSelected)}, dataIndex),z: 100,}graphic.push(graphicItem);}})};})return graphic;}const setSelectTitle = (selected) => {let dom = document.getElementById('ecDiv');let myChart = echarts.getInstanceByDom(dom);let title = ''selected.map((item) => {if (!item.dataIndex.length) {return;}let seriesName = item.seriesName;let dataIndexList = item.dataIndex.map((i) => {return `{x|${xdata[i]}数值:${data[item.seriesIndex].data[i]}}\n`})let line = `{name|${seriesName}}${dataIndexList}`;title += '\n' + line;})// myChart.setOption({//     title: {//         text: '已选中:\n' + title,//         right: 20,//         top: 40,//         textStyle: {//             rich: {//                 name: {//                     color: '#333'//                 },//                 x: {//                     color: 'red'//                 }//             }//         }//     }// })}const initEchart = () => {let dom = document.getElementById('ecDiv');let myChart = echarts.init(dom);let dataIndexs = [];let seriesIndexs = [];let series = computedSeries(data, []);let option = {color,xAxis: [{type: 'category',data: xdata}],yAxis: [{type: 'value'}],grid: {width: "80%",containLabel: true,left: 30,top: 50,right: 30,bottom: 20},legend: {show: true,data: data.map((v) => v.name)},brush: {xAxisIndex: 'all',throttleType: 'debounce',transformable: false,removeOnClick: true,brushMode: 'single',throttleDelay: 0,brushStyle: {borderWidth: 1,color: 'rgba(120,140,180,0.1)',borderColor: 'rgba(120,140,180,0.1)'},inBrush: {symbolSize: 10},outOfBrush: {colorAlpha: 1,opacity: 1},},animation: false,series}myChart.setOption(option);myChart.on('brushselected', (params) => {if (!params.batch[0].areas.length) {return;};let batch = deepClone(params.batch[0]);let selected = batch.selected;batchSelected = selected;let seriesData = computedSeries(data);let graphics = seriesDataToGraphic(seriesData);myChart.setOption({series: seriesData,graphic: graphics})setSelectTitle(selected);})// ! 点击取消 取消选中节点myChart.on('brush', (params) => {if (params?.command === 'clear') {batchSelected.length = 0;let seriesData = computedSeries(data);let graphics = seriesDataToGraphic(seriesData);myChart.setOption({series: seriesData,graphic: graphics})setSelectTitle([]);}})}const handleCli = () => {console.log("1123", data)setSelectTitle([]);}document.querySelector("#buttonid").onclick = handleCli;initEchart();
</script></html>
</html>

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

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

相关文章

命令执行(RCE)面对各种过滤,骚姿势绕过总结

1、什么是RCE RCE又称远程代码执行漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 2、RCE产生原因 服务器没有对执行命令的函数做严格的过滤&#xff0c;最终导致命令被执行。 3、命令执行函数 PHP代码执行函数…

软件项目运维服务方案(Word原件)

1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 软件文档全套下载&#xff1a;本文末个人名片直接获取或者进主页。

喝酒骰子夜店手灯轮盘扫雷鳄鱼拆弹你演我猜小游戏流量主小程序开源版开发

喝酒骰子夜店手灯轮盘扫雷鳄鱼拆弹你演我猜小游戏流量主小程序开源版开发 喝酒摇骰子、轮盘、扫雷大战、夜店手灯、鳄鱼拔牙、喝酒大叔、指尖光环、拆弹英雄、幸运转转转、你演我猜、眼疾手快、占领方块、你演我猜。 喝酒骰子类小程序通常包含多种互动游戏和娱乐功能&#xf…

深入剖析数据库索引

写在前面&#xff1a; 此博客内容已经同步到我的博客网站&#xff0c;如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/database 文章目录 如何验证我们正在使用InnoDB引擎 主键如果你没有自己创建任何主键会发生什么&#xff1f;关键字和索引之间的区别…

HR8870:H桥PWM直流电机驱动IC性能指标和应用方案选型

HR8870芯片描述 HR8870是一款直流有刷电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达4.5A的峰值电流双向控制电机。利用电流衰减模式&#xff0c;可通过对输入进行…

vue3实现简单登录页面

使用 Vue3 ts scss element-plus 实现简单的用户登录界面&#xff0c;登录方式包括&#xff1a;手机验证码登录、手机账号密码登录、扫码登录&#xff0c;效果如下图所示&#xff1a; 详细代码&#xff1a; 模版部分 <template><div class"login">&l…

阿里云Elasticsearch-趣味体验

阿里云Elasticsearch-趣味体验 什么是阿里云Elasticsearch阿里云Elasticsearch开通服务查看Elasticsearch实例配置Kibana公网IP登录Elasticsearch添加测试数据 Kibana数据分析查看数据字段筛选数据页面条件筛选KQL语法筛选保存搜索语句导出筛选结果指定列表展示字段写在最后 什…

(硬件05)电流检测中运放的“虚短”与“虚断”

本文目录 本篇前言知识点讲解软件仿真 本篇前言 运放&#xff0c;全称是运算放大器&#xff0c;一般的用法是用来发大电信号的&#xff0c;本篇讲解到的就是通过运算放大器将大电流流过采样电阻后的电压进行放大后输出给单片机的ADC&#xff0c;单片机根据ADC的值&#xff08…

Commons-Collections篇-CC7链

前言 和CC5反序列化链相似&#xff0c;CC7也是后半条LazyMap执行命令链不变&#xff0c;但是中间过程通过AbstractMap.equals()触发LazyMap.get()方法 环境 我们可以接着使用之前已经搭建好的环境&#xff0c;具体过程可以看CC1分析文章的环境安装部分 Commons-Collections篇…

leecode-动态规划-基础题目

一、简述 DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的 重点&#xff1a;状态转移公式 二、一维 1、[509]斐波那契数 2、[70]爬楼梯 dp[i]可有dp[i-1]再爬一级台阶dp[i-2]再…

手表名表维修开单系统软件教程,佳易王钟表养护维护保养记录开单软件操作教程

手表名表维修开单系统软件教程&#xff0c;佳易王钟表养护维护保养记录开单软件操作教程 以下软件操作教程以&#xff0c;佳易王钟表养护维修管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件程序操作教程 1、佳易王钟表维…

第2章 信息技术知识

第2章 信息技术知识 本章简要叙述了信息技术相关基础知识&#xff0c;包含软件工程、面向对象系统分析与设计、应用集成技术、计算机网络技术和新一代信息技术内容。 2.1 软件工程 随着所开发软件的规模越来越大、复杂度越来越高&#xff0c;加之用户需求又并不十分明确&…

k8s上部署单节点apache-lotdb

一、yaml文件 使用的nfs的动态存储类&#xff0c;需要提前搭建。 # cat lotdb.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: logsnamespace: lotdb spec:storageClassName: "nfs-client"accessModes:- ReadWriteManyresources:requests:storag…

Spring Session 多服务Session共享

在新项目中需要开发单点登录功能&#xff0c;单点登录服务端提供方使用的是CAS技术&#xff0c;是根据Session来判断用户是否完成了登录操作的。Session是保存在服务器本地内存中的&#xff0c;而我的项目是需要多服务部署的&#xff0c;这就意味着会部署在不同的服务器中&…

中国百货业元宇宙转型:挑战与机遇并存

在数字化和科技创新的推动下&#xff0c;中国百货业正站在一个新的历史节点上。面对着电子商务的冲击和消费者需求的演变&#xff0c;传统百货业正在经历一场前所未有的转型。而元宇宙&#xff0c;这一全新概念的提出&#xff0c;为百货业的变革带来了无限的想象空间。 **百货…

淘宝商品历史价格查询(免费)

当前资料来源于网络&#xff0c;禁止用于商用&#xff0c;仅限于学习。 淘宝联盟里面就可以看到历史价格 并且没有加密 淘宝商品历史价格查询可以通过以下步骤进行&#xff1a; 先下载后&#xff0c;登录app注册账户 打开淘宝网站或淘宝手机App。在搜索框中输入你想要查询的商…

【Linux操作系统-测试】第二节.Linux 常用指令介绍(下)

文章目录 前言总结 前言 二、查看文件内容 2.1 cat 命令--查看文件内容 2.2 more 命令--分屏查看 2.3 grep 命令--过滤查看 三、linux其他常用命令 3.1 echo 命令--回显 3.2 clear 命令--清屏 3.3 >&#xff0c;>>重定向符号--输出重定向 3.4 管道符号--命令结果传递…

使用 Python 中的 `sklearn` 库实现 KNN 分类

Scikit-Learn 使用 Python 中的 sklearn 库实现 KNN 分类安装 sklearn 库导入库并准备数据使用 sklearn 实现 KNN 分类详细说明重点内容 使用 Python 中的 sklearn 库实现 KNN 分类 K最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种简单且有效的分类算法。在 P…

【问题记录】Windows中Node的express无法直接识别

问题描述 在使用express_generator的时候windows平台中出现无法识别express命令的问题&#xff0c;另外就算添加了全局环境变量也没用。 问题解决 查看官方文档发现在node版本8之前的时候使用的是express&#xff0c;但是之后的版本使用npx&#xff0c;这个工具的出现主要想…

keil mdk注释插件合集格式、时间、日期注释

文章目录 一、前言二、安装步骤2.1 解压tools.zip2.2 tools 文件解释2.3 添加注释带keil 三、配置3.1 格式化代码3.2 文件注释3.3函数注释3.4 当前日期3.5 当前时间 四、编辑注释模板4.1 编辑函数注释模板4.2 编辑C文件注释模板4.3 编辑h文件注释模板 五、为注释功能添加快捷键…