0
我有一个简单的折线图,使用HighCharts &尝试添加可拖动的绘图线。带有对数轴刻度的HighCharts可拖动曲线
$(function() {
function draggablePlotLine(axis, plotLineId) {
var clickX, clickY;
var getPlotLine = function() {
for (var i = 0; i < axis.plotLinesAndBands.length; i++) {
if (axis.plotLinesAndBands[i].id === plotLineId) {
return axis.plotLinesAndBands[i];
}
}
};
var getValue = function() {
var plotLine = getPlotLine();
var translation = axis.horiz ? plotLine.svgElem.translateX : plotLine.svgElem.translateY;
var new_value = axis.toValue(translation) - axis.toValue(0) + plotLine.options.value;
new_value = Math.max(axis.min, Math.min(axis.max, new_value));
return new_value;
};
var drag_start = function (e) {
$(document).bind({
'mousemove.line': drag_step,
'mouseup.line': drag_stop
});
var plotLine = getPlotLine();
clickX = e.pageX - plotLine.svgElem.translateX;
clickY = e.pageY - plotLine.svgElem.translateY;
if (plotLine.options.onDragStart) {
plotLine.options.onDragStart(getValue());
}
};
var drag_step = function (e) {
var plotLine = getPlotLine();
var new_translation = axis.horiz ? e.pageX - clickX : e.pageY - clickY;
var new_value = axis.toValue(new_translation) - axis.toValue(0) + plotLine.options.value;
new_value = Math.max(axis.min, Math.min(axis.max, new_value));
new_translation = axis.toPixels(new_value + axis.toValue(0) - plotLine.options.value);
plotLine.svgElem.translate(
axis.horiz ? new_translation : 0,
axis.horiz ? 0 : new_translation);
if (plotLine.options.onDragChange) {
plotLine.options.onDragChange(new_value);
}
};
var drag_stop = function() {
$(document).unbind('.line');
var plotLine = getPlotLine();
var plotLineOptions = plotLine.options;
//Remove + Re-insert plot line
//Otherwise it gets messed up when chart is resized
if (plotLine.svgElem.hasOwnProperty('translateX')) {
plotLineOptions.value = getValue()
axis.removePlotLine(plotLineOptions.id);
axis.addPlotLine(plotLineOptions);
if (plotLineOptions.onDragFinish) {
plotLineOptions.onDragFinish(plotLineOptions.value);
}
}
getPlotLine().svgElem
.css({'cursor': 'pointer'})
.translate(0, 0)
.on('mousedown', drag_start);
};
drag_stop();
};
$('#container').highcharts({
xAxis: {
min: -10,
max: 10,
plotLines: [{
id: 'foo',
color: '#00F',
width: 4,
value: 5,
onDragStart: function (new_value) {
$("#x_value").text(new_value + ' (Not changed yet)');
},
onDragChange: function (new_value) {
$("#x_value").text(new_value + ' (Dragging)');
},
onDragFinish: function (new_value) {
$("#x_value").text(new_value);
}
}]
},
yAxis: {
type: 'logarithmic',
plotLines: [{
label: {
text: 'Not draggable'
},
id: 'y1',
color: '#CCC',
width: 4,
value: 150
}, {
id: 'y2',
color: '#00F',
width: 4,
value: 200,
onDragStart: function (new_value) {
$("#y_value").text(new_value + ' (Not changed yet)');
},
onDragChange: function (new_value) {
$("#y_value").text(new_value + ' (Dragging)');
},
onDragFinish: function (new_value) {
$("#y_value").text(new_value);
}
}, {
label: {
text: 'Not draggable'
},
id: 'y3',
color: '#CCC',
width: 4,
value: 250
}]
},
series: [{
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}]
}, function (chart) {
draggablePlotLine(chart.xAxis[0], 'foo');
draggablePlotLine(chart.yAxis[0], 'y2');
console.log('ready');
});
});
的jsfiddle链接:(实际) 我叉形更新:http://jsfiddle.net/kk8322/z62nnmwe/1/
实际的jsfiddle工作正常 - 它具有垂直轴的规模,但同时拖动情节主线分叉版本失败。实际&分叉版本之间的区别在于,我的Y轴将是“对数”类型。
type: 'logarithmic'
为坐标轴添加对数坐标不能正确处理拖放操作。请建议我如何处理可对数x/y轴比例的可拖动曲线。
感谢分享。我会在本地尝试并检查。 – Karthikeyan
然而,对于我来说,这不起作用,不像问题中的示例代码,这不会计算该行的新“值”。有关如何重新创建getValue函数的任何建议(如问题中所述),适用于对数轴? – Basser
@Basser这将需要在代码中进行更改,以检测轴是否为线性并使用线性值。您可以检入Highcharts代码函数,如lin2log或log2lin。 –