2015-06-23 3 views
1

Я работаю над приложением, где я пытаюсь построить аналогичный график для того, что изображено на Open Weather. Я использую библиотеку FlotJS для запроса их API и построения графиков.Контуры флота с осью и всплывающие подсказки?

Вот мой код. Прошу прощения за многословие.

/* 
* 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); 
     } 
    }); 
} 

Эти два графика почти идентичны, за исключением данных, которые они изображают.

Main Graph

Daily Graph

Основной (первый) граф имеет все оси у правильно построены. И мы можем видеть ось для всех 3 правильно. Дневной (второй) график имеет ось дождя y, хотя варианты для них похожи.

Кроме того, все всплывающие подсказки работают нормально, но температурные подсказки, где я могу видеть местозаполнитель% y, а не реальную стоимость.

Я отлаживал этот код последние 2 часа, и я не эксперт по флоту, и я не могу понять, что не так.

Может ли кто-нибудь просмотреть код и рассказать мне, что происходит не так? Заранее спасибо.

+0

Я создал [JSFiddle] (http://jsfiddle.net/zpv8p08f/), чтобы попытаться повторить проблема, но она работает нормально. В скрипке используется jquery.flot.js - я вижу, вы используете jquery.flot.cust.min.js. Вы знаете, что было настроено в вашей версии флота? – mechenbier

+0

Я использую тему Smart Admin. http://192.241.236.31/themes/preview/smartadmin/1.5/ajaxversion/#ajax/flot.html – Rohan

ответ

2

Пока вы создаете свои массивы данных о температуре, вам необходимо проанализировать значение температуры в виде поплавка. Обязательно проанализируйте значение как float для обоих графиков. Вы делаете это для своей переменной влажности, и именно поэтому всплывающая подсказка работает для этой серии.

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

JSFiddle обновляется все те же версии, используемые в теме, которые вы используете: JSFiddle

+0

Вы правы, но я не понимаю, почему? Я имею в виду, что переменная температура уже является переменной с плавающей точкой? А во-вторых, я до сих пор не вижу третьей оси для моего второго графика? Может быть, из-за вкладок jquery? – Rohan

+0

@Rohan Вы вызываете '.toFixed (0)', который возвращает строку: [Документация MDN .toFixed()] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Номер/toFixed). – mechenbier

+0

Ничего себе. Я этого никогда не понимал. Благодарю. Поразите меня, если вы поймете, почему ось y не появляется на моем графике. :) – Rohan

Смежные вопросы