Probleempje met vormen van een Chart.js config

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • databeestje
  • Registratie: Oktober 2002
  • Laatst online: 06-10 13:07

databeestje

Von PrutsHausen

Topicstarter
Dames en Heren, hopelijk zit ik hier op de goede plek voor een JS vraag. Ik wou wat data van het RDW parsen en weergeven voor wat grafiekjes in het elektrisch rijden topic. Het downloaden, parsen en uitspugen van een JSON is geen probleem, ik ben handiger met PHP.

Nu wou ik een line chart met meerdere datasets gebruiken om historische de opkomst en ondergang van modellen te tonen. Vooralsnog lijkt het config object wat ik zie in de Chrome console wel ok, maar struikelt deze over het datatype van de datasets.

Het gaat om deze pagina, ondanks de extensie zit er overigens geen php content in.

Ik vul eerst het popconfig array, en doe daaronder een popconfig.data.datasets.push van het JSON array. Ogenschijnlijk gaat het daar de mist in, maar door mijn onervarenheid met javascript zie ik het niet.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
                var popconfig = {
                        type: 'line',
                        data: {
                            labels: poplabels,
                        },
                        options: {
                                title: {
                                        display: true,
                                        text: 'Populaire Elektrische modellen',
                                },
                                legend: {
                                                display: true,
                                                position: 'bottom'
                                        },

                        },
                };
                var poplabels = [], popcolors = [], popsales = [];
                $.get('stats.json', function(dataGet) {
                        dataGet['monthlabels'].forEach(function(singleResult) {
                            popconfig.data.labels.push(singleResult);
                        });
                        var keys = Object.keys(dataGet['monthpopular']);
                for (var i = 0; i < keys.length; i++)
                {
                        var key = keys[i];
                        popconfig.data.datasets.push({label:key, backgroundcolor: getRandomColor(), fill: false, data: Object.values(dataGet['monthpopular']$

                };
                });

                console.log(popconfig);


Overigens rendert de grafiek bij correcte type (bv blokhaken om datasets heen) pas na resizen, iets waar ik in de eerdere geen last van had, maar geen verklaring voor heb. Iets waar ik met een Pie chart test ook last van had.

Beste antwoord (via databeestje op 13-03-2019 16:28)


  • 418O2
  • Registratie: November 2001
  • Laatst online: 00:06
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function buildChart(poplabels, popcolors, popsales) {

var ctxpop = document.getElementById('chart-area').getContext('2d');
      
        // date string = year+month
        var vm = new Date();
        var dynamicColors = function() {
                var r = Math.floor(Math.random() * 255);
                var g = Math.floor(Math.random() * 255);
                var b = Math.floor(Math.random() * 255);
                return "rgb(" + r + "," + g + "," + b + ")";
        };
        function getRandomColor() {
              var letters = '0123456789ABCDEF'.split('');
              var color = '#';
              for (var i = 0; i < 6; i++ ) {
                color += letters[Math.floor(Math.random() * 16)];
              }
            return color;
        }


        var popconfig = {
            type: 'line',
            data: {
                labels: poplabels,
            },
            options: {
                title: {
                    display: true,
                    text: 'Populaire Elektrische modellen',
                    },
                legend: {
                        display: true,
                        position: 'bottom'
                    },

            },
        };
    window.myLine = new Chart(ctxpop, popconfig)
    
}
function getData() {

            var poplabels = [], popcolors = [], popsales = [];

        $.get('stats.json', function(dataGet) {
            dataGet['monthlabels'].forEach(function(singleResult) {
                        popconfig.data.labels.push(singleResult);
                    });
            var keys = Object.keys(dataGet['monthpopular']);
        for (var i = 0; i < keys.length; i++)
        {
                var key = keys[i];
            popconfig.data.datasets.push({label:key, backgroundcolor: getRandomColor(), fill: false, data: Object.values(dataGet['monthpopular'][key])});

        };
        });

        console.log(popconfig);
    buildChart(poplabels, popcolors, popsales);
}

        // console.log(vmconfig);
        // var colorNames = Object.keys(window.chartColors);

        $(document).ready(function() {
    getData();
})
  
        


zoiets gaat wel werken als het goed is

Alle reacties


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 00:06
Maak een functie aan die de configuratie aanmaakt en roep die aan vanuit de handler die de json ophaalt. Dan gaan het wel gelijk goed gok ik.

Acties:
  • +1 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Je window.onload event zal eerder komen dan dat de response van je ajax call verwerkt is dus op het moment dat je
JavaScript:
1
window.myLine = new Chart(ctxpop, popconfig);
uitvoert is de popconfig nog niet aangevuld?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 00:06
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function buildChart(poplabels, popcolors, popsales) {

var ctxpop = document.getElementById('chart-area').getContext('2d');
      
        // date string = year+month
        var vm = new Date();
        var dynamicColors = function() {
                var r = Math.floor(Math.random() * 255);
                var g = Math.floor(Math.random() * 255);
                var b = Math.floor(Math.random() * 255);
                return "rgb(" + r + "," + g + "," + b + ")";
        };
        function getRandomColor() {
              var letters = '0123456789ABCDEF'.split('');
              var color = '#';
              for (var i = 0; i < 6; i++ ) {
                color += letters[Math.floor(Math.random() * 16)];
              }
            return color;
        }


        var popconfig = {
            type: 'line',
            data: {
                labels: poplabels,
            },
            options: {
                title: {
                    display: true,
                    text: 'Populaire Elektrische modellen',
                    },
                legend: {
                        display: true,
                        position: 'bottom'
                    },

            },
        };
    window.myLine = new Chart(ctxpop, popconfig)
    
}
function getData() {

            var poplabels = [], popcolors = [], popsales = [];

        $.get('stats.json', function(dataGet) {
            dataGet['monthlabels'].forEach(function(singleResult) {
                        popconfig.data.labels.push(singleResult);
                    });
            var keys = Object.keys(dataGet['monthpopular']);
        for (var i = 0; i < keys.length; i++)
        {
                var key = keys[i];
            popconfig.data.datasets.push({label:key, backgroundcolor: getRandomColor(), fill: false, data: Object.values(dataGet['monthpopular'][key])});

        };
        });

        console.log(popconfig);
    buildChart(poplabels, popcolors, popsales);
}

        // console.log(vmconfig);
        // var colorNames = Object.keys(window.chartColors);

        $(document).ready(function() {
    getData();
})
  
        


zoiets gaat wel werken als het goed is

Acties:
  • 0 Henk 'm!

  • databeestje
  • Registratie: Oktober 2002
  • Laatst online: 06-10 13:07

databeestje

Von PrutsHausen

Topicstarter
Dank voor het voorbeeld @418O2 , ik had zelf inmiddels ook een andere truc die schijnbaar werkt, maar ook niet alles is. Hiermee forceer je een update die opnieuw de chart rendert.

code:
1
setTimeout(function() { myLine.update(); }, 1000);


Ik ga jouw voorbeeld in ieder geval verder uitwerken, daarmee is lazy loaden en later updaten via ajax ook een mogelijkheid.

Het render probleem naar aanleiding van JSON data parsing is overigens een vaker terugkerend fenomeen. En ogenschijnlijk niet alleen bij Chart.js, maar ook andere oplossingen.

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 00:06
databeestje schreef op woensdag 13 maart 2019 @ 16:28:
Dank voor het voorbeeld @418O2 , ik had zelf inmiddels ook een andere truc die schijnbaar werkt, maar ook niet alles is. Hiermee forceer je een update die opnieuw de chart rendert.

code:
1
setTimeout(function() { myLine.update(); }, 1000);


Ik ga jouw voorbeeld in ieder geval verder uitwerken, daarmee is lazy loaden en later updaten via ajax ook een mogelijkheid.

Het render probleem naar aanleiding van JSON data parsing is overigens een vaker terugkerend fenomeen. En ogenschijnlijk niet alleen bij Chart.js, maar ook andere oplossingen.
Dit werkt alleen als je binnen een seconde de data hebt. Als het later is gebeurt er niets, is het er sneller, wacht de gebruiker. Mijn voorbeeld is het snelste (zonder te herschrijven). Dat hij het eerder wel deed na een resize, is omdat hij die update functie aanroept als je resized

[ Voor 5% gewijzigd door 418O2 op 13-03-2019 16:38 ]


Acties:
  • 0 Henk 'm!

  • databeestje
  • Registratie: Oktober 2002
  • Laatst online: 06-10 13:07

databeestje

Von PrutsHausen

Topicstarter
418O2 schreef op woensdag 13 maart 2019 @ 16:37:
[...]

Dit werkt alleen als je binnen een seconde de data hebt. Als het later is gebeurt er niets, is het er sneller, wacht de gebruiker. Mijn voorbeeld is het snelste (zonder te herschrijven). Dat hij het eerder wel deed na een resize, is omdat hij die update functie aanroept als je resized
Klopt, dat ben ik mijn terdege bewust. De code zoals gepost deed het overigens niet helemaal, maar ik snap wel wat ik moet doen.

Ik had ook nog een vreemde eend in de dataset gevonden met model "0" in 2014 06 wat uiteindelijk de "undefined" opleverde ;)

Het programmeren gaat niet zo soepel als je een Lenovo Yoga 530 hebt met een Realtek Wireless kaart die elke ~7 minuten al het verkeer dropt en alleen met adapter uit/aan weer verder gaat. Dat wordt heel snel ouderwets. Er is een Intel wifi AC kaartje in de post onderweg.

Met een beetje mazzel kom ik daar dit weekend verder mee. Het zou mooi zijn als remote JSON import gewoon een standaard onderdeel zou zijn van Chart.js, dat zou veel mensen blij maken denk ik :D

De code zoals je voorgesteld hebt zit nu in http://iserv.nl/files/elektrisch/test4.php maar deze geeft nu nog een "Cannot read property 'transition' of null" wat volgens de googles zou moeten betekenen dat het array onder zijn voeten bijgewerkt wordt. Hmmm.

Acties:
  • 0 Henk 'm!

  • databeestje
  • Registratie: Oktober 2002
  • Laatst online: 06-10 13:07

databeestje

Von PrutsHausen

Topicstarter
Even een reply op mijzelf.

Gebruik de fetch API, dan gaat het goed.
https://developer.mozilla...API/Fetch_API/Using_Fetch

Werkt ook in Chrome in ieder geval.
Pagina: 1