Ir al contenido principal

Angular Chart – conectamos con los datos




Conectar gráficos con los datos

En este articulo conectamos los gráficos con los datos, en forma local y online.

Intro

Podríamos crear un archivo .json como abajo.

"test": [

        {

            "dane": [

                {

                    "mdane": [655980],

                    "label""Product A"

                },

                {

                    "mdane": [284840

                    ],

                    "label""Product B"

                },

                {

                    "mdane": [122832],

                    "label""Product C"

                }

            ],

            "years": ["2018""2019""2020"

            ]

        }

    ],

 

Y conectar el grafico con este simple código a través de HttpClient

getdata2(): Observable<HttpClient[]> {

    const headers = new HttpHeaders({

      'Content-Type': 'application/json',

      Accept: 'application/json; charset=UTF-8',

    });

    return this.http.get<any>('../assets/data/products.json', { headers }).pipe(

      map(a => {

        return a.test;

      })

    );

  }

Caso real

Pero más lógico es que recopilamos los datos de una base de datos en la forma abajo indicada, donde a cada producto corresponden sus ventas anuales – en este caso

"annualsales": [

        {

            "label""Product A",

            "mydata": [

                { "a"23"y""2018" },

                { "a"17"y""2019" },

                { "a"38"y""2020" }

            ]

        },

        {

            "label""Product B",

            "mydata": [

                { "a"10"y""2018" },

                { "a"8"y""2019" },

                { "a"28"y""2020" }

            ]

        },

      ]

 

y para esto tenemos que hacer un poco de refuerzo para conseguir que el grafico demuestra estos datos.

Para facilitar toda la operación primero creaos una clase.

Datos Offline

Para los datos offline y para facilitar la tarea, creamos una clase que con su estructura representa la forma que hemos guardado los datos.

export interface AsDataLocal {

  annualsales: [

    {

      labelstring;

      mydata: [

        {

          anumber;

          ystring;

        }

      ]

    }

  ];

}

 

Primero método que recoge los datos del archivo. 

getdataloc(): Observable<AsDataLocal> {

    const headers = new HttpHeaders({

      'Content-Type': 'application/json',

      Accept: 'application/json; charset=UTF-8',

    });

    return this.http.get<AsDataLocal>('../assets/data/products.json', { headers }).pipe(

      map(a => {

        return a;

      })

    );

  }

y el siguiente método para transformar y mostrar datos en el gráfico. 

getNdata(): void {

    const yearsany = {};

    const datasetChartDataSets[] = [];

    let lbl = '';

    let io = {};

    let qua = 0;

    this.getdataloc().subscribe((koAsDataLocal=> {

      const display = ko.annualsales;

      display.forEach((dae=> {

        dae.mydata.forEach((obj=> {

          years[obj.y] = obj.y;

          lbl = dae.label;

        });

        qua = dae.mydata.length;

        // important set const sale here

        const saleany[] = [];

        for (let index = 0index < quaindex++) {

          const ele = dae.mydata[index];

          sale.push(ele.a);

        }

        io = {

          label: lbl,

          data: sale

        };

        dataset.push(io);

      });

      const myyears = Object.getOwnPropertyNames(years);

      this.barChartLabels = myyears;

      this.barChartData = dataset;

    });

  }

Recordaos de articulo anterior https://angularprojekt.blogspot.com/2021/07/angular-chart-graficos.html las variables 

public barChartLabelsLabel[] = [];

public barChartDataChartDataSets[] = [

    { label: ''data: []  }

 ];

barChartLabels – para mostrar años en eje horizontal

barChartData – para mostrar datos en eje vertical, en esta variable dejamos una entrada vacía para evitar error a la hora de dibujar el grafico. 

Importante – la variable {sale} tiene que estar en lugar correcto, tal como esta en el método, si lo ponemos arriba con otros o fuera del método, la demonstración de los datos no será correcta.

 

Datos Online

En este caso vamos usar Realtime database de Firebase.  Al importar los datos a la base de datos, su estructura se puede apreciar en esta manera.



Y para obtener estos datos escribimos el siguiente método. Pero antes para tener acceso a la base de datos añadimos la al constructor

constructor(public httpHttpClientprivate drlAngularFireDatabase) { }

 y el siguiente el metodo

getDa(): Observable<AsData[]> {

    return this.drl.list<AsData>('annualsales').valueChanges();

  }

Como acedemos directamente a datos “annualsales” también hay que modificar o añadir otra clase que es similar a la de AsDataLocal.

  

 export interface AsData {

  labelstring;

  mydata: [

    {

      anumber;

      ystring;

    }

  ];

}

 

Y finalmente el método para mostrar datos en el grafico y tal como podéis comprobar el método offline y online son similares.

 

getObservData(): void {

    const yearsany = {};

    const datasetChartDataSets[] = [];

    let lbl = '';

    let io = {};

    let qua = 0;

    this.getDa().subscribe(snap => {

      snap.forEach(vg => {

  //  group by years

        vg.mydata.forEach(obj => {

          years[obj.y] = obj.a;

          lbl = vg.label;

        });

        qua = vg.mydata.length;

        // important set const sale here

        const saleany[] = [];

  // group by product and sales

        for (let index = 0index < quaindex++) {

          const ele = vg.mydata[index];

          sale.push(ele.a);

        }

        io = {

          label: lbl,

          data: sale

        };

        dataset.push(io);

      });

      const myyears = Object.getOwnPropertyNames(years);

      this.barChartLabels = myyears;

      this.barChartData = dataset;

    });

  }

 

Por la estructura de los datos en el archivo .json los datos están agrupados por productos y cada de ellos tiene sus correspondientes valores de venta depende del año,

Y para que los años están agrupados en eje horizontal, pero datos de venta entran en su columna correspondiente del producto, tenemos que crear dos objetos, primero que recoge los años y les agrupa en un array sin repeticiones del año.

y el secundo que recoge datos de venta para cada producto.

 

Y esto es el resultado



 

 

 

 

Comentarios

Entradas populares de este blog

Angular Chart - Gráficos

Intro La base de este tutorial he encontrado bajo este enlace al busca de información sobro como añadir los gráficos a una aplicación de Angular. https://www.smashingmagazine.com/2020/07/responsive-dashboard-angular-material-ng2-charts-schematics/ También hay informaciones del creador de este componente que se puede encontrar aquí: https://www.npmjs.com/package/ng2-charts Es bastante útil, no obstante, he encontrado unos errores que tenia que modificar y adaptar a la app que estoy creando, tanto por el uso de Flex-Layout y adaptar a (responsive app) en cada aspecto y para cada dispositivo. Si hayas practicado con Angular Admin Panel bajo este enlace: https://angularprojekt.blogspot.com/2021/07/angular-admin-panel-con-flex-layout.html Hoy vamos a añadir unos gráficos, porque gráficos siempre molan y cada panel de administración debería tener unos cuántos. Modificaciones Pero antes de empezar vamos a modificar el proyecto. En primer lugar, vamos a eliminar el conte

Firebase Cloud Messaging en Angular 13

  Hoy vamos a añadir Push messag e en nuestra página con Firebase 9.0.0 y Angular 13 .Si has seguido los tutoriales anteriores por ahora lo dejamos y vamos a crear un proyecto nuevo desde cero. En primer lugar, nos aseguramos tener todos los framework y SDK al día. Utilizando Command Prompt escribimos ng version el resultado debería ser como en la imagen arriba. Si no, hay que instalar Node.js y Angular/Cli. Creamos proyecto nuevo ng new <nombre de proyecto> y abrimos Visual Code con el proyecto recién creado. Para poder trabajar con Firebase primero vamos a crear un proyecto en consola de firebase. Como crear lo puedes leer aquí https://firebase.google.com/docs/projects/learn-more Para comprobar la versión de firebase escribimos en terminal o en Command Prompt comando firebase –version . Si no hay ninguna instalamos con este comando: npm install -g firebase-tools y después en el terminal del proyecto npm install firebase para utilizar las bibliotecas. Preparación. Al crear