Añadir una lista de opciones
Esta es una continuación de gráficos circulares (3)
Desde 2008 hasta 2014
El gráfico que acabamos de dibujar está muy bien, pero me gustaría saber que pasaba en 2008 cuando Internet Explorer era todavía el navegador más utilizado, y Google Chrome no existía, y me gustaría saber como creció Firefox, y Google Chrome, y como IE perdió importancia hasta quedarse con solo el 10% de usuarios.
Para poder verlo todo empezamos añadiendo al HTML una lista desplegable ( <select>
) con 7 opciones ( de 2008 hasta 2014 ). También en el titulo <h4>
habrá un pequeño cambio: En el lugar del año ( 2014 ) ahora aparece <span id="output">
. Manipularemos el contenido de este <span>
a través de JavaScript para que el año cambie cada vez que alguien selecciona otra opción de la lista desplegable.
Estadísticas de uso de navegadores
( para el mes de enero del año )
En el JavaScript habrá más cambios. De entrada la variable oData
se transformará en un objeto de objetos, uno para cada ano de la lista desplegable.
var oData = {
2014:{'IE':'10.2', 'Firefox':'26.9', 'Chrome':'55.7', 'Safari':'3.9', 'Opera':'1.8'} ,
2013:{'IE':'14.3', 'Firefox':'30.2', 'Chrome':'48.4', 'Safari':'4.2', 'Opera':'1.9'},
2012:{'IE':'20.1', 'Firefox':'37.2', 'Chrome':'35.3', 'Safari':'4.3', 'Opera':'2.4'},
2011:{'IE':'26.6', 'Firefox':'42.8', 'Chrome':'23.8', 'Safari':'4.0', 'Opera':'2.5'},
2010:{'IE':'36.2', 'Firefox':'46.3', 'Chrome':'10.8', 'Safari':'3.7', 'Opera':'2.2'},
2009:{'IE':'44.8', 'Firefox':'45.5', 'Chrome':'3.9', 'Safari':'3.0', 'Opera':'2.3'},
2008:{'IE':'54.7', 'Firefox':'36.4', 'Chrome':'0', 'Safari':'1.9', 'Opera':'1.4'}
};
Por lo cual habrá que escribir una función ( queAno()
) que nos permita saber que año acaba de seleccionar el usuario, y almacenarlo en una variable ( var ano
).
function queAno() {
var selectAno = document.getElementById('losAnos'); // la lista desplegable
var index = selectAno.selectedIndex;
var ano = selectAno.options[index].innerHTML;
return ano;
}
..................
// almacena el año en una variable
var ano = queAno();
La función sectorCircular()
queda igual que antes.
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();
}
La función laLeyenda()
queda casi sin cambiar. Solo que esta vez toma como argumento el año ( var ano
), y utilizamos el objeto oData[ano]
para recuperar los datos necesarios para construir el gráfico.
function laLeyenda(ano) {
var ly = Y;
var lx = (canvas.width / 2) - offset + r + 30;
ctx.textBaseline = 'top';
ctx.font = '12px Verdana';
var otrosValue = 100;
for (var propiedad in oData[ano]) {
ctx.fillStyle = oColores[propiedad];
ctx.fillRect(lx, ly, 15, 15);
ctx.fillStyle = '#333';
ctx.fillText(propiedad + ': ' + oData[ano][propiedad] + '%', lx + 25, ly);
otrosValue -= oData[ano][propiedad];
ly += 23;
}
otrosValue = Math.round(otrosValue * 10) / 10;
ctx.fillStyle = oColores.otros;
ctx.fillRect(lx, ly, 15, 15);
ctx.fillStyle = '#333';
ctx.fillText('otros: ' + otrosValue + '%', lx + 25, ly);
}
A la función dibujarGrafico(),
que también tomará como argumento el año, habrá algunos cambios importantes.
En primer lugar llamaremos el método clearRect
para limpiar el <canvas>
cada vez que se actualiza el gráfico. A continuación el código queda casi sin cambiar, pero utilizaremos objeto oData[ano]
en lugar de oData
.
Al final la función dibujarGrafico()
llama laLeyenda(ano)
.
function dibujarGrafico(ano) {
// limpia el canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
// actualiza el año en el titulo
document.getElementById('output').innerHTML = ano;
// dibuja el gráfico
ctx.fillStyle = oColores.otros;
ctx.arc(X, Y, r, 0, 2 * Math.PI);
ctx.fill();
var ap = 0;
for (var propiedad in oData[ano]) {
var af = ap + (2 * Math.PI / 100) * oData[ano][propiedad];
sectorCircular(ap, af, oColores[propiedad]);
ap = af;
}
// llama la función laLeyenda
laLeyenda(ano);
}
Y lo mas importante: al cambiar lo seleccionado en la lista desplegable actualizamos el gráfico.
selectAno = document.getElementById('losAnos');
selectAno.onchange = function() {
dibujarGrafico(queAno());
}
Poniendolo todo junto
Estadísticas de uso de navegadores
( para el mes de enero del año )
var canvas = document.getElementById('lienzo');
if (canvas && canvas.getContext) {
var ctx = canvas.getContext('2d');
if (ctx) {
var oData = {
2014:{'IE':'10.2', 'Firefox':'26.9', 'Chrome':'55.7', 'Safari':'3.9', 'Opera':'1.8'},
2013:{'IE':'14.3', 'Firefox':'30.2', 'Chrome':'48.4', 'Safari':'4.2', 'Opera':'1.9'},
2012:{'IE':'20.1', 'Firefox':'37.2', 'Chrome':'35.3', 'Safari':'4.3', 'Opera':'2.4'},
2011:{'IE':'26.6', 'Firefox':'42.8', 'Chrome':'23.8', 'Safari':'4.0', 'Opera':'2.5'},
2010:{'IE':'36.2', 'Firefox':'46.3', 'Chrome':'10.8', 'Safari':'3.7', 'Opera':'2.2'},
2009:{'IE':'44.8', 'Firefox':'45.5', 'Chrome':'3.9', 'Safari':'3.0', 'Opera':'2.3'},
2008:{'IE':'54.7', 'Firefox':'36.4', 'Chrome':'0', 'Safari':'1.9', 'Opera':'1.4'}
};
var oColores = {
'IE': '#6495ED',
'Firefox': '#FF8C00',
'Chrome': '#FFD700',
'Safari': '#32CD32',
'Opera': '#DC143C',
'otros': '#ddd'
};
function queAno() {
var selectAno = document.getElementById('losAnos');
var index = selectAno.selectedIndex;
var ano = selectAno.options[index].innerHTML;
return ano;
}
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 laLeyenda(ano) {
var ly = Y;
var lx = (canvas.width / 2) - offset + r + 30;
ctx.textBaseline = 'top';
ctx.font = '12px Verdana';
var otrosValue = 100;
for (var propiedad in oData[ano]) {
ctx.fillStyle = oColores[propiedad];
ctx.fillRect(lx, ly, 15, 15);
ctx.fillStyle = '#333';
ctx.fillText(propiedad + ': ' + oData[ano][propiedad] + '%', lx + 25, ly);
otrosValue -= oData[ano][propiedad];
ly += 23;
}
otrosValue = Math.round(otrosValue * 10) / 10;
ctx.fillStyle = oColores.otros;
ctx.fillRect(lx, ly, 15, 15);
ctx.fillStyle = '#333';
ctx.fillText('otros: ' + otrosValue + '%', lx + 25, ly);
}
function dibujarGrafico(ano) {
// limpia el canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
// actualiza el año en el titulo
document.getElementById('output').innerHTML = ano;
// dibuja el gráfico
ctx.fillStyle = oColores.otros;
ctx.arc(X, Y, r, 0, 2 * Math.PI);
ctx.fill();
var ap = 0;
for (var propiedad in oData[ano]) {
var af = ap + (2 * Math.PI / 100) * oData[ano][propiedad];
sectorCircular(ap, af, oColores[propiedad]);
ap = af;
}
// llama la función laLeyenda
laLeyenda(ano);
}
var ano = queAno();
// en el titulo escribe el año: 2014
document.getElementById('output').innerHTML = ano;
var r = 100;
var offset = 75;
var X = (canvas.width / 2) - offset;
var Y = canvas.height / 2;
// inicia el canvas dibujando el gráfico para 2014
dibujarGrafico(ano);
// cada vez que cambia el año cambiará el gráfico
selectAno = document.getElementById('losAnos');
selectAno.onchange = function() {
dibujarGrafico(queAno());
}
}
}