2

私はこれで手を求めたいと思いましたが、現在、私が持っているいくつかのデータを表示するために、highchartsjavascriptファイルをコード化しようとしています。正しい数のデータセットと正しいグラフ(時間グラフまたはprocグラフになります)を表示できましたが、どのグラフに関係なく、すべてのグラフが同じ名前とデータを使用しているという問題があります同様にオンになっています。オブジェクト配列のどこに割り当てられているかについてアラートを出すと、それらはすべて個別になります。何が起こっているのか本当にわからない。

ここで、Objは次のとおりです。

{
    name: SERIES_NAME,
    data: SERIES_DATA,
}

次のようなデータではなく、出力グラフ:

グラフデータ:{Obj1、Obj2、Obj3 ... ObjN}、複数の個別の系列を示しています。

私は持っています:

グラフデータ:{ObjN、ObjN、ObjN ... ObjN}、

それらはすべてObjNです。2つのグラフ間でも。すべてのデータ/名前は同じです。

また、このコードはすべてphp内から呼び出されます$(document).ready(function())

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. 表示される2つのハイチャートを作成する
  3. CSVをスキャンして、関連するCSVを見つけます
  4. ある人のために、彼らのデータを読んで、それをTMP_seriesに追加します
  5. すべてのデータが読み取られたら、TMP_seriesを関連するグラフデータ系列に追加します

どんな助けでも大歓迎です!

ありがとう

4

1 に答える 1

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;
            }
        }

if の先頭で、指定したプロパティを使用して新しいオブジェクトを作成し、それを参照 TMP_series に割り当てる方法に注目してください。オブジェクトは参照によって渡されることに注意してください。したがって、オブジェクトを配列にプッシュすると、オブジェクトのコピーではなく、オブジェクトへの参照がプッシュされます。

于 2012-05-30T21:38:50.627 に答える