fbpixel
Etiquetas:

Puedes trazar curvas en tiempo real en una aplicación web utilizando Chart.js. Cuando creas una aplicación web, seguro que quieres mostrar datos. La librería Chart.js se integra en tu archivo html y scripts JavaScript y te permite trazar datos que pueden provenir de sensores, archivos o bases de datos.

Para probar la librería, puedes crear una aplicación web usando Flask.

Implementación de Chart.js

Para utilizar la biblioteca Chart.js en su archivo html, simplemente llame al script en la siguiente url

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

Chart.js es una librería Javascript para dibujar curvas interactivas en una página HTML. La implementación sigue siendo similar para todas las curvas.

  • Defina un elemento canvas en el cuerpo de su página con un identificador (por ejemplo, myChart)
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<body>
<div width="60%">
<h1>Chart.js</h1>
<canvas id="myChart"></canvas>
</div>
</body>
<body> <div width="60%"> <h1>Chart.js</h1> <canvas id="myChart"></canvas> </div> </body>
<body>	
	<div width="60%">
		<h1>Chart.js</h1>
		<canvas id="myChart"></canvas>
	</div>
</body>
  • Crear un script para recuperar este elemento
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<script>
const ctx = document.getElementById('myChart');
</script>
<script> const ctx = document.getElementById('myChart'); </script>
<script>	
  const ctx = document.getElementById('myChart');
</script>
  • Por último, en el mismo script, edita una función que especifique la curva a trazar

El tipo de diagrama se define mediante «type: ‘bar'», los nombres que aparecen en el eje se definen en la estructura data.labels (aquí, manzana, plátano, etc.) y, por último, las ordenadas se definen en la estructura data.datasets.data (aquí, 12, 19, etc.).

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Apple', 'Banana', 'Orange', 'Ananas', 'Kiwi', 'Pear'],
datasets: [{
label: '# of Fruits',
data: [12, 19, 3, 5, 2, 3],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
new Chart(ctx, { type: 'bar', data: { labels: ['Apple', 'Banana', 'Orange', 'Ananas', 'Kiwi', 'Pear'], datasets: [{ label: '# of Fruits', data: [12, 19, 3, 5, 2, 3], borderWidth: 1 }] }, options: { scales: { y: { beginAtZero: true } } } });
 new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ['Apple', 'Banana', 'Orange', 'Ananas', 'Kiwi', 'Pear'],
      datasets: [{
        label: '# of Fruits',
        data: [12, 19, 3, 5, 2, 3],
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });

Hay una serie de gráficos con los que puede jugar. Para utilizarlos, basta con sustituir la variable ‘tipo’ en la función Gráfico.

bar’, ‘line’, ‘doughnut’, ‘pie’, ‘polarArea’, ‘radar’, ‘bubble’, ‘scatter’.

N.B.: la burbuja y la dispersión utilizan datos numéricos e información adicional.

Dibujar un histograma

He aquí un ejemplo completo de cómo trazar un histograma,

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<head>
<title>HelloWorld</title>
<link rel="stylesheet" href='../static/style.css'/>
</head>
<body>
<div width="60%">
<h1>Chart.js</h1>
<canvas id="myChart"></canvas>
</div>
</body>
<script>
Chart.defaults.backgroundColor = '#9BD0F5';
Chart.defaults.borderColor = '#555555';
Chart.defaults.color = '#FFFFFF';
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Apple', 'Banana', 'Orange', 'Ananas', 'Kiwi', 'Pear'],
datasets: [{
label: '# of Fruits',
data: [12, 19, 3, 5, 2, 3],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</html>
<!DOCTYPE html> <html> <meta charset="UTF-8"> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <head> <title>HelloWorld</title> <link rel="stylesheet" href='../static/style.css'/> </head> <body> <div width="60%"> <h1>Chart.js</h1> <canvas id="myChart"></canvas> </div> </body> <script> Chart.defaults.backgroundColor = '#9BD0F5'; Chart.defaults.borderColor = '#555555'; Chart.defaults.color = '#FFFFFF'; const ctx = document.getElementById('myChart'); new Chart(ctx, { type: 'bar', data: { labels: ['Apple', 'Banana', 'Orange', 'Ananas', 'Kiwi', 'Pear'], datasets: [{ label: '# of Fruits', data: [12, 19, 3, 5, 2, 3], borderWidth: 1 }] }, options: { scales: { y: { beginAtZero: true } } } }); </script> </html>
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
	
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<head>
	<title>HelloWorld</title>
	<link rel="stylesheet" href='../static/style.css'/>
</head>

<body>	
	<div width="60%">
		<h1>Chart.js</h1>
		<canvas id="myChart"></canvas>
	</div>
</body>

<script>
	Chart.defaults.backgroundColor = '#9BD0F5';
	Chart.defaults.borderColor = '#555555';
	Chart.defaults.color = '#FFFFFF';	
	
  const ctx = document.getElementById('myChart');
  
  new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ['Apple', 'Banana', 'Orange', 'Ananas', 'Kiwi', 'Pear'],
      datasets: [{
        label: '# of Fruits',
        data: [12, 19, 3, 5, 2, 3],
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });
  
</script>
</html>
chartjs-histogram-exemple1 Dibuja curvas en tu Web App con Chart.js

Trazar una línea

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<body>
<div width="60%">
<canvas id="myLine"></canvas>
</div>
</body>
<script>
Chart.defaults.backgroundColor = '#9BD0F5';
Chart.defaults.borderColor = '#555555';
Chart.defaults.color = '#FFFFFF';
const cvs = document.getElementById('myLine');
const labels = [2018,2019,2020,2021,2022,2023]
const datas=[1560, 2310, 1700.20, 2500, 998, 100];
new Chart(cvs, {
type: 'line', //
data: {
labels: labels,
datasets: [{
label: '€ Expenses',
data: datas,
borderWidth: 1,
fill: false,
borderColor: 'rgb(255, 0, 0)',
backgroundColor: 'rgb(255, 0, 0)',
tension: 0.5
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
<body> <div width="60%"> <canvas id="myLine"></canvas> </div> </body> <script> Chart.defaults.backgroundColor = '#9BD0F5'; Chart.defaults.borderColor = '#555555'; Chart.defaults.color = '#FFFFFF'; const cvs = document.getElementById('myLine'); const labels = [2018,2019,2020,2021,2022,2023] const datas=[1560, 2310, 1700.20, 2500, 998, 100]; new Chart(cvs, { type: 'line', // data: { labels: labels, datasets: [{ label: '€ Expenses', data: datas, borderWidth: 1, fill: false, borderColor: 'rgb(255, 0, 0)', backgroundColor: 'rgb(255, 0, 0)', tension: 0.5 }] }, options: { scales: { y: { beginAtZero: true } } } }); </script>
<body>
        <div width="60%">
		<canvas id="myLine"></canvas>
	</div>
</body>
<script>
	Chart.defaults.backgroundColor = '#9BD0F5';
	Chart.defaults.borderColor = '#555555';
	Chart.defaults.color = '#FFFFFF';	
	
  const cvs = document.getElementById('myLine');
  const labels = [2018,2019,2020,2021,2022,2023]
  const datas=[1560, 2310, 1700.20, 2500, 998, 100];
  new Chart(cvs, {
    type: 'line', //
    data: {
      labels: labels,
      datasets: [{
        label: '€ Expenses',
        data: datas,
        borderWidth: 1,
		fill: false,
		borderColor: 'rgb(255, 0, 0)',
		backgroundColor: 'rgb(255, 0, 0)',
		tension: 0.5
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });
</script>

Con estos ejemplos, puedes hacer bastante para mostrar bellos gráficos en tus páginas web. Ahora voy a mostrarte dos funciones avanzadas que pueden resultarte útiles:

  • trazar desde archivo csv
  • realizar acciones al hacer clic en una parte del gráfico
chartjs-line-exemple Dibuja curvas en tu Web App con Chart.js

Bonificación: dibujar curvas a partir de un archivo CSV

Para importar un archivo cs, utilizamos la biblioteca d3

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<script src="https://d3js.org/d3.v7.min.js"></script>
<script src="https://d3js.org/d3.v7.min.js"></script>
<script src="https://d3js.org/d3.v7.min.js"></script>

Esta biblioteca nos permitirá importar los valores contenidos en el archivo inventory.csv en forma de tabla con los nombres de las columnas en la primera línea.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"category";"value"
"electronics";"200"
"mechanics";"100"
"microcomputer";"50"
"sensors";"132"
"category";"value" "electronics";"200" "mechanics";"100" "microcomputer";"50" "sensors";"132"
"category";"value"
"electronics";"200"
"mechanics";"100"
"microcomputer";"50"
"sensors";"132"

A continuación, en la función makeChart, podemos llamar a las variables utilizando data.map (categoría o valor)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var category = data.map(function(d) {return d.category;});
var value = data.map(function(d) {return d.value;});
var category = data.map(function(d) {return d.category;}); var value = data.map(function(d) {return d.value;});
      var category = data.map(function(d) {return d.category;});
      var value = data.map(function(d) {return d.value;});
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<script>
// CSV chart
d3.csv("./inventory.csv").then(makeChart);
function makeChart(data) {
var category = data.map(function(d) {return d.category;});
var value = data.map(function(d) {return d.value;});
var canvas=new Chart(document.getElementById("myCanvas"), {
type: 'bar', //'line', //'bar', //
data: {
labels: category,
datasets: [
{
label: "Category (units)",
backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"],
data: value
}
]
},
options: {
responsive: true,
scaleFontColor: "#FFFFFF",
legend: { display: false },
title: {
display: true,
text: 'Inventory 2023'
}
}
});
}
</script>
<script> // CSV chart d3.csv("./inventory.csv").then(makeChart); function makeChart(data) { var category = data.map(function(d) {return d.category;}); var value = data.map(function(d) {return d.value;}); var canvas=new Chart(document.getElementById("myCanvas"), { type: 'bar', //'line', //'bar', // data: { labels: category, datasets: [ { label: "Category (units)", backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], data: value } ] }, options: { responsive: true, scaleFontColor: "#FFFFFF", legend: { display: false }, title: { display: true, text: 'Inventory 2023' } } }); } </script>
<script>  
// CSV chart
d3.csv("./inventory.csv").then(makeChart);
 
 function makeChart(data) {
      var category = data.map(function(d) {return d.category;});
      var value = data.map(function(d) {return d.value;});
	var canvas=new Chart(document.getElementById("myCanvas"), {
          type: 'bar', //'line', //'bar', //
          data: {
            labels: category,
            datasets: [
              {
                label: "Category (units)",
                backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"],
                data: value
              }
            ]
          },
          options: {
			responsive: true,
			scaleFontColor: "#FFFFFF",
            legend: { display: false },
            title: {
              display: true,
              text: 'Inventory 2023'
            } 
          }
      });     
}
</script>

Bonificación: Realizar una acción en un evento de clic

Para poder ejecutar una función cuando se hace clic en una parte del gráfico, necesitamos definir una función listen. Esta función ya existe en Chart.js. Sólo necesitas saber dónde modificarlas.

En las opciones, vamos a cambiar la función que se ejecutará cuando se haga clic en el gráfico.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
options: {
events: ['mousemove', 'click'], //select event handled
onClick: (e) => {
const canvasPosition = Chart.helpers.getRelativePosition(e, canvas);
// Substitute the appropriate scale IDs
const dataX = canvas.scales.x.getValueForPixel(canvasPosition.x);
const dataY =canvas.scales.y.getValueForPixel(canvasPosition.y);
console.log(canvas.data.labels[dataX],' -> ',canvas.data.datasets[0].data[dataX]);
alert(canvas.data.labels[dataX] +' -> '+ canvas.data.datasets[0].data[dataX])
},
options: { events: ['mousemove', 'click'], //select event handled onClick: (e) => { const canvasPosition = Chart.helpers.getRelativePosition(e, canvas); // Substitute the appropriate scale IDs const dataX = canvas.scales.x.getValueForPixel(canvasPosition.x); const dataY =canvas.scales.y.getValueForPixel(canvasPosition.y); console.log(canvas.data.labels[dataX],' -> ',canvas.data.datasets[0].data[dataX]); alert(canvas.data.labels[dataX] +' -> '+ canvas.data.datasets[0].data[dataX]) },
options: {
		events: ['mousemove', 'click'], //select event handled
		onClick: (e) => {
            const canvasPosition = Chart.helpers.getRelativePosition(e, canvas);

            // Substitute the appropriate scale IDs
            const dataX = canvas.scales.x.getValueForPixel(canvasPosition.x);
            const dataY =canvas.scales.y.getValueForPixel(canvasPosition.y);
            console.log(canvas.data.labels[dataX],' -> ',canvas.data.datasets[0].data[dataX]);
            alert(canvas.data.labels[dataX] +' -> '+ canvas.data.datasets[0].data[dataX])       
        },

En este ejemplo, recuperaremos la etiqueta y el valor de la zona seleccionada y los mostraremos en una ventana de alerta.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<script>
// Bar chart
d3.csv("./static/file/inventory.csv").then(makeChart);
function makeChart(data) {
var category = data.map(function(d) {return d.category;});
var value = data.map(function(d) {return d.value;});
var canvas=new Chart(document.getElementById("myCanvas"), {
type: 'bar', //'line', //'bar', //
data: {
labels: category,
datasets: [
{
label: "Category (units)",
backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"],
data: value
}
]
},
options: {
events: ['mousemove', 'click'], //select event handled
onClick: (e) => {
const canvasPosition = Chart.helpers.getRelativePosition(e, canvas);
// Substitute the appropriate scale IDs
const dataX = canvas.scales.x.getValueForPixel(canvasPosition.x);
const dataY =canvas.scales.y.getValueForPixel(canvasPosition.y);
console.log(canvas.data.labels[dataX],' -> ',canvas.data.datasets[0].data[dataX]);
alert(canvas.data.labels[dataX] +' -> '+ canvas.data.datasets[0].data[dataX])
},
responsive: true,
scaleFontColor: "#FFFFFF",
legend: { display: false },
title: {
display: true,
text: 'Inventory 2023'
}
}
});
}
</script>
<script> // Bar chart d3.csv("./static/file/inventory.csv").then(makeChart); function makeChart(data) { var category = data.map(function(d) {return d.category;}); var value = data.map(function(d) {return d.value;}); var canvas=new Chart(document.getElementById("myCanvas"), { type: 'bar', //'line', //'bar', // data: { labels: category, datasets: [ { label: "Category (units)", backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], data: value } ] }, options: { events: ['mousemove', 'click'], //select event handled onClick: (e) => { const canvasPosition = Chart.helpers.getRelativePosition(e, canvas); // Substitute the appropriate scale IDs const dataX = canvas.scales.x.getValueForPixel(canvasPosition.x); const dataY =canvas.scales.y.getValueForPixel(canvasPosition.y); console.log(canvas.data.labels[dataX],' -> ',canvas.data.datasets[0].data[dataX]); alert(canvas.data.labels[dataX] +' -> '+ canvas.data.datasets[0].data[dataX]) }, responsive: true, scaleFontColor: "#FFFFFF", legend: { display: false }, title: { display: true, text: 'Inventory 2023' } } }); } </script>
<script>  
// Bar chart
d3.csv("./static/file/inventory.csv").then(makeChart);
 
 function makeChart(data) {
      var category = data.map(function(d) {return d.category;});
      var value = data.map(function(d) {return d.value;});
	var canvas=new Chart(document.getElementById("myCanvas"), {
          type: 'bar', //'line', //'bar', //
          data: {
            labels: category,
            datasets: [
              {
                label: "Category (units)",
                backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"],
                data: value
              }
            ]
          },
          options: {
		events: ['mousemove', 'click'], //select event handled
		onClick: (e) => {
            const canvasPosition = Chart.helpers.getRelativePosition(e, canvas);

            // Substitute the appropriate scale IDs
            const dataX = canvas.scales.x.getValueForPixel(canvasPosition.x);
            const dataY =canvas.scales.y.getValueForPixel(canvasPosition.y);
            console.log(canvas.data.labels[dataX],' -> ',canvas.data.datasets[0].data[dataX]);
            alert(canvas.data.labels[dataX] +' -> '+ canvas.data.datasets[0].data[dataX])       
        },
			
			responsive: true,
			scaleFontColor: "#FFFFFF",
            legend: { display: false },
            title: {
              display: true,
              text: 'Inventory 2023'
            } 
          }
      });     
}
</script>
chartjs-click-event Dibuja curvas en tu Web App con Chart.js

Fuentes