我已经调整了一些dygraphs以帮助绘制具有大量绘制点的dygraph的页面加载时间。为此,我在dygraph-combined.js的第1378行附近向drawPointsOnLine函数添加了几行代码。而不是仅仅将计数器增加一个(idx ++):
if (pointsOnLine.length > 10000){
window.scalingfactor = Math.round(pointsOnLine.length/10000);
idx=idx+window.scalingfactor;
window.scalingfactorset=true;
} else{
idx++;
window.scalingfactor="";
window.scalingfactorset=true;
}
当dygraph被缩放,平移和还原时,此代码似乎可以完美地跳过一定数量的点进行绘制和更新。
我遇到的问题是尝试在画布上显示跳过多少个点。我决定让用户知道有多少点被跳过。 为此,我添加了绘制画布的underlayCallback
if (scalingfactorset) {
scalingfactormsg= "Every "+scalingfactor+" point(s) plotted";
wid=canvas.measureText(scalingfactormsg);
canvas.fillText(scalingfactormsg,area.x+area.w-wid.width-5,area.y+area.h-70);
} else {
if ((<?php echo $lines; ?> -1) >10000) {
firstscalingfactor=Math.round((<?php echo $lines; ?> -1)/10000);
firstscalingfactormsg= "Every "+firstscalingfactor+" point(s) plotted";
wid=canvas.measureText(firstscalingfactormsg);
canvas.fillText(firstscalingfactormsg,area.x+area.w-wid.width-5,area.y+area.h-70);
} else {
firstscalingfactor="";
firstscalingfactormsg= "Every "+firstscalingfactor+" point(s) plotted";
wid=canvas.measureText(firstscalingfactormsg);
canvas.fillText(firstscalingfactormsg,area.x+area.w-wid.width-5,area.y+area.h-70);
}
但是,由于我认为在绘制点之前调用了underlaycallback函数,因此缩放因子将永远不会被绘制为正确的值,但数据将被正确缩放。
至少这是我所期望的,但由于一些奇怪的原因,当缩放平移并恢复到原始视图时,这将完全按照计划对某些数据集工作,画布消息将使用正确的缩放因子更新。
对于第一次加载的其他数据集,它将是正确的(我尝试在第一个缩放因子中硬编码以在找到所谓的回调顺序之前修复此问题)但是当你缩放,平移或返回原始视图时即使数据被缩放了一定量,缩放器也会粘在空字符串上并显示“每个绘制的点”。
对于较大的数据集而言,它似乎比小数据集更常用,但仍有一些小数据集仍然可用。我认为这可能与dygraphs处理回调的方式有关。我想如果我可以强制dygraphs绘制积分,那么一切都会被修复,但我不确定它是否可能。
如果有人知道要解决这个奇怪的行为,请告诉我。如果它很重要我在调用dygraph之前将scalingfactorset设置为false,并且数据是csv格式。我还确保在代码工作时和数据代码不工作时数据集之间没有格式错误。如果我能提供任何其他有用的信息,请告诉我。