gpt4 book ai didi

javascript - gRaphael linechart 绘制超出轴的值

转载 作者:行者123 更新时间:2023-11-29 10:19:29 24 4
gpt4 key购买 nike

当使用 gRaphael 沿 x 轴使用毫秒绘制折线图时,我通常会在数据点的位置上出现不一致。最常见的初始数据点位于 y 轴的左侧(如下面的 fiddle 所示),有时最后的数据点将超出 View 框的右侧/超过 x 轴的终止点.

有谁知道:1)为什么会这样,2) 如何预防,&/或3) 如何检查它(如果我知道它何时发生/发生了多少,我可以使用变换来移动线/点)。

我的代码:

var r = Raphael("holder"),
txtattr = { font: "12px sans-serif" };
var r2 = Raphael("holder2"),
txtattr2 = { font: "12px sans-serif" };

var x = [], y = [], y2 = [], y3 = [];

for (var i = 0; i < 1e6; i++) {
x[i] = i * 10;
y[i] = (y[i - 1] || 0) + (Math.random() * 7) - 3;
}
var demoX = [[1, 2, 3, 4, 5, 6, 7],[3.5, 4.5, 5.5, 6.5, 7, 8]];
var demoY = [[12, 32, 23, 15, 17, 27, 22], [10, 20, 30, 25, 15, 28]];

var xVals = [1288885800000, 1289929440000, 1290094500000, 1290439560000, 1300721700000, 1359499228000, 1359499308000, 1359499372000];
var yVals = [80, 76, 70, 74, 74, 78, 77, 72];
var xVals2 = [1288885800000, 1289929440000];
var yVals2 = [80, 76];

var lines = r.linechart(10, 10, 300, 220, xVals, yVals, { nostroke: false, axis: "0 0 1 1", symbol: "circle", smooth: true })
.hoverColumn(function () {
this.tags = r.set();

for (var i = 0, ii = this.y.length; i < ii; i++) {
this.tags.push(r.tag(this.x, this.y[i], this.values[i], 160, 10).insertBefore(this).attr([{ fill: "#fff" }, { fill: this.symbols[i].attr("fill") }]));
}
}, function () {
this.tags && this.tags.remove();
});

lines.symbols.attr({ r: 3 });


var lines2 = r2.linechart(10, 10, 300, 220, xVals2, yVals2, { nostroke: false, axis: "0 0 1 1", symbol: "circle", smooth: true })
.hoverColumn(function () {
this.tags = r2.set();

for (var i = 0, ii = this.y.length; i < ii; i++) {
this.tags.push(r.tag(this.x, this.y[i], this.values[i], 160, 10).insertBefore(this).attr([{ fill: "#fff" }, { fill: this.symbols[i].attr("fill") }]));
}
}, function () {
this.tags && this.tags.remove();
});

lines2.symbols.attr({ r: 3 });

我确实必须使用 gRaphael 并且 x 轴必须以毫秒为单位(稍后用自定义日期字符串标记)

主要示例 fiddle :http://jsfiddle.net/kcar/aNJxf/

第二个示例 fiddle (页面上的第 4 个示例经常显示两个轴错误): http://jsfiddle.net/kcar/saBnT/

根本原因是 snapEnds 函数(第 718 行 g.raphael.js),它所做的四舍五入虽然在某些情况下很好,但在其他情况下是从日期中添加或减去年份。

在这一点之后还没有完全完成,但由于每次舍入变得疯狂时数据点都放错了位置,而不是当它不疯狂时,我将继续并假设这会导致计算问题图表列,也在发送到 snapEnds 之前,这些值是正确的,只是为了确认它不仅仅是接收计算错误的数据。

来自 g.raphael.js 的函数代码

snapEnds: function(from, to, steps) {
var f = from,
t = to;

if (f == t) {
return {from: f, to: t, power: 0};
}

function round(a) {
return Math.abs(a - .5) < .25 ? ~~(a) + .5 : Math.round(a);
}

var d = (t - f) / steps,
r = ~~(d),
R = r,
i = 0;

if (r) {
while (R) {
i--;
R = ~~(d * Math.pow(10, i)) / Math.pow(10, i);
}

i ++;
} else {
if(d == 0 || !isFinite(d)) {
i = 1;
} else {
while (!r) {
i = i || 1;
r = ~~(d * Math.pow(10, i)) / Math.pow(10, i);
i++;
}
}

i && i--;
}

t = round(to * Math.pow(10, i)) / Math.pow(10, i);

if (t < to) {
t = round((to + .5) * Math.pow(10, i)) / Math.pow(10, i);
}

f = round((from - (i > 0 ? 0 : .5)) * Math.pow(10, i)) / Math.pow(10, i);
return { from: f, to: t, power: i };
},

最佳答案

从 snapEnds 中删除了舍入废话,没有更多问题,没有注意到任何轴或图表的任何其他区域的任何缺点。如果你看到一个,我很想听听。

现在来自 g.raphael.js 的函数代码:

snapEnds: function(from, to, steps) {
return {from: from, to: to, power: 0};
},

关于javascript - gRaphael linechart 绘制超出轴的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com