Header Ads Widget

Responsive Advertisement

Como crear una presentación concurrida "Bar Chart Race" en Google Sheets

 BAR CHART RACE

Cuando tenemos un historial de datos, sabemos que nos pueden proporcionar información valiosa y la mejor forma para sacar provecho de esos datos es utilizando grÔficos.

Ahora te voy a explicar cómo podemos insertar un tipo de grÔfico animado ó presentación llamado bar chart race, qué significa carrera de grÔfico de barras, el cual nos muestra cómo se comportan nuestros datos a lo largo del tiempo de una manera interactiva.



Disponer nuestra data

Todos nuestros datos deben estar organizados, limpios, en otras palabras preparados, y antes que nada debemos pensar primero en lo que queremos investigar en base a nuestra información. La data que vamos a utilizar muestra información del valor de mercado de varias empresas mundiales a lo largo de los años.

Cada fila o dato nos indica el valor en dolares de una empresa asociada a una categoria desde el año 2000 al 2022. La fecha estÔ con formato de dia mes y año, en mi ejemplo usaré el año, pero eso no es obstÔculo para que nuestro grÔfico muestre el recorrido en dias ó meses, eso depende de como quieres mostrar la animación. La catgoría de nuestra data se usarÔ para distinguir y comparar las industrias que se van mostrando en cada barra horizontal de nuestra grÔfica.

Tomar en cuenta el orden de los datos "date, name, category, value"; si tus datos estƔn organizados de diferente forma, debes ordenarlos para adaptarlos el formato de la data de ejemplo para que te funcione correctamente.


Creación de funciones de Apps Script

La interprestación de lo que queremos realizar se resumen en:

Código.gs

Entonces para empezar, abrimos el menĆŗ Extensiones y damos clic en Apps Script.

Reemplazamos el código que aparece por default por el siguiente:

//creación de menĆŗ "GrĆ”ficas" que llama a la función que genera la grĆ”fica

function onOpen() {
 SpreadsheetApp.getUi()
  .createMenu("GrĆ”ficas")
    .addItem("Generar grĆ”fica""grafica_html")
    .addToUi();
}

// función para leer los datos de nuestra hoja de cĆ”lculo
function leer_datos() {
  var ultima_fila = SpreadsheetApp.getActiveSheet().getLastRow();
  var ultima_columna = SpreadsheetApp.getActiveSheet().getLastColumn();
  var dataRange = SpreadsheetApp.getActiveSheet().getRange(fila_inicial=2columna_inicial=1,ultima_filaultima_columna);
  var data_values = dataRange.getValues();

  // se mapea cada elemento del arreglo a una propiedad en el orden que vienen las columnas y se filtran valores de name vacĆ­os
  return data_values.map(([datenamecategoryvalue]) => (
    { datenamecategoryvalue }))
    .filter(d => (d.name == "" ? false : true));
}

//función para graficar los datos
function grafica_html() {
  var html = HtmlService.createTemplateFromFile('grafica');
  html.datos = leer_datos();
  SpreadsheetApp.getUi().showModalDialog(html.evaluate().setHeight(800).setWidth(1000),"GrĆ”fica");
}

Componentes HTML

Ahora tenemos que crear los archivos html necesarios para graficar.

El primer archivo de llama grafica, lo creamos dando clic en el signo +, elejimos la opción HTML y lo nombramos.

GrƔfica.html

Dentro de grafica.html reemplazamos el default por el siguiente código:

<!DOCTYPE html>
<html>
  <head>
    <style>
      htmlbody {
        overflow: hidden;
        font-family: ArialHelveticasans-serif;
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #bar-chart-race > text:last-child {
          font-size: 4em !important;
          font-weight: bold !important;
      }
      #bar-chart-race g ~ g ~ g text {
        font-weight: bold !important;
      }
    </style>
    <base target="_top">
  </head>
  <body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.6.1/d3.min.js"></script>
    <?!= HtmlService.createHtmlOutputFromFile('chartjs').getContent(); ?>
    <script>
      const data_sheet = <?!= JSON.stringify(datos) ?>;
      const data = data_sheet.map(x => {
        x.date = new Date(x.date);
        return x;
      });
      const play = () => {
        const chart = barChartRace(data, {
          svgId'bar-chart-race'
          });
          d3.select('#bar-chart-race').remove();
          d3.select('body').append(() => chart);
          chart.play();
      }

      const button = d3.select('body').append('div').append('button')
        .attr('type''button').attr('class','reiniciar').text('Reiniciar');

      // iniciar animación al cargar la pĆ”gina
      play();

      // reiniciar al dar click en el botón
      button.on('click', () => {
        play();
      });
    
    </script>
  </body>
</html>

El segundo archivo HTML necesario es el que tomaremos del repositorio  de Takanori Fujiwara Archivo chart.js
lo creamos de la misma manera dando clic en el signo +, elejimos la opción HTML y le colocamos el nombre chartjs, tomar en cuenta que no se debe colocar .html ya que apps script lo coloca automaticamente.


En esta parte borramos su contenido y creamos un tipo de atributo script de HTML <script></script> y dentro de este script pegamos el código del archivo chart.js del repositorio de Takanori Fujiwara.

Luego de pegar el código nos dirigimos a la fila donde se define la constante barChartRace y eliminamos la palabra export debido a que Apps Script no soporta los módulos de la especificación ES6 de JavaScript.


TambiƩn puedes modificar de manera opcional la variable n y width, las cuales nos muestran las cantidades de barras horizontales y el ancho de nuestra grƔfica, en mi ejemplo lo dejƩ en n=10 (diez barras horizontales) y width=1000.


Finalmente damos clic en guardar proyecto




Generar grĆ”fica interactiva Bar Chart Race en mi hoja 

de cƔlculo de Google Sheets

Finalmente refrescamos nuestra hoja de cÔlculo y debería aparecer nuestro menú para generar el grÔfico animado.

La primera vez que usamos nos pedirÔ autorización para ejecutar código de apps script, lo permitimos y volvemos a usar el menú, finalmente observamos el resultado.










Publicar un comentario

0 Comentarios