height chart bar can draggable.

本文介绍了一个实验性的可拖动数据点插件,该插件允许用户在图表上通过鼠标操作来调整数据点的位置,并在指定的最小和最大值范围内进行限制。插件还提供了对柱状图数据点的可视化跟踪功能,特别是对于小型数据点更为直观。通过此插件,用户可以更灵活地调整图表数据,增强交互性和数据分析能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://jsfiddle.net/highcharts/AyUbx//** * Experimental Draggable points plugin * Revised 2012-07-09 * * On Saving this jsbin, remember to update http://jsfiddle.net/highcharts/AyUbx/ */(function(Highcharts) { var addEvent = Highcharts.addEvent, each = Highcharts.each; /** * Filter by dragMin and dragMax */ function filterRange(newY, series) { var options = series.options, dragMin = options.dragMinY, dragMax = options.dragMaxY; if (newY < dragMin) { newY = dragMin; } else if (newY > dragMax) { newY = dragMax; } return newY; } Highcharts.Chart.prototype.callbacks.push(function (chart) { var container = chart.container, dragPoint, dragX, dragY, dragPlotX, dragPlotY; chart.redraw(); // kill animation (why was this again?) addEvent(container, 'mousedown', function(e) { var hoverPoint = chart.hoverPoint, options = hoverPoint && hoverPoint.series.options; if (options.draggableX) { dragPoint = hoverPoint; dragX = e.pageX; dragPlotX = dragPoint.plotX; } if (options.draggableY) { dragPoint = hoverPoint; dragY = e.pageY; dragPlotY = dragPoint.plotY + (chart.plotHeight - (dragPoint.yBottom || chart.plotHeight)); } }); addEvent(container, 'mousemove', function(e) { if (dragPoint) { var deltaY = dragY - e.pageY, deltaX = dragX - e.pageX, newPlotX = dragPlotX - deltaX - dragPoint.series.xAxis.minPixelPadding, newPlotY = chart.plotHeight - dragPlotY + deltaY, newX = dragX === undefined ? dragPoint.x : dragPoint.series.xAxis.translate(newPlotX, true), newY = dragY === undefined ? dragPoint.y : dragPoint.series.yAxis.translate(newPlotY, true), series = dragPoint.series; newY = filterRange(newY, series); dragPoint.update([newX, newY], false); chart.tooltip.refresh(dragPoint); if (series.stackKey) { chart.redraw(); } else { series.redraw(); } } }); function drop(e) { if (dragPoint) { var deltaX = dragX - e.pageX, deltaY = dragY - e.pageY, newPlotX = dragPlotX - deltaX - dragPoint.series.xAxis.minPixelPadding, newPlotY = chart.plotHeight - dragPlotY + deltaY, series = dragPoint.series, newX = dragX === undefined ? dragPoint.x : dragPoint.series.xAxis.translate(newPlotX, true), newY = dragY === undefined ? dragPoint.y : dragPoint.series.yAxis.translate(newPlotY, true); newY = filterRange(newY, series); dragPoint.firePointEvent('drop'); dragPoint.update([newX, newY]); dragPoint = dragX = dragY = undefined; } } addEvent(document, 'mouseup', drop); addEvent(container, 'mouseleave', drop); }); /** * Extend the column chart tracker by visualizing the tracker object for small points */ var colProto = Highcharts.seriesTypes.column.prototype, baseDrawTracker = colProto.drawTracker; colProto.drawTracker = function() { var series = this; baseDrawTracker.apply(series); each(series.points, function(point) { point.tracker.attr(point.shapeArgs.height < 3 ? { 'stroke': 'black', 'stroke-width': 2, 'dashstyle': 'shortdot' } : { 'stroke-width': 0 }); }); }; })(Highcharts);var chart = new Highcharts.Chart({ chart: { renderTo: 'container', animation: false }, xAxis: { categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] }, plotOptions: { series: { cursor: 'ns-resize', point: { events: { drop: function() { $('#report').html( this.category + ' was set to ' + Highcharts.numberFormat(this.y, 2) ); } } } }, column: { stacking: 'normal' } }, tooltip: { yDecimals: 2 }, series: [{ data: [0, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4], //draggableX: true, draggableY: true, dragMinY: 0, type: 'column' }, { data: [0, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4].reverse(), draggableY: true, dragMinY: 0, type: 'column' }, { data: [0, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4], draggableY: true }]});
// 1. 获取目标元素和图表容器 const targetElement = document.getElementById('draggable-element'); const chartContainer = document.getElementById('echarts-container'); let chartInstance = echarts.init(chartContainer); // 2. 初始化元素位置监听器 function initPositionTracker() { // 使用ResizeObserver监听元素尺寸变化 const resizeObserver = new ResizeObserver(() => updateChartLayout()); resizeObserver.observe(targetElement); // 监听窗口大小变化 window.addEventListener('resize', () => { throttle(updateChartLayout, 200)(); }); // 3. 实现拖拽功能 let isDragging = false; let offsetX, offsetY; targetElement.addEventListener('mousedown', (e) => { isDragging = true; offsetX = e.clientX - targetElement.getBoundingClientRect().left; offsetY = e.clientY - targetElement.getBoundingClientRect().top; targetElement.style.cursor = 'grabbing'; }); document.addEventListener('mousemove', (e) => { if (!isDragging) return; const x = e.clientX - offsetX; const y = e.clientY - offsetY; // 更新元素位置(限制在可视区域内) targetElement.style.left = `${Math.max(0, Math.min(x, window.innerWidth - targetElement.offsetWidth))}px`; targetElement.style.top = `${Math.max(0, Math.min(y, window.innerHeight - targetElement.offsetHeight))}px`; }); document.addEventListener('mouseup', () => { if (isDragging) { isDragging = false; targetElement.style.cursor = 'grab'; updateChartLayout(); // 拖拽结束时更新图表 } }); } // 4. 更新ECharts布局 function updateChartLayout() { // 获取元素相对于视口的位置 const rect = targetElement.getBoundingClientRect(); // 计算新布局参数(示例:将图表置于元素右侧) const newLayout = { left: rect.right + 20, top: rect.top, width: window.innerWidth - rect.right - 40, height: rect.height }; // 更新图表布局 chartInstance.setOption({ grid: newLayout }); // 重绘图表 chartInstance.resize(); } // 5. 节流函数优化性能 function throttle(fn, delay) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if (now - lastCall < delay) return; lastCall = now; fn.apply(this, args); } } // 初始化 initPositionTracker(); <div class="dashboard"> <!-- 可拖拽控制面板 --> <div id="draggable-element" style="position: absolute; cursor: grab;"> <h3>控制面板</h3> <!-- 控制组件... --> </div> <!-- ECharts容器 --> <div id="echarts-container" style="height: 600px;"></div> </div> <script> // 初始化图表 const option = { grid: { left: 300 }, // 初始布局 xAxis: { type: 'category' }, yAxis: {}, series: [{ type: 'bar', data: [120, 200, 150] }] }; chartInstance.setOption(option); </script>
最新发布
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值