vue+echarts实现可拖动节点的折现图(支持拖动方向和上下限的设置)

本篇文档主要是利用echarts实现可拖动节点的折现图,在echarts中找到了一个demo,传送门:https://echarts.baidu.com/examples/editor.html?c=line-draggable,但是不是用vue写的,并且在改写为vue组件的过程中遇到了很多问题,在百度过程中发现并没有相关的文档,所以决定自己开发,并在demo的基础上开发了一些实用的功能,所以把这个过程记录下来。文档中还有很多不够完善的地方,欢迎讨论哈!

需求:制作一个折线图用于显示当前24小时的数据,并且可以通过拖动折现图设置数据

效果图如下:初步看和一般的折线图没什么区别,但是实际如图示,节点是可以上下拖动的

代码如下:

<template>
  <div ref="dom" class="charts chart-bar"></div>
</template>

<script>
import echarts from ‘echarts‘
import tdTheme from ‘_c/charts/theme.json‘  // 这是我自己写的主题文件,可以不用管
import { on, off } from ‘@/libs/tools‘ // 这是其他一些方法函数,可以不管
echarts.registerTheme(‘tdTheme‘, tdTheme)
export default {
  name: ‘ChartLine‘,
  props: {
    text: String,
    subtext: String,
    yName: String
  },
  data () {
    return {
      dom: null,
      symbolSize: 5,    // 通过拖动是可以实时改变这里的值的
      data: [[0, 10], [1, 10], [2, 20], [3, 30], [4, 36], [5, 20], [6, 25], [7, 20], [8, 21], [9, 22],
      [10, 23], [11, 25], [12, 10], [13, 11], [14, 19], [15, 20], [16, 12], [17, 13], [18, 12], [19, 9],
      [20, 21], [21, 18], [22, 10], [23, 12]]
    }
  },
  methods: {
    resize () {
      this.dom.resize()
    }
  },
  mounted () {
    this.dom = echarts.init(this.$refs.dom, ‘tdTheme‘)
    this.dom.setOption({
      title: {
        text: this.text,
        subtext: this.subtext,
        x: ‘center‘
      },
      grid: {
        left: 50,
        top: 40
      },
      tooltip: {
        trigger: ‘axis‘
      },
      xAxis: {
        min: 0,
        max: 23,
        type: ‘value‘,
        axisLabel: {
          formatter (value) {
            return value + ‘:00‘ // 格式时间显示方式
          }
        },
        axisLine: { onZero: false }
      },
      yAxis: {
        min: 4,
        max: 36,
        type: ‘value‘,
        name: this.yName,
        axisLine: { onZero: false }
      },
      series: [
        {
          id: ‘a‘,
          type: ‘line‘,
          smooth: true,
          symbolSize: this.symbolSize, // 为了方便拖拽,把 symbolSize 尺寸设大了。
          data: this.data
        }
      ]
    })
    this.dom.setOption({
      graphic: echarts.util.map(this.data, (dataItem, dataIndex) => {
        const that = this // 因为ondrag函数必须在回调内使用this.position获取实时坐标,此处必须用that替换this
        return {
          // ‘circle‘ 表示这个 graphic element 的类型是圆点。
          type: ‘circle‘,
          shape: {
            // 圆点的半径。
            r: this.symbolSize / 2
          },
          // 用 transform 的方式对圆点进行定位。position: [x, y] 表示将圆点平移到 [x, y] 位置。
          // 这里使用了 convertToPixel 这个 API 来得到每个圆点的位置
          position: this.dom.convertToPixel(‘grid‘, dataItem),
          // 这个属性让圆点不可见(但是不影响他响应鼠标事件)。
          invisible: true,
          // 这个属性让圆点可以被拖拽。
          draggable: true,
          // 把 z 值设得比较大,表示这个圆点在最上方,能覆盖住已有的折线图的圆点。
          z: 100,
          ondrag: echarts.util.curry(function (dataIndex) { // 此处必须用匿名函数,不能用箭头函数,否则拿不到拖动的坐标
            let origin = that.dom.convertToPixel(‘grid‘, that.data[dataIndex]) // 得到每个圆点原始位置
            // let maxY = that.dom.convertToPixel(‘grid‘, [40, 36]) // 最高温度为36摄氏度,暂未做封装
            // 超过最高温度36将不能拖动,写死的最低点高度为240,最高点为40
            if (this.position[1] > 240) {
              this.position[1] = 240
            } else if (this.position[1] < 40) {
              this.position[1] = 40
            }
            this.position[0] = origin[0] // 控制每个点位只能在y轴方向移动
            // this.position[1] = origin[1] // 控制每个点位只能在x轴方向移动
            // 实时获取拖动的点位信息并根据此信息重新画图
            that.data[dataIndex] = that.dom.convertFromPixel(‘grid‘, this.position)
            that.dom.setOption({
              series: [{
                id: ‘a‘,
                data: that.data
              }]
            })
          }, dataIndex)
        }
      })
    })
    on(window, ‘resize‘, this.dom.setOption({
      graphic: echarts.util.map(this.data, (item, dataIndex) => {
        return {
          position: this.dom.convertToPixel(‘grid‘, item)
        }
      })
    }))
  },
  beforeDestroy () {
    off(window, ‘resize‘, this.resize)
  }
}
</script>

原文地址:https://www.cnblogs.com/p-l-u-m/p/10691684.html

时间: 2024-10-05 12:34:44

vue+echarts实现可拖动节点的折现图(支持拖动方向和上下限的设置)的相关文章

使用echarts实现了一个折现图,数据是一天24小时

arr //你的数据 dataZoom : { show: true, realtime: true, startValue: arr.length - 240, endValue: arr.length } 使用echarts实现了一个折现图,数据是一天24小时,每隔30s从数据库取一次数据,但是这样可读性很低.所以需要在加载图片后,显示最近两个小时的数据,但是dataZoom只能控制起始值,用此方法来显示最近两小时的数据 原文地址:https://www.cnblogs.com/ronle/

python简单的绘制折现图

在做一些数据统计时,折现图能够看出变化的趋势,最近查内存泄漏,跑了一个晚上的数据,想查查,那么折现图能够给一个很直观的结果. 我们使用pylab包来绘制图形. 我使用pip来管理python包 sudo pip install pylab 时间比较长,其会下载一些依赖的包. #!/usr/bin/python import os import matplotlib.pyplot as plt allFile = [] r = open('result', 'w') heap = [] for f

d3 基础折现图和饼图

折线图 折现图可以使用svg折线元素polyline来定义一组相连的直线段,但是更推荐使用d3.line()和path元素组合使用,这样更加灵活. d3.line()构造一个新的线生成器,使用默认的.x和.y设置x,y访问器函数. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body&g

echarts折现图配置

js引用和div容器 1 <div id="container" style="height: 100%"></div> 2 <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script> 3 <script type

A股最新的自由现金流和折现估值查询

A股最新的自由现金流折现估值,利用自由现金流折现的经典公式,采用 8%.9%.10%.11%.12%.15% 等贴现率来进行估值. SH600000:浦发银行的最新自由现金流和折现估值模型: 浦发银行 SH600004:白云机场的最新自由现金流和折现估值模型: 白云机场 SH600005:武钢股份的最新自由现金流和折现估值模型: 武钢股份 SH600006:东风汽车的最新自由现金流和折现估值模型: 东风汽车 SH600007:中国国贸的最新自由现金流和折现估值模型: 中国国贸 SH600008:

html5---svg(折现数据表格)

上一篇我们说了如何画圆饼.这一次我们说如何做折线图.网上有个库chartist.js做svg矢量数据的一个库.里面有个折现统计,我没有做的和他一样,因为我也不是很熟悉svg.权当先试试水而已,所以写的不好.望各位指教.上代码!!!!!!!!!!! (function(){ function svg(option){ this.config = this.extend(this.config,option); /*表格生成*/ this.crateform(); this.holaddata();

给Jquery添加alert,prompt方法,类似系统的Alert,Prompt,可以响应键盘,支持拖动

我们在调用系统的Alert,prompt的弹出提示时,不同的系统会有不同的提示框,视觉效果不统一,而且不好看,功能单一,现在我们通过Jquery模拟Alert,prompt,现实统一视觉效果,而且内容丰富的弹出提示. Jquery可以扩展自己的功能,如果对Jquery开发插件不熟悉的人可以到官方网去看看文档,比较简单易懂. Js代码   /* *  本插件基于JQUERY *  Jquery版本: 1.7.2 *        Date:2012-06-28 *      Author:King

vbs实现的支持拖动的txt文本切割器

vbs实现的支持拖动的txt文本切割器 作者: 字体:[增加 减小] 类型:转载 时间:2008-06-20我要评论 用vbs实现的txt文本文件切割器,默认为8000个字符切为一个文件.支持拖动. SplitFile.vbs '/*=========================================================================    ' * Intro       .txt文本切割器,默认为8000个字符切为一个文件.支持拖动.    ' * 

Android:图片中叠加文字,支持拖动改变位置

之所以做了这么一个Demo,是由于近期项目中有一个奇葩的需求:用户拍摄照片后,分享到微信的同一时候加入备注,想获取用户在微信的弹出框输入的内容.保存在自己的server上.而其实,这个内容程序是无法获取的,因此採取了一个折衷方案,将文字直接写在图片上. 首先上Demo效果图: 功能: 1.用户自由输入内容,可手动换行,而且行满也会自己主动换行. 2.可拖动改变图片中文本位置(文字不会超出图片区域). 3.点击"生成图片"button之后,生成一张带有文字的图片文件. 代码不多,直接所有