激活阈值时JQuery Flot的问题

时间:2015-05-17 16:20:18

标签: javascript jquery charts flot

我正在尝试为需要阈值和跟踪的项目制作情节。

所以我按照这些例子作为参考

  1. http://flotcharts.org/flot/examples/tracking/index.html
  2. http://flotcharts.org/flot/examples/threshold/index.html
  3. 没有阈值,跟踪的情节完美无缺 without-threshold

    但是当激活阈值时,跟踪功能无法在第3和第3级上运行。第4行,只是在前2行工作,其他一切都不起作用 without-threshold

    这是我的代码,

        <script src="../../plugins/flot/jquery.flot.min.js" type="text/javascript"></script>
        <!-- FLOT RESIZE PLUGIN - allows the chart to redraw when the window is resized -->
        <script src="../../plugins/flot/jquery.flot.resize.min.js" type="text/javascript"></script>
         <!-- FLOT crosshair PLUGIN - allows the chart to be tracking -->
        <script src="../../plugins/flot/jquery.flot.crosshair.min.js" type="text/javascript"></script>
        <script src="../../plugins/flot/jquery.flot.threshold.min.js" type="text/javascript"></script>
        <script src="../../plugins/flot/jquery.flot.time.min.js" type="text/javascript"></script>
    ........
    ........    
    plot = $.plot("#PH-chart", [
                { data: PH1, color: "#3c8dbc", label: "PH1(x) = 0.00"},
                { data: PH2, color: "#00c0ef", label: "PH2(x) = 0.00" },
                { data: PH3, color: "#3cffff", label: "PH3(x) = 0.00"},
                { data: PH4, color: "#0ff0ef", label: "PH4(x) = 0.00" }
            ], {
                series: {
                    threshold: {
                        below: 7,
                        color: "rgb(200, 20, 30)"
                    },
                    lines: {
                        show: true
                    }
                },
                crosshair: {
                    mode: "x"
                },
                grid: {
                    hoverable: true,
                    autoHighlight: true,
                    borderColor: "#f3f3f3",
                    borderWidth: 1,
                    tickColor: "#f3f3f3"
                },
                yaxis: {
                    max: 14
                },
                xaxis: {
                    show: true,
                    mode: "time",
                    minTickSize: [1, "hour"],
                    twelveHourClock: true
                }
            });
    
            var legends = $("#PH-chart .legendLabel");
    
            var updateLegendTimeout = null;
            var latestPosition = null;
    
            function updateLegend() {
    
                updateLegendTimeout = null;
    
                var pos = latestPosition;
    
                var axes = plot.getAxes();
                if (pos.x < axes.xaxis.min || pos.x > axes.xaxis.max ||
                    pos.y < axes.yaxis.min || pos.y > axes.yaxis.max) {
                    return;
                }
    
                var i, j, dataset = plot.getData();
                for (i = 0; i < dataset.length; ++i) {
    
                    var series = dataset[i];
    
                    // Find the nearest points, x-wise
    
                    for (j = 0; j < series.data.length; ++j) {
                        if (series.data[j][0] > pos.x) {
                            break;
                        }
                    }
    
                    // Now Interpolate
    
                    var y,
                        p1 = series.data[j - 1],
                        p2 = series.data[j];
    
                    if (p1 == null) {
                        y = p2[1];
                    } else if (p2 == null) {
                        y = p1[1];
                    } else {
                        y = p1[1] + (p2[1] - p1[1]) * (pos.x - p1[0]) / (p2[0] - p1[0]);
                    }
    
                    legends.eq(i).text(series.label.replace(/x.*/,  + series.data[j][0] + ") = " + y.toFixed(2)));
                }
            }
    
            $("#PH-chart").bind("plothover",  function (event, pos, item) {
                latestPosition = pos;
                if (!updateLegendTimeout) {
                    updateLegendTimeout = setTimeout(updateLegend, 50);
                }
            });
    

    另一个问题,我编写了一个函数,它在时间戳中占用当前时间,并以可读形式返回时间

    1431964050616&gt;&gt; 2015年5月18日下午5:47:31,我已经测试了它并且它的工作正常但是当它添加时它不是图表!!!

    function displayTime(currentTime) {
            var str = "";
            var hours = currentTime.getHours()
            var minutes = currentTime.getMinutes()
            var seconds = currentTime.getSeconds()
    
            if (minutes < 10) {
                minutes = "0" + minutes
            }
            if (seconds < 10) {
                seconds = "0" + seconds
            }
            str += hours + ":" + minutes + ":" + seconds + " ";
            if(hours > 11){
                str += "PM"
            } else {
                str += "AM"
            }
            return str;
        }
    

    我已将图表代码中的函数调用为例如PH1(05:30:30 PM)= 11.2,但我不知道问题出在哪里!

    legends.eq(i).text(series.label.replace(/x.*/,  + displayTime(series.data[j][0]) + ") = " + y.toFixed(2)));
    

    希望得到解决,提前致谢

2 个答案:

答案 0 :(得分:0)

阈值插件将数据系列分为两部分,一部分高于阈值,一部分低于阈值。这使得您的四个中有六个数据系列(两个仅具有高于阈值的值)。代码中的两个相关更改:

  • 跳过阈值插件添加的系列
  • i中的legends.eq(i)替换为labelindex,因为i从0到5,并且图例中只有4个标签

新代码:

for (i = 0; i < dataset.length; i++) {        
    var series = dataset[i];
    if (series.data.length == 0) {
        continue;  // if this is a threshold added series, skip it and continue with the next one
    }

    // Find the nearest points, x-wise
    for (j = 0; j < series.data.length; j++) {
        if (series.data[j][0] > pos.x) {
            break;
        }
    }

    // Now Interpolate
    var y,
        p1 = series.data[j - 1],
        p2 = series.data[j];

    if (p1 === undefined) {
        y = p2[1];
    } else if (p2 === undefined) {
        y = p1[1];
    } else {
        y = p1[1] + (p2[1] - p1[1]) * (pos.x - p1[0]) / (p2[0] - p1[0]);
    }

    var labelindex = parseInt(series.label.substr(2, 1));
    legends.eq(labelindex - 1).text(series.label.replace(/x.*/, +series.data[j][0] + ") = " + y.toFixed(2)));
}

使用工作代码查看此fiddle

答案 1 :(得分:0)

我有类似的解决方法,它引入了修正索引c。

var c = 0;
for (i = 0; i < dataset.length; i++) {        
   var series = dataset[i];
   if (series.data.length == 0) {
        e = e + 1;
        continue;  // if this is a threshold added series, skip it and continue with the next one
  }

// Find the nearest points, x-wise
for (j = 0; j < series.data.length; j++) {
    if (series.data[j][0] > pos.x) {
        break;
    }
}

// Now Interpolate
var y,
    p1 = series.data[j - 1],
    p2 = series.data[j];

if (p1 === undefined) {
    y = p2[1];
} else if (p2 === undefined) {
    y = p1[1];
} else {
    y = p1[1] + (p2[1] - p1[1]) * (pos.x - p1[0]) / (p2[0] - p1[0]);
}
 legends.eq(i-c).text(series.label.replace(/x.*/,  + series.data[j][0] + ") = " + y.toFixed(2)));


 }