echarts折线图 上下拖动数据怎么做?

如图这样:echarts折线图 上下拖动数据怎么做?


回答:

又是你,再给你个官方例子 https://echarts.apache.org/ex...


这是我之前做的相关功能,是柱状图,你可以参考下,里面很多东西你应该用不到,你自己精简下

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<style>

html, body{

width: 100%;

height: 100%;

padding: 0;

margin: 0;

}

#m-chart{

margin: 10px;

width: 800px;

height: 800px;

}

</style>

</head>

<body>

<div id="m-chart" class="charts"></div>

</body>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

<script src="https://lib.baomitu.com/echarts/5.1.2/echarts.common.min.js"></script>

<script>

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

let symbolSize = 20;

let originData = [25, 25, 25, 25];

let xAxis = ['08时-14时', '14时-20时', '20时-02时', '02时-08时']

let ratioData = originData.map((item, index) => {

return {

name: xAxis[index],

value: item

}

})

let activeRatioData

setCharts();

function setCharts(){

let option = {

grid:{

left: '5%',

top: '10%',

right: '5%',

bottom: '7%'

},

xAxis: {

type: 'category', // 'category' 'value'

name: '时程',

data: xAxis,

splitLine: {

show: false

}

},

yAxis: {

min: 0,

max: 100,

interval: 10,

type: 'value',

name: '比例(%)'

},

series: [

{

id: 'scfp',

type: 'bar',

//smooth: true,

//symbolSize: symbolSize,

data: [],

label: {

normal: {

show: true,

color: '#fff',

fontWeight: 'bold',

fontSize: 16,

position: 'inside', //insideTop inside [50%', '50%'] 'top'

//offset: [0, 10]

}

},

markPoint: {

symbol: 'circle',

symbolSize: symbolSize,

itemStyle: {

normal: {

color: '#00f'

}

},

silent: true,

animation: false,

data: [],

}

}

]

};

myChart.setOption(option);

setOptionData()

setTimeout(setGraphic, 0);

}

function setOptionData(){

let data = ratioData.map(item => {

return {

name: item.name,

value: item.value,

itemStyle: {

normal: {

color: item.disabled ? '#71c6ff' : '#1692f4', // 71c6ff

barBorderRadius: [5, 5, 0, 0]

},

emphasis: {

color: item.disabled ? '#71c6ff' : '#1692f4',

barBorderRadius: [5, 5, 0, 0]

}

}

}

})

myChart && myChart.setOption({

series: [{

id: 'scfp',

data: data,

markPoint: {

data: ratioData.map((item, index) => {

return { coord: item.disabled ? undefined : [index, item.value] }

})

}

}]

});

}

function setGraphic(){

// Add shadow circles (which is not visible) to enable drag.

myChart.setOption({

graphic: echarts.util.map(ratioData, function (item, dataIndex) {

var position = myChart.convertToPixel('grid', [item.name, item.value])

return {

type: 'circle',

position: position,

shape: {

cx: 0,

cy: 0,

r: item.disabled ? 0 : (symbolSize / 2)

},

invisible: true, // false 显示拖拽的点

draggable: item.disabled ? false : true,

ondragstart: function(){

setTimeout(function(){

activeRatioData = JSON.parse( JSON.stringify(ratioData) )

}, 0)

},

ondrag: echarts.util.curry(onPointDragging, dataIndex),

ondragend: echarts.util.curry(function onDragend(index){

setTimeout(dragCallBack, 100, index)

}, dataIndex),

z: 100

};

})

});

}

function onPointDragging(dataIndex) {

if(!onPointDragging.offSetTime){

onPointDragging.offSetTime = setTimeout(_ => {

let data = myChart.convertFromPixel('grid', this.position);

let val = +data[1].toFixed(0);

changeVal(val, dataIndex)

setOptionData()

onPointDragging.offSetTime = null

}, 100)

}

}

function changeVal(val, dataIndex){

if(activeRatioData){

ratioData = JSON.parse( JSON.stringify(activeRatioData) )

activeRatioData = null

}

let count = 100 //可改变元素的总值

//从大到小排序,从后面pop

let narr = ratioData.filter((item, index) => {

if(item.disabled){

count -= item.value

}else if(index != dataIndex){

return true

}

}).sort((a, b) => b.value - a.value);

val = val > count ? count : val < 0 ? 0 : val;

val = +val.toFixed(0)

let diff = ratioData[dataIndex].value - val //差值,平均分配给可改变的元素

let diffItem = (diff / narr.length) | 0;

let item = narr.pop();

while (item) {

let v = item.value + diffItem

if(v < 0){

//diff -30 ; diffItem -10 ; item.value 5 ; v -5

// ==> diff -25 item.value 0

diff += item.value

item.value = 0

}else if(v > 100){

//diff 30 ; diffItem 10 ; item.value 98 ; v 108

// ==> diff 28 item.value 100

diff += item.value - 100

item.value = 100

}else{

//diff 30 ; diffItem 10 ; item.value 28 ; v 38

// ==> diff 20 item.value 38

diff -= diffItem

item.value = v

}

diffItem = (diff / narr.length) | 0;

item = narr.pop();

}

ratioData[dataIndex].value = val

}

function dragCallBack(index){

ratioData[index].disabled = true

setOptionData()

setGraphic()

let nodis = ratioData.filter(item => !item.disabled)

if(nodis.length == 1){

let i = ratioData.indexOf(nodis[0])

dragCallBack(i)

}

}

</script>

</html>


回答:

最后总结一下我操作的方法:

//鼠标事件,mousedown/mousemove/mouseup

  this.myChart.getZr().on("mousedown", (params) => {

//do something

//将params.offsetX,params.offsetY通过myChart.convertFromPixel方法转换成图表的x轴和y轴,就可以操作数据了

const axisData = this.myChart.convertFromPixel("grid", [

params.offsetX,

params.offsetY,

]);

});

      //鼠标按下时

_this.myChart.getZr().on("mousedown", (params) => {

_this.mouseModifying = true;

//显示鼠标模拟线段

_this.showMouseLine(params);

});

//鼠标滑动时

_this.myChart.getZr().on("mousemove", (params) => {

if (_this.mouseModifying) {

_this.mouseMoveing = true;

//显示鼠标模拟线段

_this.showMouseLine(params);

}

});

// 鼠标拖拽事件 松开时

_this.myChart.getZr().on("mouseup", (params) => {

try {

if (_this.mouseModifying) {

const mouseData = _this.myChart.convertFromPixel("grid", [

params.offsetX,

params.offsetY,

]);

//x轴的下标

_this.mousedownXAxisPosition = mouseData[0];

...

}

_this.mouseModifying = false;

_this.mouseMoveing = false;

} catch (e) {

//鼠标作用点超出图表时

_this.mouseModifying = false;

_this.mouseMoveing = false;

}

});

let erd = elementResizeDetectorMaker();

erd.listenTo(document.getElementById("chart"), function (element) {

_this.$nextTick(function () {

_this.myChart.resize(); //变化重新渲染图

});

});

    //显示鼠标线段

showMouseLine(params) {

const _this = this;

try {

//鼠标移动时

if (this.mouseMoveing) {

this.option.color.length = this.option.color.length - 1;

this.option.series.length = this.option.series.length - 1;

}

const mouseData = this.myChart.convertFromPixel("grid", [

params.offsetX,

params.offsetY,

]);

//超过图表外不操作数据

if (

mouseData[0] < 0 ||

mouseData[0] > 24 ||

mouseData[1] < this.yAxisTemperationMinValue ||

mouseData[1] > this.yAxisTemperationMaxValue

) {

return false;

}

...

} catch (e) {

//范围超出时

//console.log(e.message,e.stack);

if (e.message === "Invalid array length") {

_this.mouseModifying = false;

_this.mouseMoveing = false;

_this.isInputChange = false;

}

}

},

以上是 echarts折线图 上下拖动数据怎么做? 的全部内容, 来源链接: utcz.com/p/935853.html

回到顶部