web-dev-qa-db-ja.com

データを計画的に更新する

さて、私は次のコードを持っています:

_    var element = document.getElementById(scope.changeid);

function getData(division,redraw) {
    var employeeData = [];
    if (!division) {
        $http.get(api.getUrl('competenceUserAverageByMyDivisions', null)).success(function (response) {
            processData(response,redraw);
        });
    }
    else {
        $http.get(api.getUrl('competenceUserAverageByDivision', division)).success(function (response) {
            processData(response,redraw);
        })
    }

}

function processData(data,redraw) {
    var y = [],
        x1 = [],
        x2 = [];

    data.forEach(function (item) {
        y.Push(item.user.profile.firstname);
        x1.Push(item.current_level);
        x2.Push(item.expected);
    });

    var charData = [{
            x: x1,
            y: y,
            type: 'bar',
            orientation: 'h',

            name: 'Nuværende'
        }, {
            x: x2,
            y: y,
            type: 'bar',
            orientation: 'h',

            name: 'Forventet'
        }],
        layout = {
            barmode: 'stack',
            legend: {
                traceorder: 'reversed',
                orientation: 'h'

            }
        };

    if(!redraw){
        Plotly.plot(element, charData, layout);
    }
    else
    {
        Plotly.redraw(element,charData,layout);
    }
}

scope.$watch('divisionId', function (newValue, oldValue) {
    if (newValue) {
        getData(newValue.id,true);
    }
}, true);

getData(null,false);
_

次のグラフが作成されます。

enter image description here

ご覧のとおり、iveがwatcherを追加しました

_            scope.$watch('divisionId', function (newValue, oldValue) {
            if (newValue) {
                getData(newValue.id,true);
            }
        }, true);
_

これをトリガーすると、チャートが更新され、Plotly.redraw(element,charData,layout);が呼び出されます。

ただし、この場合、グラフはまったく変わりません。コンソールにエラーはないので、どうすればいいのかよくわかりません。

19
Marc Rasmussen

私はその質問に対する答えを見つけました。

見習い私は使用する必要がありました:

 Plotly.newPlot(element,charData,layout);

redrawの代わりに

13
Marc Rasmussen

Plotly.redraw(Gd)が正しい方法です。
しかし、あなたはPlotly.redrawが正しくありません。
正しい方法は、新しいdataオブジェクトではなく、dataオブジェクトを更新することです。

var data = [ {
    x: ['VALUE 1'], // in reality I have more values... 
    y: [20], 
    type: 'bar'
}
]; 
Plotly.newPlot('PlotlyTest', data); function adjustValue1(value) {
    data[0]['y'][0] = value; 
    Plotly.redraw('PlotlyTest');
}

参照: http://www.mzan.com/article/35946484-most-performant-way-to-update-graph-with-new-data-with-plotly.shtml

15
Honghe.Wu

Plotlyコミュニティモデレーター(最初の回答 こちら を参照)によると、Plotly.restylePlotly.redrawおよびPlotly.newPlotより高速です。

リンクからの例:

var data = [{
    x: ['VALUE 1'], // in reality I have more values...
    y: [20],
    type: 'bar'
}];
Plotly.newPlot('PlotlyTest', data);

function adjustValue1(value)
{
    Plotly.restyle('PlotlyTest', 'y', [[value]]);
}
2
Safwan

ExtendTraces関数は、あなたが目指しているものでなければなりません。グラフにデータポイントを追加して再描画できます。再描画(@ Honghe.Wu Answer)とは対照的に、extendTracesを使用する場合、参照を更新する必要はありません。

[extendTraces]この関数はPlotly.reactに匹敵するパフォーマンスを備えており、Plotly.newPlotでプロット全体を再描画するよりも高速です。

https://plot.ly/javascript/plotlyjs-function-reference/#plotlyextendtraces

使用例

// initialise some data beforehand
var y = [];
for (var i = 0; i < 20; i ++) {
    y[i] = Math.random();
}

var trace = {
    // x: x,
    y: y,
    type: 'bar',
  };
var data = [trace];
// create the plotly graph
Plotly.newPlot('graph', data);

setInterval(function() {
  // add data to the trace via function call
  Plotly.extendTraces('graph', { y: [[getData()]] }, [0]);
  // y.Push(getData()); Plotly.redraw('graph'); //similar effect
}, 400);

function getData() {
     return Math.random();
}
0
Andrei