Стекированные панели на jqPlot с динамическим json

#javascript #jquery #json #jqplot

#javascript #jquery #json #jqplot

Вопрос:

Я пытался создать диаграмму на jqPlot, используя сложенные столбцы (имхо, был бы лучший способ графического отображения приведенных выше данных, но это зависит не от меня.) итак, вот фиктивные данные:

 var data = {
                    "Network 1": {
                        "Avg. Speed": 10000,
                        "D/S": 10000,
                        "U/S": 10000
                    },
                    "Network 2": {
                        "Avg. Speed": 15000,
                        "D/S": 15000,
                        "U/S": 15000
                    },
                    "Network 3": {
                        "Avg. Speed": 20000,
                        "D/S": 20000,
                        "U/S": 20000
                    }
                };
  

Сетевыми будут ось X и среднее значение. Скорость / DS и US были бы фактами, поэтому каждая сеть имела бы, в данном случае, 3 сложенных столбца со своими данными.

Я передавал данные jqplot таким образом, просто чтобы проверить результаты, но график пустой:

 plot2 = $.jqplot('divGraphNetwork', [], {
        animate: !$.jqplot.use_excanvas,
        stackSeries: true,
        dataRenderer: data,
        seriesDefaults: {
            renderer: $.jqplot.BarRenderer,
            rendererOptions: {
                barPadding: 2,
                barMargin: 0,
                barDirection: 'vertical',
                barWidth: 20
            },
            pointLabels: {
                //location: 'se',
                ypadding: 0
            }
        },
        title: {
            text: 'Network Information',   // title for the plot,
            show: true,
        },
        legend: {
            show: false,
            location: 'e',
            placement: 'outside'
        },
        axes: {
            xaxis: {
                renderer: $.jqplot.CategoryAxisRenderer
            },
            yaxis: {
                min:0,
                autoscale: true
            }
        }
    });
  

Ответ №1:

dataRenderer должна быть функцией, а не объектом JSON. Эта функция должна взять объект JSON и преобразовать его в 2D-массив.

2D-массив должен быть в следующем формате:

 [[Network1 AV/Speed, Network2 AV/Speed, Network3 AV/Speed],
[Network1 D/S, Network2 D/S, Network3 D/S],
[Network1 U/S, Network2 U/S, Network3 U/S]]
  

Я создал здесь скрипку для демонстрации. Я добавил dataRenderer() функцию следующим образом:

 function dataRenderer() {
    var result = [];
    var avgSpeed = [];
    var ds = [];
    var us = [];
    // Loop over each network
    for (var network in data) {
        // Add each of the stats for the network into the corresponding array
        avgSpeed.push(data[network]["Avg. Speed"]);
        ds.push(data[network]["D/S"]);
        us.push(data[network]["U/S"]);
    }
    // Add the av speed, DS and US arrays to the result array creating a 2D array
    result.push(avgSpeed);
    result.push(ds);
    result.push(us)
    return resu<
}
  

Затем я изменил параметр dataRenderer, чтобы указывать на функцию вместо данных объекта JSON:

 var plot2 = $.jqplot('divGraphNetwork', [], {
    ...
    dataRenderer: dataRenderer,
    ....
});
  

Комментарии:

1. Datarenderer также допускает переменную, я решил аналогичным образом, но это лучший ответ! Спасибо