Más sectores circulares

facebook-svg gplus-svg twitter-svg

Esta es una continuación de gráficos circulares (1)

A continuación vamos a dibujar los otros sectores circulares ( para Firefox, Chrome, Safari y Opera ). Para esto vamos a utilizar la función sectorCircular() que hemos escrito anteriormente.
Tenemos que tener en cuenta que cada nuevo sector circular empieza donde acaba el anterior ( var ap = af ).


Estadísticas de uso de navegadores
( para el mes de enero del año 2014 )

Su navegador no soporta canvas :(

var canvas = document.getElementById('lienzo');
if (canvas && canvas.getContext) {
  var ctx = canvas.getContext('2d');
  if (ctx) {
    var oData = {
      'IE': '10.2',
      'Firefox': '26.9',
      'Chrome': '55.7',
      'Safari': '3.9',
      'Opera': '1.8'
    };
    var oColores = {
      'IE': '#6495ED',
      'Firefox': '#FF8C00',
      'Chrome': '#FFD700',
      'Safari': '#32CD32',
      'Opera': '#DC143C',
      'otros': '#ddd'
    };
    // el radio del gráfico;					
    var r = 100;
    // las coordenadas del centro del canvas
    var X = canvas.width / 2
    var Y = canvas.height / 2;
    // dibuja un circulo gris en el centro del canvas								
    ctx.fillStyle = '#ddd';
    ctx.beginPath();
    ctx.moveTo(X, Y);
    ctx.arc(X, Y, r, 0, 2 * Math.PI);
    ctx.fill();

    function sectorCircular(ap, af, color) {
        var Xap = X + r * Math.cos(ap);
        var Yap = Y + r * Math.sin(ap);
        ctx.beginPath();
        ctx.fillStyle = color;
        ctx.moveTo(X, Y);
        ctx.lineTo(Xap, Yap);
        ctx.arc(X, Y, r, ap, af);
        ctx.closePath();
        ctx.fill();
      }
      // dibuja el sector circular que representa IE
    var ap = 0;
    var af = ap + (2 * Math.PI / 100) * oData.IE;
    sectorCircular(ap, af, oColores.IE)
      // dibuja el sector circular que representa Firefox
    ap = af;
    af = ap + (2 * Math.PI / 100) * oData.Firefox;
    sectorCircular(ap, af, oColores.Firefox);
    // dibuja el sector circular que representa Chrome								
    ap = af;
    af = ap + (2 * Math.PI / 100) * oData.Chrome;
    sectorCircular(ap, af, oColores.Chrome);
    // dibuja el sector circular que representa Safari										
    ap = af;
    af = ap + (2 * Math.PI / 100) * oData.Safari;
    sectorCircular(ap, af, oColores.Safari);
    // dibuja el sector circular que representa Opera																	
    ap = af;
    af = ap + (2 * Math.PI / 100) * oData.Opera;
    sectorCircular(ap, af, oColores.Opera);
  }
}

Estadísticas de uso de navegadores
( para el mes de enero del año 2014 )

Su navegador no soporta canvas :(

Aligerando el código

Dibujando los sectores circulares uno por uno observamos que el código se repite de manera monótona y previsible. Lo que quiere decir que podemos ponerlo todo en una función ( dibujarGrafico() )


function dibujarGrafico() {
  var ap = 0;
  // para cada propiedad en el objeto oData
  for (var propiedad in oData) {
    var af = ap + (2 * Math.PI / 100) * oData[propiedad];
    sectorCircular(ap, af, oColores[propiedad]);
    ap = af;
  }
}

Y es así como queda el código:


window.onload = function() {
  var canvas = document.getElementById('lienzo');
  if (canvas && canvas.getContext) {
    var ctx = canvas.getContext('2d');
    if (ctx) {
      var oData = {
        'IE': '10.2',
        'Firefox': '26.9',
        'Chrome': '55.7',
        'Safari': '3.9',
        'Opera': '1.8'
      };
      var oColores = {
        'IE': '#6495ED',
        'Firefox': '#FF8C00',
        'Chrome': '#FFD700',
        'Safari': '#32CD32',
        'Opera': '#DC143C',
        'otros': '#ddd'
      };
      // el radio del gráfico;	
      var r = 100;
      // las coordenadas del centro del canvas
      var X = canvas.width / 2
      var Y = canvas.height / 2;

      function sectorCircular(ap, af, color) {
        var Xap = X + r * Math.cos(ap);
        var Yap = Y + r * Math.sin(ap);
        ctx.beginPath();
        ctx.fillStyle = color;
        ctx.moveTo(X, Y);
        ctx.lineTo(Xap, Yap);
        ctx.arc(X, Y, r, ap, af);
        ctx.closePath();
        ctx.fill();
      }
      function dibujarGrafico() {
        // dibuja la base del gráfico
        ctx.fillStyle = '#ddd';
        ctx.moveTo(X, Y);
        ctx.arc(X, Y, r, 0, 2 * Math.PI);
        ctx.fill();
        // dibuja los sectores circulares
        var ap = 0;
        // para cada propiedad en el objeto oData
        for (var propiedad in oData) {
          var af = ap + (2 * Math.PI / 100) * oData[propiedad];
          sectorCircular(ap, af, oColores[propiedad]);
          ap = af;
        }
      }
      // llama la función dibujarGrafico;
      dibujarGrafico();
    }
  }
}

Continúa leyendo...