在 Dygraphs 中有两个 y 轴对齐零
Have two y-axis in Dygraphs with aligned zero
当使用 dygraphs 显示两个系列(轴 y 和 y2)时,如何处理具有公共零的两个 y 轴?
例如对于
1,-1,0
2,1,2
dygraph 目前会将第一个 y 轴从 -1 到 1,第二个从 0 到 2。由于这两个值都应该表示变化(delta),所以这种方式非常混乱。
作为旁注,我将两个轴的 valueRange 设置为 [null, null](数据集的某些部分具有相当大的值,其他部分非常小 - 放大时我希望能够更好地了解当地差异)。我也在使用自定义绘图仪(multiColumnBarPlotter 进行了调整以处理负值)。
我已经通过相对于彼此调整 y 轴范围解决了这个问题(暂时?),所以每个轴的正负部分的比率是相同的。以下代码似乎适用于我的用例。
function zoom(minDate, maxDate) {
minFirst = g.yAxisRanges()[0][0]
maxFirst = g.yAxisRanges()[0][1] || 1
minSecond = g.yAxisRanges()[1][0]
maxSecond = g.yAxisRanges()[1][1] || 1
if (minFirst >= 0 && minSecond >= 0) {
// setting both to zero will align zero at bottom
minFirst = secondFirst = 0;
} else {
// calculate ratio ( negative part : positive part )
var ratioFirst = - minFirst / maxFirst
var ratioSecond = - minSecond / maxSecond
if (minFirst >= 0 || ratioFirst < ratioSecond) {
minFirst = - maxFirst * ratioSecond
} else {
minSecond = - maxSecond * ratioFirst
}
}
g.updateOptions({
axes: {
y: { valueRange: [minFirst, maxFirst] },
y2: { valueRange: [minSecond, maxSecond] }
}
});
}
function resetY() {
g.updateOptions({
valueRange: null,
axes: {
y: { valueRange: [null, null] },
y2: { valueRange: [null, null] }
}
});
}
g.updateOptions({
zoomCallback: function(minDate, maxDate, yRanges) {
resetY();
g.ready(function() {
zoom(minDate, maxDate)
})
}
})
当使用 dygraphs 显示两个系列(轴 y 和 y2)时,如何处理具有公共零的两个 y 轴?
例如对于
1,-1,0
2,1,2
dygraph 目前会将第一个 y 轴从 -1 到 1,第二个从 0 到 2。由于这两个值都应该表示变化(delta),所以这种方式非常混乱。
作为旁注,我将两个轴的 valueRange 设置为 [null, null](数据集的某些部分具有相当大的值,其他部分非常小 - 放大时我希望能够更好地了解当地差异)。我也在使用自定义绘图仪(multiColumnBarPlotter 进行了调整以处理负值)。
我已经通过相对于彼此调整 y 轴范围解决了这个问题(暂时?),所以每个轴的正负部分的比率是相同的。以下代码似乎适用于我的用例。
function zoom(minDate, maxDate) {
minFirst = g.yAxisRanges()[0][0]
maxFirst = g.yAxisRanges()[0][1] || 1
minSecond = g.yAxisRanges()[1][0]
maxSecond = g.yAxisRanges()[1][1] || 1
if (minFirst >= 0 && minSecond >= 0) {
// setting both to zero will align zero at bottom
minFirst = secondFirst = 0;
} else {
// calculate ratio ( negative part : positive part )
var ratioFirst = - minFirst / maxFirst
var ratioSecond = - minSecond / maxSecond
if (minFirst >= 0 || ratioFirst < ratioSecond) {
minFirst = - maxFirst * ratioSecond
} else {
minSecond = - maxSecond * ratioFirst
}
}
g.updateOptions({
axes: {
y: { valueRange: [minFirst, maxFirst] },
y2: { valueRange: [minSecond, maxSecond] }
}
});
}
function resetY() {
g.updateOptions({
valueRange: null,
axes: {
y: { valueRange: [null, null] },
y2: { valueRange: [null, null] }
}
});
}
g.updateOptions({
zoomCallback: function(minDate, maxDate, yRanges) {
resetY();
g.ready(function() {
zoom(minDate, maxDate)
})
}
})