3ENGINE

Programación y otros cachivaches

Categoría: Tecnologia

Página 2/42

Tecnologia

Chart.js: grafica de tipo donut con múltiples anillos


En un artículo anterior expliqué cómo añadir texto dentro de una grafica de tipo donut. Hoy te voy a mostrar cómo crear una gráfica tipo donut con múltiples anillos.

Extra! tambien veremos cómo modificar la información que aparece al pasar el ratón por encima de cada uno de los datos de la gŕafica.

Básicamente tenemos que declarar varios conjuntos de datos, donde cada conjunto de datos es un anillo. Hasta aqui todo bien. Si queremos mostrar una etiqueta «personalizada» para cada uno de los datos, tenemos que añadir las etiquetas en cada conjunto de datos y sobreescribir la función encargada de mostrar la información que aparece al pasar el ratón por encima. Ademas, ya de paso, hemos aprovechado para calcular el porcentage.

Código HTML

 

Código Javascript

var data = {
    labels: [],
    datasets: [
        {
            data: [2, 3, 8, 3, 4],
            backgroundColor: ["orange", "red", "green", "violet", "lightgreen"],
            labels: ["naranjas", "mandarinas", "manzanas", "berenjenas", "calabacines"]
        },
        {
            data: [2 + 3 + 8,  3 + 4],
            backgroundColor: ["springgreen", "lightblue"],
            labels: ["frutas", "hortalizas"],
        },
        {
            data: [2 + 3 + 8 + 3 + 4],
            backgroundColor: ["lightgray"],
            labels: ["total"],
        }
    ]
};

var myChart = new Chart(document.getElementById('mychart'), {
    type: 'doughnut',
    data: data,
    options: {
        cutoutPercentage: 20,
        maintainAspectRatio: true,
        responsive: true,
        legend: {
            display: false
        },
        animation: {
            animateScale: true,
            animateRotate: true
        },
        tooltips: {
             /* activa esta funcion si deseas no mostrar alguna de las etiquetas
            filter: function (item, data) {
                if (item.datasetIndex == 1) {
                if (item.index == 1) {
                   return false;
                  }
                }
                return true;
            },
            */            callbacks: {
                label: function(item, data) {
                    // get label and data
                    var labels = data.datasets[item.datasetIndex].labels;
                    var dataset = data.datasets[item.datasetIndex].data;
                    
                    var currentLabel = labels[item.index];
                    var currentValue = dataset[item.index];
                    
                    // calc percentage
                    var total = dataset.reduce(function(previousValue, currentValue, currentIndex, array) {
                        return previousValue + currentValue;
                    });
                    var percentage = ((currentValue/total) * 100);

                    // put label
                    return " " + currentLabel + ": " + currentValue + " (" + percentage.toFixed(1) + "%)";
                     
                }
            }
        },
    }
});

Aqui dejo el jsfiddle




Tecnologia

Chart.js: cómo añadir texto dentro de una grafica de tipo donut


A continuación te muestro cómo añadir texto dentro de una grafica de tipo donut en Chart.js

Chart.js es una libreria open source para crear gráficos en javascript basados en HTML5. Entre la amplia lista de gráficos disponibles de esta fantástica librería tenemos el donut (doughnut). Que básicamente es un gráfico de torta pero con un agujero en el centro … sorprendidos ¿verdad? 😉

Yo lo que quiero es aprovechar ese agujero del centro para añadir información, ya sea un simple texto o el total. Algo asi como los pop dots 😉

cómo añadir texto dentro de una grafica de tipo donut

Básicamente esto se consigue añadiendo un plugin e implementando el evento beforedraw. En mi ejemplo muestro el total pero podeis modificar el código para mostrar otra información.

Código HTML

Código Javascript

var data = {
    labels: ["Error", "Failure", "Success", "Skip", "Unknown"],
    datasets: [
        {
            data: [10, 5, 20, 2, 1],
            backgroundColor: ["red", "orange", "green", "blue", "violet"],
        }
    ]
};

var myChart = new Chart(document.getElementById('mychart'), {
    type: 'doughnut',
    data: data,
    options: {
        //cutoutPercentage: 50,
        maintainAspectRatio: true,
        responsive: true,
        legend: {
            display: false
        },
        animation: {
            animateScale: true,
            animateRotate: true
        },
    },
    plugins: [{
        id: 'total',
        beforeDraw: function(chart) {
            const width = chart.chart.width;
            const height = chart.chart.height;
            const ctx = chart.chart.ctx;
            ctx.restore();
            const fontSize = (height / 114).toFixed(2);
            ctx.font = fontSize + "em sans-serif";
            ctx.textBaseline = 'middle';
            var total = data.datasets[0].data.reduce(function(previousValue, currentValue, currentIndex, array) {
                return previousValue + currentValue;
            });
            const text = total;
            const textX = Math.round((width - ctx.measureText(text).width) / 2);
            const textY = height / 2;
            ctx.fillText(text, textX, textY);
            ctx.save();
        }
    }]
});

Aquí el código en jsfiddle

Si lo que queremos es utilizar el plugin en varias gráficas, entonces podemos registrar el plugin

Código Javascript (2)

var data = {
    labels: ["Error", "Failure", "Success", "Skip", "Unknown"],
    datasets: [
        {
            data: [10, 5, 20, 2, 1],
            backgroundColor: ["red", "orange", "green", "blue", "violet"],
        }
    ]
};

Chart.Chart.pluginService.register({
    beforeDraw: function(chart) {
        const width = chart.chart.width;
        const height = chart.chart.height;
        const ctx = chart.chart.ctx;
        ctx.restore();
        const fontSize = (height / 114).toFixed(2);
        ctx.font = fontSize + "em sans-serif";
        ctx.textBaseline = 'middle';
        var total = chart.data.datasets[0].data.reduce(function(previousValue, currentValue, currentIndex, array) {
                return previousValue + currentValue;
        });
        const text = total;
        const textX = Math.round((width - ctx.measureText(text).width) / 2);
        const textY = height / 2;
        ctx.fillText(text, textX, textY);
        ctx.save();
    },
});

var myChart = new Chart(document.getElementById('mychart'), {
    type: 'doughnut',
    data: data,
    options: {
        //cutoutPercentage: 50,
        maintainAspectRatio: true,
        responsive: true,
        legend: {
            display: false
        },
        animation: {
            animateScale: true,
            animateRotate: true
        },
    }
});

Aquí el código en jsfiddle




Tecnologia

Bootstrap: cómo agregar estado checked a los elementos de un menu dropdown


A continuación te muestro cómo agregar estado checked a los elementos de un menu dropdown de Bootstrap

Bootstrap es un framework Open Source creado por Twitter que facilita el diseño web. En la lista de componentes facilitados por este genial framework tenemos el dropdown. Un dropdown permite mostrar una lista de opciones en un desplegable. El problema es que bootstrap no permite indicar si una opcion de la lista está checked (activada) o unchecked (desactivada). Para conseguir esto por nuestra cuenta vamos a necesitar un poco de css y javascript:

  • La clase dropdown-item-checked añade un símbolo ‘✓’ a la izquierda de la opción, esto se consigue con CSS.
  • Con HTML asociamos cada una de las opciones del dropdown a la clase option que nos servirá para capturar el evento click y añadimos la clase dropdown-item-checked a las opciones que queremos a checked por defecto.
  • Javascript captura el evento click sobre las opciones y conmuta la clase dropdown-item-checked de la opcion sobre la que hemos hecho click. Cuando la opción no tiene la clase dropdown-item-checked el símbolo ‘✓’ desaparece y viceversa, cuando la opción tiene la clase dropdown-item-checked el símbolo ‘✓’ aparece de nuevo.

Código HTML


Código CSS

.dropdown-item-checked::before {
   position: absolute;
   left: .4rem;
   content: '✓';
   font-weight: 600;
}

Código Javascript

$(".option").click(function(event){
  event.preventDefault();
  var id = $(this).attr('id');
  $(this).toggleClass("dropdown-item-checked");
  var isChecked = $(this).hasClass("dropdown-item-checked");
  if (id == 'option-one') {
   if (isChecked) {
     // bla bla bla 
     }
  } else if (id == 'option-two') {
  // bla bla bla
  } else if (id == 'option-three') {
  // bla bla bla
  } else if (id == 'option-four') {
  // bla bla bla
  }
});

Aqui el código en jsfiddle




Tecnologia

Puesta en marcha y configuracion Wifi de Orange PI Zero


Orange PI Zero (OPI) es un mini ordenador de 7 euros que funciona con Android, Ubuntu, Debian. Utiliza el AllWinner H2 SoC y tiene 256MB/512MB DDR3 SDRAM

Puesta en marcha y configuración Wifi de una Orange PI Zero

Paso 1: Instalar SO

1. Descargar de armbian la ultima versión estable del SO para la OPI. Me recomiendan Ubuntu Xenial server legacy kernel como versión solo por linea de comandos o la Ubuntu Xenial desktop legacy kernel si necesitamos desktop.

La OPI Zero no dispone de salida HDMI. Pero dispone de salida de video compuesto. Dos opciones. Puedes adquirir la placa de expansión para la OPI Zero:

expboard

O bien fabricarte uno casero y mediante un adaptador RCA conectar la OPI a un monitor o a una TV:

rca_opi

2. Descargar un instalador para instalar el SO en la tarjeta SD. Yo recomiendo bajarse la versión portable que es standalone y por lo tanto no instala nada en el PC. No preocuparse si Windows no reconoce la tarjeta SD una vez que etcher ha instalado el SO.

etcher

3. Opcional. Si etcher no reconoce la tarjeta micro SD, intenta formatearla a ver si hay suerte. Sigue las instrucciones de como formatear una tarjeta sd (para linux):

  1. Conectar la tarjeta micro SD
  2. Identificar nuestra tarjeta (por ejemplo sdc)
    > lsblk
    ... o bien ...
    > fdisk -l
    
  3. Crear partición (por ejemplo sdc)
    > sudo parted /dev/sdc
    
  4. Introducir contraseña de root
  5. Crear etiqueta
    > mklabel msdos
    
  6. Crear partición única
    > mkpart primary fat32 1MiB 100%
    
  7. Salir
    > quit
    

Paso 2: Configurar WIFI

1. Conectar Orange PI Zero (OPI) al router mediante cable ethernet
2. Enchufar un cargador de smartphone de 5V y 2A (recomendado) al OPI
3. Esperar unos minutos, se tiene que encender una luz verde en la placa y una luz roja debe parpadear
4. Averiguar IP asignada al OPI. Por ejemplo con colasoft MAC scanner o desde la consola mediante un PING a la IP de broadcast (192.168.1.255)
colasoft
5. Conectarse mediante SSH al OPI. Por ejemplo con MobaXterm user: root / password: 1234
Puesta en marcha y configuracion Wifi de Orange PI Zero
6. Nos pide que cambiemos el password del usuario root. Lo hacemos.
7. Ahora nos pide crear un usuario para el trabajo diario. Lo hacemos.
8. Rebotamos y esperamos 1 minuto

> reboot

9. Actualizar el sistema (este paso puede tardar bastante y es opcional)

> sudo apt-get update
> sudo apt-get upgrade

10. Configurar wifi con nmtui

> nmtui

11. En el menu seleccionar “activate a connection”
tui activate connection
12. Elegimos el SSID (el nombre de tu wifi) que nos interese
13. Introducimos la contraseña
14. Editamos la conexión para que la IP asignada al OPI sea siempre fija y así no tener que averiguar la IP asignada cada vez que necesitemos conectarnos por terminal al OPI.
Puesta en marcha y configuracion Wifi de Orange PI Zero
15. Para activar el wifi al arranque, editar el archivo /etc/rc.local y añadir la línea ‘nmtui connect

> nano /etc/rc.local

16. Reiniciar (reboot) y retirar el cable de red. Al volver a encenderse, la OPI debería funcionar por wifi.