2012-05-18 188 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。请记住,对象是通过引用传递的,所以当你将对象推入数组时,你推送对象的引用,而不是对象的副本。