vue+echarts 鼠标按下手动重绘曲线,抬起停止绘制

本文介绍如何使用React和echarts库在图表上实现鼠标按住移动时折线图的实时重绘,利用echarts的getZr()和convertFromPixel方法来获取鼠标位置并更新数据。
摘要由CSDN通过智能技术生成

本文章根据react+echarts的文章博主修改而来,原博客地址:

【echarts+react鼠标绘制折线图】实现鼠标在图表上按住移动,折线实时重绘_实现用鼠标折线图-CSDN博客

效果与其相同

直接把下面定义的函数复制就可以用,记得要初始化echarts并设置宽高,否则会init失败

 核心点就在于echarts自带的getZr(),它用于监控鼠标在滑过图表范围内所处的位置,再根据convertFromPixel方法转换一下,就可以拿到数据,具体自己可以打印一下看看,就能明白了。

setCharts() {
      this.myCharts.clear()
      let seriesData = [
        ['00:15', 134],
        ['00:30', 43],
        ['00:45', 254],
        ['01:00', 565],
        ['01:15', 35],
        ['01:30', 786],
        ['01:45', 89],
        ['02:00', 177],
        ['02:15', 52],
        ['02:30', 25],
        ['02:45', 10],
        ['03:00', 145],
        ['03:15', 366],
        ['03:30', 70],
        ['03:45', 20],
        ['04:00', 80],
      ]
      let xData = [
        '00:15',
        '00:30',
        '00:45',
        '01:00',
        '01:15',
        '01:30',
        '01:45',
        '02:00',
        '02:15',
        '02:30',
        '02:45',
        '03:00',
        '03:15',
        '03:30',
        '03:45',
        '04:00',
      ]
      let symbolSize = 8

      // 配置折线图
      let option = {
        title: {
          text: '时间范围:2023-01-30 00:15 至 2023-01-30 04:00',
          x: 'left',
          textStyle: {
            color: '#000',
            fontWeight: 'lighter',
            fontSize: 16,
          },
        },
        tooltip: {
          trigger: 'axis',
        },
        grid: {
          /* 数据网格属性 */
          left: '2%',
          right: '4%',
          bottom: '6%',
          containLabel: true,
        },
        legend: {
          itemWidth: 6, // 宽度
          itemHeight: 6, // 高度
          itemGap: 30, // 间距
          textStyle: {
            color: '#333',
            fontSize: 16,
            lineHight: 16,
          },
        },
        xAxis: [
          {
            // name: '日期',
            type: 'category',
            axisTick: {
              alignWithLabel: true,
            },
            axisLine: {
              onZero: false,
              lineStyle: {
                color: '#333',
              },
            },
            axisLabel: {
              // 坐标轴刻度标签的相关设置。
              color: '#333',
              fontSize: 14,
              formatter: function (params) {
                let newParamsName = '' // 最终拼接成的字符串
                let paramsNameNumber = params.length // 实际标签的个数
                let provideNumber = 8 // 每行能显示的字的个数
                let rowNumber = Math.ceil(paramsNameNumber / provideNumber) // 换行的话,需要显示几行,向上取整
                /**
                 * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
                 */
                // 条件等同于rowNumber>1
                if (paramsNameNumber > provideNumber) {
                  /** 循环每一行,p表示行 */
                  for (let p = 0; p < rowNumber; p++) {
                    let tempStr = '' // 表示每一次截取的字符串
                    let start = p * provideNumber // 开始截取的位置
                    let end = start + provideNumber // 结束截取的位置
                    // 此处特殊处理最后一行的索引值
                    if (p == rowNumber - 1) {
                      // 最后一次不换行
                      tempStr = params.substring(start, paramsNameNumber)
                    } else {
                      // 每一次拼接字符串并换行
                      tempStr = params.substring(start, end) + '\n'
                    }
                    newParamsName += tempStr // 最终拼成的字符串
                  }
                } else {
                  // 将旧标签的值赋给新标签
                  newParamsName = params
                }
                // 将最终的字符串返回
                return newParamsName
              },
            },
            data: xData,
          },
        ],
        yAxis: [
          {
            name: '单位:kW',
            type: 'value',
            // y轴文字颜色
            axisLabel: {
              color: '#333',
              fontSize: 14,
            },
            axisLine: {
              show: true,
            },
          },
        ],
        series: [
          {
            id: 'a',
            name: '曲线修正',
            type: 'line',
            smooth: false,
            symbol: 'circle',
            symbolSize: symbolSize,
            data: seriesData,
          },
        ],
      }
      let charts = this.myCharts
      let click = false
      this.myCharts.setOption(option)
      this.myCharts.getZr().on('mousedown', handleMouseDown)
      this.myCharts.getZr().on('mousemove', mousemoveChart)
      this.myCharts.getZr().on('mouseup', handleMouseUp)
      this.myCharts.getZr().on('globalout', handleMouseUp) // 鼠标移出整个图表时触发

      function mousemoveChart(e) {
        if (click) {
          const [xAxisValue, yAxisValue] = charts.convertFromPixel('grid', [e.event.offsetX, e.event.offsetY])
          // console.log('data1', xAxisValue, yAxisValue)
          seriesData[xAxisValue][1] = yAxisValue
          charts.setOption({
            series: [
              {
                id: 'a',
                data: seriesData,
              },
            ],
          })
        }
      }
      function handleMouseDown() {
        click = true
      }
      function handleMouseUp() {
        click = false
      }
    },

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 在Vue中使用Echarts绘制曲线图的步骤如下: 1. 首先,你需要安装Echarts。可以通过运行命令`npm install echarts --save`来安装Echarts。\[2\] 2. 在Vue项目中引入Echarts。你可以在Vue的入口文件中引入Echarts,并将其作为Vue的原型属性,以便在整个项目中使用。例如,在main.js文件中添加以下代码: ```javascript import echarts from 'echarts' Vue.prototype.$echarts = echarts ``` 这样,你就可以在Vue组件中使用`this.$echarts`来访问Echarts对象了。\[2\] 3. 创建一个Vue页面,并在其中展示Echarts曲线图。你可以在Vue组件的template中添加一个div元素作为Echarts图表的容器,并给它一个唯一的id。然后,在Vue组件的script中,使用`this.$echarts.init`方法初始化Echarts实例,并通过设置option来配置曲线图的数据和样式。最后,在mounted钩子函数中调用绘制图表的方法。以下是一个简单的示例代码: ```html <template> <div class="EchartPractice"> <div id="main"></div> </div> </template> <script> export default { name: "EchartPractice", methods: { drawChart() { let myEchart = this.$echarts.init(document.getElementById("main")); let option = { xAxis: { data: \['7.8', '7.9', '7.10', '7.11', '7.12', '7.13', '7.14'\] }, yAxis: {}, series: \[{ data: \[60, 80, 100, 120, 200, 170, 180\], type: 'line', smooth: true, symbol: "none", areaStyle: { color: '#344CE9', opacity: 0.5 } }\] }; myEchart.setOption(option); } }, mounted() { this.drawChart(); } } </script> <style scoped> #main { width: 600px; height: 400px; margin: auto; margin-top: 100px; } </style> ``` 在上述代码中,我们创建了一个名为EchartPractice的Vue组件,其中的drawChart方法用于绘制曲线图,mounted钩子函数在组件挂载后调用drawChart方法来绘制图表。\[3\] 这样,你就可以在Vue项目中使用Echarts绘制曲线图了。希望对你有所帮助! #### 引用[.reference_title] - *1* [Vue Element UI 之ECharts图表](https://blog.csdn.net/qq_41956139/article/details/104618285)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [在vue中使用echarts](https://blog.csdn.net/weixin_43304253/article/details/123269480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vue中使用Echarts实现曲线图](https://blog.csdn.net/weixin_48494427/article/details/126904555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值