6
votes

Afficher les données dynamiquement dans le graphique en courbes - ChartJS

J'ai besoin d'afficher des données dans mon graphique linéaire dans mon application Angular 6, après un certain temps, disons donc toutes les 333 ms pour afficher des données. J'affiche des données enregistrées en 30 secondes maximum, donc chaque donnée graphique peut durer au maximum 30 secondes. Il faut commencer par un clic sur un bouton.

Voici quelques données de test que j'ai créées juste à des fins de test:

data = {
    labels: [],
    datasets: [] // datasets = this.chartData;
};

Ici, ces valeurs '222', '238' etc, sont des millisecondes où ces valeurs doivent être affichées dans le graphique. J'ai structuré ces données pour avoir des tableaux comme celui-ci:

drawChart() {
        this.chart = new Chart('chartCanvas', {
            type: 'line',
            data: this.data,
            options: this.options
        });
    }

et ainsi de suite, pour chaque propriété d'objet.

Mon graphique est implémenté comme ceci:

<canvas id="chartCanvas"></canvas>

Voici à quoi cela ressemble: entrez la description de l'image ici

Je dois donc cliquer sur un bouton et afficher ces valeurs pour chaque image (222ms, 238ms ...), tout le monde a une idée de comment faire cela en utilisant chartJS?

EDIT: a changé la structure des tableaux, maintenant c'est un objet avec des données à l'intérieur. La fonction de graphique de dessin ressemble à ceci:

joyArray = {
    data: [66.5057373046875, 97.06363677978516, 66.5057373046875, 97.06363677978516, 66.5057373046875, 95.37223815917969, 98.75503540039062],
    label: '',
    borderColor: 'rgba(255, 217, 40, 1)',
    backgroundColor: 'transparent',
    fill: false
};

// push all arrays into this array to show it on the graph
this.chartData.push(this.joyArray, this.fearArray, this.angerArray, this.disgustArray, this.sadnessArray,
            this.surpriseArray, this.contemptArray);

Objet de données:

test_data = {
        '222': {
            joy: 66.5057373046875,
            fear: 1.0003513832343742,
            anger: 2.000018799044483,
            disgust: 3.004251452162862,
            sadness: 4.0001135088386945,
            contempt: 5.001299204188399,
            surprise: 6.203749045729637
        },
        '238': {
            joy: 97.06363677978516,
            fear: 17.500137131541123,
            anger: 27.00000593749519,
            disgust: 6.001324078417383,
            sadness: 21.000043172625737,
            contempt: 21.00033742573578,
            surprise: 32.62530106306076
        },
        '722': {
            joy: 66.5057373046875,
            fear: 60.000351383234374,
            anger: 70.00001879904448,
            disgust: 10.004251452162862,
            sadness: 92.0001135088387,
            contempt: 40.0012992041884,
            surprise: 50.20374904572964
        },
        '838': {
            joy: 97.06363677978516,
            fear: 15.000137131541123,
            anger: 64.50000593749519,
            disgust: 24.501324078417383,
            sadness: 31.500043172625737,
            contempt: 18.50033742573578,
            surprise: 6.2048268765211105
        },
        '1722': {
            joy: 66.5057373046875,
            fear: 54.000351383234374,
            anger: 72.00001879904448,
            disgust: 0.004251452162861824,
            sadness: 80.0001135088387,
            contempt: 20.0012992041884,
            surprise: 20.203749045729637
        },
        '2838': {
            joy: 95.37223815917969,
            fear: 41.000168004859006,
            anger: 62.00000752212509,
            disgust: 33.001674098544754,
            sadness: 3.000052563053032,
            contempt: 44.00044780407916,
            surprise: 4.204549819231033
        },
        '2839': {
            joy: 98.75503540039062,
            fear: 1.0001062582232407,
            anger: 1.0000043528652895,
            disgust: 1.0009740582900122,
            sadness: 2.000033782198443,
            contempt: 2.0002270473924,
            surprise: 1.2051039338111877
        }
    };


0 commentaires

3 Réponses :


2
votes

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script>

<body>
    <canvas id="chartJSContainer" width="600" height="400"></canvas>
</body>
canvas { background-color : #eee;
}
test_data = {
    '1222': {
        joy: 66.5057373046875,
        fear: 1.0003513832343742,
        anger: 2.000018799044483,
        disgust: 3.004251452162862,
        sadness: 4.0001135088386945,
        contempt: 5.001299204188399,
        surprise: 6.203749045729637
    },
    '2238': {
        joy: 97.06363677978516,
        fear: 17.500137131541123,
        anger: 27.00000593749519,
        disgust: 6.001324078417383,
        sadness: 21.000043172625737,
        contempt: 21.00033742573578,
        surprise: 32.62530106306076
    },
    '3722': {
        joy: 66.5057373046875,
        fear: 60.000351383234374,
        anger: 70.00001879904448,
        disgust: 10.004251452162862,
        sadness: 92.0001135088387,
        contempt: 40.0012992041884,
        surprise: 50.20374904572964
    },
    '4838': {
        joy: 97.06363677978516,
        fear: 15.000137131541123,
        anger: 64.50000593749519,
        disgust: 24.501324078417383,
        sadness: 31.500043172625737,
        contempt: 18.50033742573578,
        surprise: 6.2048268765211105
    },
    '5722': {
        joy: 66.5057373046875,
        fear: 54.000351383234374,
        anger: 72.00001879904448,
        disgust: 0.004251452162861824,
        sadness: 80.0001135088387,
        contempt: 20.0012992041884,
        surprise: 20.203749045729637
    },
    '6838': {
        joy: 95.37223815917969,
        fear: 41.000168004859006,
        anger: 62.00000752212509,
        disgust: 33.001674098544754,
        sadness: 3.000052563053032,
        contempt: 44.00044780407916,
        surprise: 4.204549819231033
    },
    '7839': {
        joy: 98.75503540039062,
        fear: 1.0001062582232407,
        anger: 1.0000043528652895,
        disgust: 1.0009740582900122,
        sadness: 2.000033782198443,
        contempt: 2.0002270473924,
        surprise: 1.2051039338111877
    }
};

var arr = Object.entries(test_data)


var options = {
    type: 'line',
    data: {
        labels: ["joy", "fear", "anger", "disgust", "sadness", "contempt", "surprise"],
        datasets: []
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    reverse: false
                }
            }]
        }
    }
}




var ctx = document.getElementById('chartJSContainer').getContext('2d');
var myC = new Chart(ctx, options);


arr.forEach((v) => {
    setTimeout(() => {


        myC.data.datasets.push({
            data: [v[1].joy, v[1].fear, v[1].anger, v[1].disgust, v[1].sadness, v[1].contempt, v[1].surprise],
            label: "#" + v[0] + "Milisec"
        });
        myC.update()
    }, parseInt(v[0]))
})


3 commentaires

Hmm, c'est proche, mais ce dont j'ai besoin est un peu différent, maintenant vous avez dessiné toute la ligne après un certain temps. Ce dont j'ai besoin, c'est d'afficher chacun de ces objets dans les données de test après autant de millisecondes - exemple: après 1222 ms, afficher le premier objet, après 2328, afficher le deuxième objet ... Le graphique a donc un certain flux, comme une vidéo, vous passez en secondes et montrer des émotions


utilisez quelque chose comme cet exemple: jsfiddle.net/therowf/jp48kb5L


Je ne sais pas comment structurer mes données comme les données que vous avez fournies dans cet exemple: /



0
votes

Je comprends que vous souhaitez mettre à jour la vue avec de nouvelles données json fraîches toutes les xx ms en résumé, vous devez:

  • ont un service qui expose une observable partagée, disons data $;
  • le service a la méthode pour récupérer les données distantes et mettre à jour l'observable partagée ci-dessus, par exemple getRemoteData ()
  • ce service Observable.interval () qui appelle la méthode pour récupérer les données distantes
  • ayez votre composant qui affiche les données
  • demandez au composant de s'abonner aux données observables du service.

l'exemple de code suivant montre comment l'implémenter

import {takeWhile, first} from 'rxjs/operators';
import { Component, OnInit } from '@angular/core';
import { interval } from "rxjs";
import { PositionsModel } from "./positionsmodel";
import { MouvementService } from './mouvement.service';

@Component({
  selector: 'app-mouvementview',
  template: '<div *ngIf="data"> your chart </div>',
})

export class MouvementviewComponent implements OnInit {
  public data: PositionsModel;
  private display: boolean; // whether to display info in the component
                            // use *ngIf="display" in your html to take
                            // advantage of this
  private alive: boolean; // used to unsubscribe from the IntervalObservable
                          // when OnDestroy is called.
  results : string;
  // Inject mouvementService
  constructor(private mouvementService: MouvementService) {
    this.display = false;

    }

ngOnInit() {
   this.mouvementService.getPositions().pipe(
      first()) // only gets fired once
      .subscribe((data) => {
        this.data = data;
        this.display = true;
        this.alive = true;
});

// get our data every subsequent 200 mseconds
interval(200).pipe(
      takeWhile(() => this.alive)) // only fires when component is alive
      .subscribe(() => {
        this.mouvementService.getPositions()
          .subscribe(data => {
        console.log(data);
        this.data = data;
          });
      });

}

ngOnDestroy(){
    this.alive = false; // switches your IntervalObservable off
  }
}


1 commentaires

Je comprends ce que vous dites, j'ai essayé de faire quelque chose de similaire mais cela n'a pas fait le travail pour moi: / Je ne sais pas comment implémenter votre code avec ma structure de données honnêtement, j'aurais besoin de montrer la première valeur de chaque tableau d'émotions pour chaque image, je ne sais pas comment faire comme ça



0
votes

Vous pouvez utiliser la fonction addData () de Chart.js avec une méthode setTimeout pour cela.

let ctx = document.getElementById("myChart").getContext('2d');
        let myChart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
                datasets: [{
                    label: '# of Votes',
                    data: [7, 9, 3, 5, 2, 3],
                    backgroundColor: [
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(255, 206, 86, 0.2)',
                        'rgba(75, 192, 192, 0.2)',
                        'rgba(153, 102, 255, 0.2)',
                        'rgba(255, 159, 64, 0.2)'
                    ],
                    borderColor: [
                        'rgba(255,99,132,1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(255, 206, 86, 1)',
                        'rgba(75, 192, 192, 1)',
                        'rgba(153, 102, 255, 1)',
                        'rgba(255, 159, 64, 1)'
                    ],
                    borderWidth: 1
                }]
            },
            options: {
                scales: {
                    yAxes: [{
                        ticks: {
                            beginAtZero:true
                        }
                    }]
                }
            }
        });

        setTimeout(function() {
            addData(myChart, "White", 7);
        },3000);

        function addData(chart, label, data) {
            console.log(console.log(chart.data.datasets[0].data));
            chart.data.labels.push(label);
            chart.data.datasets[0].data.push(data);
            chart.update();
        } 

script.js

<!DOCTYPE html>
<html>
    <head>
         <title>Add data</title>
         <script src = "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.js"></script>
    </head>
    <body>      
        <div class = "container">
            <canvas id="myChart"></canvas>            
        </div>
        <script src = "script.js"></script>
    </body>
</html>


0 commentaires