Echarts实现单条折线可拖拽效果

Echarts是一个适用于各类数据的可视化工具,官方提供了丰富的API和示例,其中包括了单条折线可拖拽效果的实现方法。以下是实现该效果的完整攻略。

实现步骤

1.在Echarts中使用直线图来渲染折线,并设置符合需求的option。需要注意的是,启用拖拽功能的折线需要设置draggable为true,cursor为"move",并绑定onDrag事件。在onDrag中,应该通过setOption方法实时更新折线的数据,以实现拖动效果。

2.实现onDrag事件,该事件应该触发每一次拖动行为,并返回该拖动行为的坐标点。可以通过以下方法实现:

onDrag: function(params) {
  let { target, dx, dy } = params;
  let xAxis = myChart.getModel().getComponent('xAxis').axis.scale;
  let yAxis = myChart.getModel().getComponent('yAxis').axis.scale;
  let series = myChart.getModel().getSeries()[0];
  let data = series.get('data');
  let dataIndex = target._echartsDataIndex;
  let itemData = data[dataIndex];
  let newItemData = [xAxis.p2c(xAxis.c2p(itemData[0]) + dx), yAxis.p2c(yAxis.c2p(itemData[1]) + dy)];
  data[dataIndex] = newItemData;
  myChart.setOption({
    series: [
      {
        data: data,
      },
    ],
  });
}

其中,params参数为拖拽事件信息,包括targetdxdy三个属性。target指代当前被拖拽元素,dxdy分别表示水平和竖直方向上的拖拽距离。通过该函数,将折线上对应的点坐标进行更新。

3.在html中引入相关js文件,使用如下代码初始化Echarts:

<div id="chart"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.9.0/echarts.min.js"></script>
<script>
  let myChart = echarts.init(document.getElementById('chart'));
</script>

示例

以下是两个实现单条折线可拖拽效果的完整示例,供参考。

示例一

let xAxisData = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
let seriesData = [820, 932, 901, 934, 1290, 1330, 1320];

let myChart = echarts.init(document.getElementById('chart'));

let option = {
  tooltip: {
    trigger: 'axis',
    position: function(pt) {
      return [pt[0], '10%'];
    },
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    data: xAxisData,
  },
  yAxis: {
    type: 'value',
    boundaryGap: [0, '10%'],
  },
  series: [
    {
      type: 'line',
      smooth: true,
      symbol: 'none',
      sampling: 'average',
      itemStyle: {
        color: '#1890ff',
      },
      areaStyle: {
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          {
            offset: 0,
            color: 'rgba(24, 144, 255, 1)',
          },
          {
            offset: 1,
            color: 'rgba(24, 144, 255, 0.1)',
          },
        ]),
      },
      data: seriesData.map(function(d, i) {
        return [xAxisData[i], d];
      }),
      cursor: 'move',
      draggable: true,
      onDrag: function(params) {
        let { target, dx, dy } = params;
        let xAxis = myChart.getModel().getComponent('xAxis').axis.scale;
        let yAxis = myChart.getModel().getComponent('yAxis').axis.scale;
        let series = myChart.getModel().getSeries()[0];
        let data = series.get('data');
        let dataIndex = target._echartsDataIndex;
        let itemData = data[dataIndex];
        let newItemData = [xAxis.p2c(xAxis.c2p(itemData[0]) + dx), yAxis.p2c(yAxis.c2p(itemData[1]) + dy)];
        data[dataIndex] = newItemData;
        myChart.setOption({
          series: [
            {
              data: data,
            },
          ],
        });
      },
    },
  ],
};
myChart.setOption(option);

示例二

let myChart = echarts.init(document.getElementById('chart'));

let base = -10;
let seriesData = [];

for (let i = 0; i <= 100; i++) {
  let theta = i / 100 * 360;
  let r = 5 * (1 + Math.sin(theta / 180 * Math.PI));
  seriesData.push([r * Math.cos(theta) + base, r * Math.sin(theta) + base]);
}

let option = {
  title: {
    text: 'Polar Graph',
  },
  legend: {
    show: true,
    data: ['line'],
  },
  polar: {
    center: ['50%', '54%'],
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross',
    },
  },
  angleAxis: {
    type: 'value',
    startAngle: 0,
  },
  radiusAxis: {},
  series: [
    {
      coordinateSystem: 'polar',
      name: 'line',
      type: 'line',
      showSymbol: false,
      data: seriesData,
      cursor: 'move',
      draggable: true,
      symbolSize: 0,
      animation: false,
      lineStyle: {
        color: '#1890ff',
        width: 2,
        type: 'solid',
      },
      areaStyle: {
        opacity: 0.3,
        color: '#1890ff',
      },
      onDrag: function(params) {
        let { target, dx, dy } = params;
        let polar = myChart.getModel().getComponent('polar').axis;
        let series = myChart.getModel().getSeries()[0];
        let data = series.get('data');
        let dataIndex = target._echartsDataIndex;
        let itemData = data[dataIndex];

        let newTheta = polar.c2p(polar.p2c(itemData[0]) + dx);
        let newR = polar.c2p(polar.p2c(itemData[1]) + dy);
        let theta = newTheta % 360;
        let r = Math.max(Math.min(newR, 150), 0);

        data[dataIndex] = [polar.p2c(theta), polar.p2c(r)];
        myChart.setOption({
          series: [
            {
              data: data,
            },
          ],
        });
      },
    },
  ],
};

myChart.setOption(option);

以上两个示例分别演示了直线图和极坐标图的折线拖拽效果,可以通过这两个示例的代码来了解实现方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Echarts实现单条折线可拖拽效果 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxNumberInput rtl属性

    以下是关于 jQWidgets jqxNumberInput 组件中 rtl 属性的详细攻略。 jQWidgets jqxNumberInput rtl 属性 jQWidgets jqxNumberInput 组件的 rtl 属性用于设置组件的文本方向为从右到左。 语法 $(‘#numberInput’).jqxNumberInput({ rtl: true…

    jquery 2023年5月12日
    00
  • jQuery UI Menu enable()方法

    jQuery UI Menu 是 jQuery UI 的一个组件,它是一个菜单插件,可以方便地构建多级菜单。而 enable() 方法是 jQuery UI Menu 组件提供的一个方法,可以启用(或禁用)指定菜单项。 语法 $( ".selector" ).menu( "enable", target ); 参数 t…

    jquery 2023年5月12日
    00
  • DataTables initComplete选项

    以下是关于DataTables initComplete选项的完整攻略: initComplete选项是什么? initComplete选项是DataTables中的一个选项,用于在表格初始化完成后执行回调函数。使用initComplete选项,可以在表格初始化完成后执行一些自定义的操作,例如添加自定义按钮、修改表格样式等。 如何使用initComplete…

    jquery 2023年5月11日
    00
  • 详解webpack引用jquery(第三方模块)的三种办法

    接下来我将详细讲解“详解webpack引用jquery(第三方模块)的三种办法”的完整攻略。 1. 安装jquery模块 首先,我们需要在项目中安装jquery模块。可以使用npm安装: npm install jquery –save 安装完成后,jquery模块会被保存在项目的”node_modules”目录中。 2. 引用jquery模块 在webp…

    jquery 2023年5月27日
    00
  • jQuery+HTML5美女瀑布流布局实现方法

    下面是详细的”jQuery+HTML5美女瀑布流布局实现方法”攻略: 概述 瀑布流布局是近年来非常流行的一种网页布局方式,它可以将页面上的数据以瀑布流的方式呈现出来,形式非常美观。本文将介绍如何使用jQuery和HTML5实现一个简单的美女瀑布流布局。 实现步骤 第一步:HTML结构 首先,我们需要构建一个基本的HTML结构,该结构包含”container”…

    jquery 2023年5月19日
    00
  • jQuery中on()方法用法实例详解

    jQuery中on()方法用法实例详解 简介 jQuery是一个流行的JavaScript库,为开发人员提供了一种更为简单、高效的编写与操作JavaScript的方式。当需要为网站添加交互功能时,jQuery是非常实用的选择之一。 其中,on()是jQuery中众多事件处理方法之一,用于在绑定事件时为全局和未来元素绑定事件。 语法 $(selector).o…

    jquery 2023年5月27日
    00
  • 如何使用CSS/jQuery在打字时将输入字符改为大写

    一、CSS方法: 使用CSS的text-transform属性,将输入的字符转换为大写。 input { text-transform: uppercase; } 在HTML中使用的方式也可以实现类似的效果。 二、jQuery方法: 给input元素添加一个class,比如“uppercase”: <input type=”text” class=”u…

    jquery 2023年5月12日
    00
  • JQuery parseHTML()方法

    jQuery.parseHTML()方法用于将HTML字符串解析为DOM节点数组。本文将详细介绍parseHTML()方法的语法和用法,并提供两个示例说明。 语法 以下是parseHTML()方法的基本语法: jQuery.parseHTML(html [, context ] [, keepScripts ]) 在这个语法中,html是要解析的HTML字符…

    jquery 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部