View on GitHub

Geodjango_charts

Como parte de éste tutorial se abordará cómo levantar un servidor de django para datos espaciales (geo-django), que a su vez interactue con leaflet y tenga la capacidad de desplegar gráficas através de Chartjs, por los temás que se aboran es necesario tener conocimientos básicos del uso de bases de datos geoespaciales, así como los lenguajes de programación Python 3, Javascript, Html, Css.

Gráficas con Chart.js

Notemos que en nuestro html tenemos


      <div class="chart-container" >
        <canvas id="myChartGraph" width="100" height="100" style="margin-left:100px;"></canvas> 
        <canvas id="myChartGraph1" width="100" height="100" style="margin-left:200px;"></canvas> 
       </div> 

Tenemos dos canvas donde se dibujarán nuestras gráficas, ahora debemos inicializarlas en el código JS.

    var myChart;
    var myChart1;
    function graficar(datos, delito){
      var jsonData = JSON.stringify(datos)
      var delitoData = JSON.stringify(delito)


      var ctx = document.getElementById("myChartGraph").getContext("2d")
      var ctx1 = document.getElementById("myChartGraph1").getContext("2d")

      if(myChart != null && myChart1 != null){
        myChart.destroy();
        myChart1.destroy();
      }
    //... 
     }  

Debemos crear la variable a la cual asignar los canvas, dado que estamos recibiendo dos arreglos usamos la función de JS JSON.stringify() para convertir el arreglo en una cadena, después usamos el método document.getElementById() para regresar un objeto de tipo Element que representa el elemento cuyo id coincide con la cadena y getContext es un método de canvas de html para devolver un “contexto de dibujo” y con 2d le estamos indicando que el tipo de contexto es de dos dimensiones. Con la estructura if checamos si ya estaba previamente inicializada y de ser así la destruimos para poder volver a usar el canvas y que los datos se sobreescriban de forma correcta.

//...
//Indicamos que la letra en las gráficas sea blanca
Chart.defaults.global.defaultFontColor = 'white';

Ahora vamos a filtrar los datos con ayuda de una estructura switch-case (No es la única forma de hacerlo pero es intuitiva)

      //...
      var numPeaton = 0;
      var numMoto = 0;
      var numPasajero = 0;
      var numCiclista = 0;
      var numConductor = 0;
      for (var i = 0; i <= datos.length - 1; i++) {
        console.log(datos[i])
        switch(datos[i]){
          case "PEATON":
              numPeaton +=1;
            break;
          case "MOTOCICLISTA":
              numMoto+=1;
              break;
          case "PASAJERO":
            numPasajero+=1;
            break;
          case "CICLISTA":
            numCiclista+=1;
            break;
          case "CONDUCTOR":
            numConductor+=1;
            break;
          default:
            break;
          

        }
      }
      var atropellado = 0
      var colision = 0
      var caida = 0
      var transito = 0
      for (var i = 0; i <= delitoData.length - 1; i++) {
        switch(delito[i]){
          case "HOMICIDIO CULPOSO POR TRÁNSITO VEHICULAR (CAIDA)":
              atropellado +=1;
            break;
          case "HOMICIDIO CULPOSO POR TRÁNSITO VEHICULAR (COLISION)":
              colision+=1;
              break;
          case "HOMICIDIO CULPOSO POR TRÁNSITO VEHICULAR (ATROPELLADO)":
              caida+=1;
            break;
          case "HOMICIDIO CULPOSO POR TRÁNSITO VEHICULAR":
              transito+=1;
            break;
          
          default:
            break;
          

        }
      }
	...

Tenemos el número de ocurrencia de cada cadena con lo cual ya solo debemos crear nuestras gráficas con éstos datos de la siguiente forma:

    //... 
    myChart = new Chart(ctx, {
          type:"doughnut", //Indicamos el tipo de gráfica
          data: {
            labels:['PEATON','MOTOCICLISTA','PASAJERO','CICLISTA','CONDUCTOR'], //Damos las cabezeras a la gráfica
            datasets:[{
              label:'Tipo de Entidad',
	      //Aquí le pasamos los datos  numéricos que conseguimos previamente
              data:[numPeaton, numMoto, numPasajero, numCiclista, numConductor],
              //indicamos los colores para cada 
	      backgroundColor:[ 
                'rgb(219,34,52)',  
                'rgb(31,55,222)',
                'rgb(52,201,60)',
                'rgb(213,0,10)',
                'rgb(224,236,4)',
              ]
            }],
            },
	  //Aquí indicamos toda la configuración opcional de la gráfica
          options:{
            //Ajustamos la escala
	    scales:{
              yAxes:[{
                ticks:{
	          //indicamos la orientación
                  beginAtZero:true
                }
              }]
            },
	    //Le indicamos que el canvas sea responsivo 
            responsive:true
          }
      });
      //Con ésta función le decimos que se actualice el canvas con la nueva configuración
      myChart.update();
      
      //Éste canvas es análogo
      myChart1 = new Chart(ctx1, {
          type:"bar",
          data: {
            labels:['CAIDA','COLISION','ATROPELLADO','TRÁNSITO VEHICULAR'],
            datasets:[{
              label:'Tipo de delito',
              data:[caida, colision,atropellado,transito],
              backgroundColor:[
                'rgb(219,34,52)',
                'rgb(31,55,222)',
                'rgb(52,201,60)',
                'rgb(213,0,10)',
                'rgb(224,236,4)',
              ]
            }],
            },
          options:{
            scales:{
              yAxes:[{
                ticks:{
                  beginAtZero:true
                }
              }]
            },
            responsive:true
          }
      });
      myChart1.update();
      

     }
   }
   //...

Con ésto obtendriamos lo siguiente en nuestra página:

  1. Documentación Charts JS
  2. Charts Django
  3. Video Django ChartJS
  4. Charts JS desde python

Formularios