2012-05-18 109 views
2

想到我會問這個問題,我正在嘗試編寫一個高分辨率的javascript文件來顯示我擁有的一些數據。我已經能夠顯示正確數量的數據集,並在正確的圖表上(他們進入時間或proc圖表),但我有一個問題,所有圖表使用相同的名稱&數據,而不管它們是哪個圖表也一樣。即使當我對它們被分配到它們的對象數組的位置做了警報時,它們都是單獨的。真的不確定發生了什麼。Highcharts重複顯示相同的數據

其中一個OBJ是:

{ 
    name: SERIES_NAME, 
    data: SERIES_DATA, 
} 

輸出圖形,代替具有如下數據:

圖數據:{OBJ1,OBJ2,OBJ3 ... ObjN},顯示多個單獨的系列。

我:

圖數據:{ObjN,ObjN,ObjN ... ObjN},

他們都只是ObjN。即使在兩張圖上。所有的數據/名稱都是一樣的。

而且所有這些代碼是從一個PHP的$(document)。就緒內調用(函數())

function create_highchart(TIER,ARRAYS_STRING) { 

     var chart; 
     timestamp=document.getElementById("TIMESTAMP").value; 
     var graph_dir = "graphs/capsim/"+timestamp+"/"; 

     var glue_outer = "___"; 
     var glue_inner = ":#:"; 
     var glue_csv="^"; 
     var i = 0; 
     var j = 0; 

     var tier_names=[]; 
     var WL_names = []; 
     var CSV_data=[]; 
     var CSVs = []; 
     var CSV_det=[]; 
     var out_arrays=[]; 

     var time_ids = ['queue','util','arrival','thruput']; 

     out_arrays = ARRAYS_STRING.split(glue_outer); 
     tier_names = out_arrays[0].split(glue_inner); 
     WL_names = out_arrays[1].split(glue_inner); 
     CSVs = out_arrays[2].split(glue_inner); 
     CSV_det = out_arrays[3].split(glue_inner); 
     WL_num = WL_names.length; 
     tier_names.push('Overall System'); 
     tier_max = tier_names.length; 
     curr_tier_name = tier_names[TIER]; 

     while(i<CSVs.length){ 
      CSV_data[i]=[]; 
      data = CSVs[i].split(glue_csv); 
      CSV_data[i]=data; 
      i=i+1; 
     } 

     i=0; 
     var TMP_series = { 
       name: '', 
       data: [], 
     } 

     var TIME_SERIES_DATA=[]; 
     var PROC_SERIES_DATA=[]; 
     var time_count=0; 
     var proc_count=0; 

     var x = []; 
     var y = []; 
     var cat = []; 
     var out2 = []; 

     var options_time={ 
      chart: { 
       renderTo: 'hc_div2', 
       type: 'scatter', 
       marginRight: 130, 
       marginBottom: 25 
      }, 
      title: { 
       text: 'Highcharts Demo for Graphing', 
       x: -20 //center 
      }, 
      subtitle: { 
       text: 'Graph for '+curr_tier_name, 
       x: -20 
      }, 
      yAxis: { 
       title: { 
        text: 'Performance Metrics' 
       }, 
      }, 
      tooltip: { 
       formatter: function() { 
        return '<b>'+ this.series.name +'</b><br/>'+ 
         'X: '+this.x +' Y: '+ this.y 

       } 
      }, 
      plotOptions: { 
       scatter: { 
        marker: { 
          radius: 2, 
        }    
       } 
      }, 
      legend: { 
       layout: 'vertical', 
       align: 'right', 
       verticalAlign: 'top', 
       x: 10, 
       y: 100, 
       borderWidth: 0 
      }, 
      series: TIME_SERIES_DATA 
     };     

     var options_proc={ 
      chart: { 
       renderTo: 'hc_div1', 
       type: 'scatter', 
       marginRight: 130, 
       marginBottom: 25 
      }, 
      title: { 
       text: 'Highcharts Demo for Graphing', 
       x: -20 //center 
      }, 
      subtitle: { 
       text: 'Graph for '+curr_tier_name, 
       x: -20 
      }, 
      yAxis: { 
       title: { 
        text: 'Performance Metrics' 
       }, 
      }, 
      tooltip: { 
       formatter: function() { 
        return '<b>'+ this.series.name +'</b><br/>'+ 
        'X: '+this.x +' Y: '+ this.y 
       } 
      }, 
      plotOptions: { 
       scatter: { 
        marker: { 
         radius: 2, 
        } 
       } 
      }, 
      legend: { 
       layout: 'vertical', 
       align: 'right', 
       verticalAlign: 'top', 
       x: 10, 
       y: 100, 
       borderWidth: 0 
      }, 
      series: PROC_SERIES_DATA 
     }; 

     var i=0; 
     if(TIER==tier_max-1){ 
      TIER='OVR'; 
     }; 

     while(i<=CSV_det.length){ 
      csv = CSV_det[i+4]; 
      curr_data=CSV_data[(i/5)]; 
      csv_name = CSV_det[i+1]; 
      csv_tier = CSV_det[i+2]; 
      csv_wl = parseFloat(CSV_det[i+3])+1; 

      wl_info = ''; 
      if(CSV_det[i+3] !='NA'){ 
       wl_info = ' Workload: '+csv_wl; 
      }; 

      var j=0; 
      var line = ''; 
      if(TIER==csv_tier){ 
       TMP_series.data = []; 
       TMP_series.name = csv_name+wl_info; 
       while(j<curr_data.length){ 
        XY=curr_data[j].split(','); 
        X = parseFloat(XY[0]); 
        Y = parseFloat(XY[1]); 
        TMP_series.data.push([X,Y]); 
        j=j+1; 
       } 
       j=0; 
       csv_type=csv.split('/')[3].split('_')[0]; 
       if($.inArray(csv_type,time_ids)==-1){ 
        PROC_SERIES_DATA[proc_count]=[]; 
        PROC_SERIES_DATA[proc_count]=TMP_series; 
        proc_count=proc_count+1; 
       }else{ 
        TIME_SERIES_DATA[time_count]=[]; 
        TIME_SERIES_DATA[time_count]=TMP_series; 
        time_count=time_count+1; 
       } 
      } 
      i=i+5; 
     }; 
     var chart = new Highcharts.Chart(options_proc); 
     var chart = new Highcharts.Chart(options_time); 
    } 

上怎麼回事快速的解釋:

  1. 最初所有解析將數據導入數組字符串中的相關二進制文件
  2. 創建將顯示的兩個高圖
  3. 掃描CSV以查找相關的
  4. 對於那些正在,閱讀他們的數據,並將其添加到TMP_series
  5. 一旦所有數據被讀取,添加TMP_series到相關的圖形數據系列

任何幫助是極大apprecaited!

感謝

回答

0

你需要每次生成一系列時間TMP_series復位到一個新的對象。現在,您正在回收相同的對象,並將對同一對象的引用推送到系列數組中。修改代碼的最後一位閱讀這樣的:

 if(TIER==csv_tier){ 
      TMP_series = { 
       name : csv_name+wl_info, 
       data : [] 
      }; 
      while(j<curr_data.length){ 
       XY=curr_data[j].split(','); 
       X = parseFloat(XY[0]); 
       Y = parseFloat(XY[1]); 
       TMP_series.data.push([X,Y]); 
       j=j+1; 
      } 
      j=0; 
      csv_type=csv.split('/')[3].split('_')[0]; 
      if($.inArray(csv_type,time_ids)==-1){ 
       PROC_SERIES_DATA[proc_count]=[]; 
       PROC_SERIES_DATA[proc_count]=TMP_series; 
       proc_count=proc_count+1; 
      }else{ 
       TIME_SERIES_DATA[time_count]=[]; 
       TIME_SERIES_DATA[time_count]=TMP_series; 
       time_count=time_count+1; 
      } 
     } 

注意如何在頂部,如果,我創建具有指定屬性的新對象,並將其分配給參考TMP_series。請記住,對象是通過引用傳遞的,所以當你將對象推入數組時,你推送對象的引用,而不是對象的副本。