1
votes

I am working on an application where I am trying to plot a similar graph to what is plotted at Open Weather. I am using the FlotJS library to query their API and plot the graphs.

Here is my code. I apologize for the verbosity.

/*
 * RUN PAGE GRAPHS
 */

// load all flot plugins
loadScript("js/plugin/flot/jquery.flot.cust.min.js", function(){
    loadScript("js/plugin/flot/jquery.flot.resize.min.js", function(){
        loadScript("js/plugin/flot/jquery.flot.time.min.js", function(){
            loadScript("js/plugin/flot/jquery.flot.tooltip.min.js", generatePageGraphs);
        });
    });
});

function generatePageGraphs(){
    var fetchWeatherUrl = '//api.openweathermap.org/data/2.5/forecast?lat=' + farmLat + '&lon=' + farmLng;

    $.ajax({
        method: 'get',
        dataType: "jsonp",
        url: fetchWeatherUrl,
        success: function(response){
            var temp = [];
            var humidity = [];
            var rain = [];

            $.each(response.list, function(i, item){
                if(moment(item.dt, 'X').isSame(moment(), 'day')){
                    var temperature = ( ( parseFloat(item.main.temp)-273.15 )*1.80 ).toFixed(0);
                    temp.push([moment(item.dt, 'X').valueOf(), temperature]);
                    humidity.push([moment(item.dt, 'X').valueOf(), parseFloat(item.main.humidity)]);
                    if(item.rain != undefined){
                        rain.push([moment(item.dt, 'X').valueOf(), parseFloat(item.rain["3h"])]);
                    }
                }
            });

            var mainWeatherGraphData = [{
                label: "Temperature",
                data: temp,
                lines: {
                    show: true
                },
                points: {
                    show: true
                }
            },
                {
                    label: "Humidity",
                    data: humidity,
                    lines: {
                        show: true
                    },
                    points: {
                        show: true
                    },
                    yaxis: 2
                },
                    {
                        label: "Rain",
                        data: rain,
                        bars: {
                            show: true,
                            barWidth: 1000*60*30,
                            align: 'center'
                        },
                        yaxis: 3
                    }];

            var mainWeatherGraphOptions = {
                xaxis : {
                    mode : "time",
                },
                yaxes : [
                    {
                        position: 'left'
                    },
                    {
                        position: 'right'
                    },
                    {
                        position: 'right'
                    }
                ],
                tooltip : true,
                tooltipOpts : {
                    content : "<b>%s</b> on <b>%x</b> will be <b>%y</b>",
                    dateFormat : "%y-%m-%d",
                    defaultTheme : false
                },
                legend : {
                    show : true,
                    noColumns : 1, // number of colums in legend table
                    labelFormatter : null, // fn: string -> string
                    labelBoxBorderColor : "#000", // border color for the little label boxes
                    container : null, // container (as jQuery object) to put legend in, null means default on top of graph
                    position : "ne", // position of default legend container within plot
                    margin : [0, 5], // distance from grid edge to default legend container within plot
                    backgroundColor : "#efefef", // null means auto-detect
                    backgroundOpacity : 0.4 // set to 0 to avoid background
                },
                grid : {
                    hoverable : true,
                    clickable : true
                }
            };
            var mainWeatherGraph = $.plot($("#mainWeatherGraph"), mainWeatherGraphData, mainWeatherGraphOptions);
        }
    });

    // Daily forecast

    fetchForecastUrl = 'http://api.openweathermap.org/data/2.5/forecast/daily?lat=' + farmLat + '&lon=' + farmLng;

    $.ajax({
        method: 'get',
        dataType: "jsonp",
        url: fetchForecastUrl,
        success: function(response){
            var temp = [];
            var humidity = [];
            var rain = [];

            $.each(response.list, function(i, item){
                var temperature = ( ( parseFloat(item.temp.day)-273.15 )*1.80 ).toFixed(0);
                temp.push([moment(item.dt, 'X').valueOf(), temperature]);
                humidity.push([moment(item.dt, 'X').valueOf(), parseFloat(item.humidity)]);
                if(item.rain != undefined){
                    rain.push([moment(item.dt, 'X').valueOf(), parseFloat(item.rain)]);
                }
            });

            var dailyForecastGraphData = [{
                label: "Temperature",
                data: temp,
                lines: {
                    show: true
                },
                points: {
                    show: true
                },
            },
                {
                    label: "Humidity",
                    data: humidity,
                    lines: {
                        show: true
                    },
                    points: {
                        show: true
                    },
                    yaxis: 2
                },
                    {
                        label: "Rain",
                        data: rain,
                        bars: {
                            show: true,
                            barWidth: 1000*60*60*8,
                            align: 'center'
                        },
                        yaxis: 3
                    }];

            var dailyForecastGraphOptions = {
                xaxis : {
                    mode : "time",
                },
                yaxes : [
                    {
                        position: 'left'
                    },
                    {
                        position: 'right'
                    },
                    {
                        position: 'right'
                    }
                ],
                tooltip : true,
                tooltipOpts : {
                    content : "<b>%s</b> on <b>%x</b> will be <b>%y</b>",
                    dateFormat : "%y-%m-%d",
                    defaultTheme : false
                },
                legend : {
                    show : true,
                    noColumns : 1, // number of colums in legend table
                    labelFormatter : null, // fn: string -> string
                    labelBoxBorderColor : "#000", // border color for the little label boxes
                    container : null, // container (as jQuery object) to put legend in, null means default on top of graph
                    position : "ne", // position of default legend container within plot
                    margin : [0, 5], // distance from grid edge to default legend container within plot
                    backgroundColor : "#efefef", // null means auto-detect
                    backgroundOpacity : 0.4 // set to 0 to avoid background
                },
                grid : {
                    hoverable : true,
                    clickable : true
                }
            };
            var dailyForecastGraph = $.plot($("#dailyForecastGraph"), dailyForecastGraphData, dailyForecastGraphOptions);
        }
    });
}

The two graphs are almost identical except the data which they are portraying.

Main Graph

Daily Graph

The main (first) graph has the all the y axis plotted correctly. And we can see the axis for all 3 correctly. The daily (second) graph does have the rain y axis, although the options for them are similar.

Other than this, all tooltips are working fine but the temperature tooltips where I can see the placeholder %y and not the real value.

I have been debugging this code for the past 2 hours and I am not a Flot expert and I am not able to figure what is wrong.

Can anybody look at the code and tell me what is going wrong? Thank you in advance.

1
I created a JSFiddle to try and replicate the issue, but it is working fine. The fiddle uses jquery.flot.js -- I see you are using jquery.flot.cust.min.js. Do you know what has been customized in your version of flot?mechenbier

1 Answers

2
votes

While you're creating your temperature data arrays, you need to parse the temperature value as a float. Make sure to parse the value as a float for both graphs. You're doing this for your humidity variable, and that is why the tooltip is working for that series.

var temperature = ((parseFloat(item.main.temp) - 273.15) * 1.80).toFixed(0);
temp.push([moment(item.dt, 'X').valueOf(), parseFloat(temperature)]);

JSFiddle updated with all of the same versions used in the theme you're using: JSFiddle