Advertisement
  1. Web Design
  2. ChartJS

Construye un dashboard dinámico con ChartJS

Scroll to top
Read Time: 17 min

() translation by (you can also view the original English article)

Hoy vamos a crear un dasboard dinámico con gráficos en tiempo real usando el poder de ChartJS. ChartJS es una poderosa biblioteca de JavaScript libre de dependencias que genera gráficos a través del elemento canvas. Lo mejor de todo es que es fácil para los diseñadores comenzar a usarla. Nos enfocaremos en las partes de la biblioteca que te ayudan a comenzar a crear gráficos hermosos y funcionales rápidamente. Vamos a construir un dashboard adecuado para dispositivos móviles de principio a fin.

¿Buscando una solución rápida?

Si estás buscando una solución rápida, hay una excelente colección de secuencias de comandos para tablas y gráficos en Envato Market. Comenzando con un precio de un par de dólares, estas colecciones son una manera rápida de colocar esta funcionalidad en tu sitio web o aplicación. "Chartli", una de nuestras favoritas, permite crear gráficos interactivos (¡que se ven preciosos!)


Comenzando

Vamos a construir nuestro dashboard sobre HTML5 Boilerplate. Descarga el archivo zip o clona el repositorio a través de Git. Vamos a asignar el nombre "chartjs_dashboard" a nuestro directorio de proyecto y a copiar todos los archivos directamente ahí.

1
# On the command line

2
 git clone git@github.com:h5bp/html5-boilerplate.git chartjs_dashboard

A continuación vamos a obtener ChartJS. Ve a la versión no reducida en raw.github.com/nnnick/Chart.js/master/Chart.js y copia el contenido en tu archivo js/plugins.js. Tener la versión no reducida permitirá que los errores sean más legibles si te encuentras con ellos.

Consejo: en producción debes usar la versión reducida de JavaScript, de manera que el dashboard sea más eficiente.

La estructura de tu archivo deberá verse de esta forma:

1
├── 404.html   
2
 ├── crossdomain.xml   
3
 ├── css   
4
 │   ├── main.css   
5
 │   └── normalize.css   
6
 ├── favicon.ico   
7
 ├── img   
8
 ├── index.html   
9
 ├── js   
10
 │   ├── main.js   
11
 │   ├── plugins.js   
12
 │   └── vendor   
13
 │       ├── jquery-1.10.1.min.js   
14
 │       └── modernizr-2.6.2.min.js   
15
 └── robots.txt

Nota: esto no incluye algunos de los archivos integrados en H5BP que no usaremos.


Paleta de color

Antes de comenzar a codificar el sitio, comencemos configurando una paleta de color que usaremos a lo largo del diseño. Al hacer esto podemos establecer una futura "guía de estilo"; ésta es una práctica común para básicamente cualquier diseño.

Si estás construyendo el dashboard teniendo una marca particular en mente, comienza usando los colores de dicha marca. Hoy vamos a definir dos colores principales y dos colores auxiliares. También usaremos sombras o versiones desvanecidas de estos colores.

  • azul oscuro: #637b85
  • verde: #2c9c69
  • amarillo: #dbba34
  • rojo: #c62f29

También usaremos un tono más claro del azul oscuro, #d0dde3. Por último utilizaremos colores en escala de grises.


Fundamentos de ChartJS

ChartJS usa el elemento canvas. El elemento canvas proporciona una interfaz única para JavaScript que permite dibujar píxeles en un área rectangular determinada. A menudo se compara con SVG, que ofrece una solución basada en nodos de DOM para crear gráficos vectoriales en el navegador. Sin embargo, los píxeles dibujados en el elemento canvas no se mantienen en memoria y por lo tanto no responden a los eventos de JavaScript.

Pero basta ya de la charla sobre tecnología, ¿cómo podemos comenzar rápidamente con ChartJS?

Afortunadamente, la página principal de ChartJS tiene muchos ejemplos para que podamos iniciar rápidamente. El patrón básico es crear el elemento canvas en HTML, seleccionarlo con JavaScript y crear el gráfico mientras le enviamos los datos necesarios para construirlo.

1
<canvas id="something"></canvas>
2
 <script>
3
 var canvas = document.getElementById("something");
4
 var ctx = canvas.getContext("2d");
5
 new Chart(ctx).Line(data, options);
6
 </script>

El ejemplo anterior asumiría que ya has definido 'data' y 'options' como objetos, y produciría un gráfico de línea en consecuencia.

En nuestro ejemplo, usaremos el gráfico de dona, el gráfico de línea y el gráfico de radar. Estos gráficos representarían diferentes métricas orientadas a negocios, pero desde luego puedes tomar esto y adaptarlo a tus necesidades.

Marcado de página

Vamos a comenzar definiendo un poco de HTML básico para el diseño de nuestra página.

1
<div class="wrapper">
2
 <header>
3
   <div class="container clearfix">
4
         <h1>Overview <span>July 8-12, 2013</span><a class="button">Change Date Range</a></h1>
5
     </div>
6
 </header>
7
 <div class="container clearfix">
8
     <div class="third widget doughnut">
9
         <h3>Breakdown of Hours</h3>
10
         <div class="canvas-container">
11
             <canvas id="hours"></canvas>
12
         </div>
13
     </div>
14
     <div class="third widget line">
15
         <div class="chart-legend">
16
             <h3>Shipments per Day</h3>
17
         </div>
18
         <div class="canvas-container">
19
             <canvas id="shipments"></canvas>
20
         </div>
21
     </div>
22
     <div class="third widget">
23
         <div class="chart-legend">
24
             <h3>Customer Service Assessment</h3>
25
         </div>
26
         <div class="canvas-container">
27
             <canvas id="departments"></canvas>
28
         </div>
29
     </div>
30
 </div>
31
 <div class="push"></div>
32
 </div>
33
 <footer>
34
 </footer>

Aquí podemos ver que tenemos un encabezado básico, una sección media y un pie de página. Estamos usando las clases .wrapper y .push para crear un pie de página fijo (consulta aquí para obtener más información). Vamos a crear nuestro diseño para que se ajuste a los dispositivos móviles primero y luego escalarlo a partir de ese punto. Existen algunos trucos que usaremos en el proceso, pero esta estructura hará mucho del trabajo por nosotros.


Antes de ir demasiado lejos...

Toma en cuenta que canvas no funciona muy bien con consultas de medios. En este tutorial usaremos una solución para permitir que los gráficos sean dibujados de nuevo usando diferentes tamaños en JavaScript.

Dentro de nuestro archivo main.js necesitaremos tener una función para cambiar tamaños que sea desencadenada cuando el tamaño de la ventana cambie. También necesitaremos una función para "redibujar" que sea invocada después de que la función para cambiar de tamaño se ejecute. Finalmente, al redibujar los gráficos no queremos que sean animados, como si ésta fuera la primera vez que han sido dibujados.

1
(function(){
2
 // set up the timeout variable

3
 var t;
4
 // setup the sizing function,

5
 // with an argument that tells the chart to animate or not

6
 function size(animate){
7
     // If we are resizing, we don't want the charts drawing on every resize event.

8
     // This clears the timeout so that we only run the sizing function

9
     // when we are done resizing the window

10
     clearTimeout(t);
11
     // This will reset the timeout right after clearing it.

12
     t = setTimeout(function(){
13
         $("canvas").each(function(i,el){
14
             // Set the canvas element's height and width to it's parent's height and width.

15
             // The parent element is the div.canvas-container

16
             $(el).attr({
17
                 "width":$(el).parent().width(),
18
                 "height":$(el).parent().outerHeight()
19
             });
20
         });
21
         // kickoff the redraw function, which builds all of the charts.

22
         redraw(animate);
23
 
24
         // loop through the widgets and find the tallest one, and set all of them to that height.

25
         var m = 0;
26
         // we have to remove any inline height setting first so that we get the automatic height.

27
         $(".widget").height("");
28
         $(".widget").each(function(i,el){ m = Math.max(m,$(el).height()); });
29
         $(".widget").height(m);
30
 
31
     }, 100); // the timeout should run after 100 milliseconds

32
 }
33
 $(window).on('resize', size);
34
 function redraw(animation){
35
     var options = {};
36
     if (!animation){
37
         options.animation = false;
38
     } else {
39
         options.animation = true;
40
     }
41
     // ....

42
         // the rest of our chart drawing will happen here

43
     // ....

44
 }
45
 size(); // this kicks off the first drawing; note that the first call to size will animate the charts in.

Si esto te parece un poco desalentador, ¡no te preocupes! ¡haz una pregunta en los comentarios y nosotros, así como la comunidad de Tuts+, te ayudaremos a comprenderlo totalmente!


Un poco de CSS para comenzar

Queremos configurar algunas estructuras CSS básicas para iniciar. Desde luego HTML5 Boilerplate incluye normalize y algunos otros valores predeterminados que puedes cambiar, pero para este tutorial escribiremos nuestro CSS después de la línea "Author's custom styles" ("Estilos personalizados del autor").

1
html, body {
2
     height: 100%;
3
 }
4
 body {
5
     font-family: 'Source Sans Pro', sans-serif;
6
     color: #666;
7
 }
8
 /* button */
9
 .button {
10
     cursor: pointer;
11
     text-decoration: none;
12
     font-size: 0.6em;
13
     font-weight: 400;
14
     text-transform: uppercase;
15
     display: inline-block;
16
     padding: 4px 6px;
17
     margin: 0 10px;
18
     position: relative;
19
     background: #ccc;
20
     color: #fff;
21
     box-shadow: 0 0 2px rgba(0,0,0,0.1);
22
     background: rgb(190,190,190); /* Old browsers */
23
     background: -moz-linear-gradient(top, rgba(190,190,190,1) 0%, rgba(170,170,170,1) 100%); /* FF3.6+ */
24
     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(190,190,190,1)), color-stop(100%,rgba(170,170,170,1))); /* Chrome,Safari4+ */
25
     background: -webkit-linear-gradient(top, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* Chrome10+,Safari5.1+ */
26
     background: -o-linear-gradient(top, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* Opera 11.10+ */
27
     background: -ms-linear-gradient(top, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* IE10+ */
28
     background: linear-gradient(to bottom, rgba(190,190,190,1) 0%,rgba(170,170,170,1) 100%); /* W3C */
29
     filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bebebe', endColorstr='#aaaaaa',GradientType=0 ); /* IE6-9 */
30
 }
31
 .button:hover {
32
     background: #637b85;
33
 }
34
 /* Header styles */
35
 header {
36
     text-align: center;
37
     background: #637b85;
38
     color: #fff;
39
     margin-bottom: 40px;
40
 }
41
 header span {
42
     font-weight: 200;
43
 }
44
 header .button {
45
     font-size: 0.2em;
46
     top: -6px;
47
 }
48
 
49
 /* various containers */
50
 .container {
51
     width: 200px;
52
     margin: 0 auto;
53
 }
54
 .canvas-container {
55
     min-height: 300px;
56
     max-height: 600px;
57
     position: relative;
58
 }
59
 .widget {
60
     position: relative;
61
     margin-bottom: 80px;
62
     background: #efefef;
63
     padding: 12px;
64
     margin-bottom: 30px;
65
     -webkit-box-sizing: border-box;
66
     -moz-box-sizing: border-box;
67
     box-sizing: border-box;
68
 }

Aquí definimos el código CSS necesario para el pie de página fijo, así como una clase button, una clase contenedor con centrado automático, una clase que contenga nuestros elementos canvas dentro de nuestros widgets, además de nuestros widgets en sí. También necesitaremos agregar la fuente de Google que estamos definiendo para el cuerpo incluyéndola en nuestra etiqueta head.

1
<link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400,700' rel='stylesheet' type='text/css'>

El gráfico de dona

Los gráficos de dona son muy parecidos a los gráficos circulares, pero les falta una parte en el centro. De forma predeterminada, ChartJS define que 50% del área del gráfico debe quitarse; vamos a quedarnos con este valor predeterminado. El código para crear el gráfico de dona se muestra a continuación.

1
var data = [
2
     {
3
         value: 20,
4
         color:"#637b85"
5
     },
6
     {
7
         value : 30,
8
         color : "#2c9c69"
9
     },
10
     {
11
         value : 40,
12
         color : "#dbba34"
13
     },
14
     {
15
         value : 10,
16
         color : "#c62f29"
17
     }
18
 
19
 ];
20
 var canvas = document.getElementById("hours");
21
 var ctx = canvas.getContext("2d");
22
 new Chart(ctx).Doughnut(data);

Aquí puedes ver que hemos definido los datos y los colores de nuestro gráfico de dona. Esto es todo lo que se necesita para que el gráfico de dona funcione. Sin embargo, ¿qué representan cada una de las secciones? desafortunadamente ChartJS aún no tiene una manera sencilla de definir etiquetas para el gráfico de dona; sin embargo, podemos crear nuestras propias leyendas para describir cada una de las diferentes secciones. Modifica el html del widget del gráfico de dona para incluir lo siguiente.

1
<div class="third widget doughnut">
2
     <h3>Breakdown of Hours</h3>
3
     <p><a href="" class="button">Filter By Employee</a></p>
4
     <div class="canvas-container">
5
         <canvas id="hours"></canvas>
6
         <span class="status"></span>
7
     </div>
8
     <div class="chart-legend">
9
         <ul>
10
             <li class="ship">Shipping &amp; Receiving</li>
11
             <li class="rework">Rework</li>
12
             <li class="admin">Administrative</li>
13
             <li class="prod">Production</li>
14
         </ul>
15
     </div>
16
 </div>

Podemos usar estas etiquetas li en sus clases de forma muy sencilla en el CSS aprovechando la pseudoclase ':before'.

1
.chart-legend ul {
2
     list-style: none;
3
     width: 100%;
4
     margin: 30px auto 0;
5
 }
6
 .chart-legend li {
7
     text-indent: 16px;
8
     line-height: 24px;
9
     position: relative;
10
     font-weight: 200;
11
     display: block;
12
     float: left;
13
     width: 50%;
14
     font-size: 0.8em;
15
 }
16
 .chart-legend  li:before {
17
     display: block;
18
     width: 10px;
19
     height: 16px;
20
     position: absolute;
21
     left: 0;
22
     top: 3px;
23
     content: "";
24
 }
25
 .ship:before { background-color: #637b85; }
26
 .rework:before { background-color: #2c9c69; }
27
 .admin:before { background-color: #dbba34; }
28
 .prod:before { background-color: #c62f29; }

A continuación, queremos tener un bonito "pulgar arriba" en el centro de la dona. Esto involucra el uso de algunos trucos con CSS, incluyendo una versión de Uncle Dave's Ol' Padded Box para lograr que el círculo sea responsivo. Usaremos el span con la clase de .status para lograr este círculo. Agrega las siguientes reglas a main.css:

1
.widget.doughnut .status {
2
     display: block;
3
     position: absolute;
4
     top: 50%;
5
     left: 50%;
6
     width: 30%;
7
     height: 0;
8
     padding-top: 12%;
9
     padding-bottom: 18%;
10
     color: #444;
11
     margin-top: -15%;
12
     margin-left: -15%;
13
     font-size: 1.4em;
14
     font-weight: 700;
15
     text-align: center;
16
     border-radius: 50%;
17
     background-color: #aaa;
18
     background-image: url(data:image/png;base64,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);
19
     background-repeat: no-repeat;
20
     background-size: 30%;
21
     background-position: center;
22
 }

Tal vez el elemento más evidentemente destacado aquí es el uso de data URI para la imagen de fondo. Esto nos permite evitar una solicitud HTTP adicional, y sintácticamente es lo mismo que usar un url de http de verdad. También estamos configurando este elemento de manera que se posicione de forma absoluta dentro de su elemento .widget, que previamente configuramos para tener una posición relativa.

Ahora vamos a continuar y configurar la tipografía del widget. Solamente usamos elementos h3 y p dentro del widget; éste es el css que los acompaña.

1
.widget p {
2
     margin-top: 0;
3
     text-align: center;
4
 }
5
 .widget h3 {
6
     margin: -12px 0 12px -12px;
7
     padding: 12px;
8
     width: 100%;
9
     text-align: center;
10
     color: #627b86;
11
     line-height: 2em;
12
     background: #d0dde3;
13
 }

Las reglas de margen y relleno del elemento h3 permiten que dicho elemento se extienda hasta el borde del elemento widget por encima de la parte superior del relleno de 12px del mismo. También vamos a configurar el margen superior con un valor de 0 en el elemento p para que se ajuste mejor al encabezado del widget.


El gráfico de línea

Una de las características más útiles de ChartJS es que algunos de los gráficos permiten múltiples conjuntos de datos. Estos conjuntos de datos serán dibujados en el mismo gráfico secuencialmente, permitiendo que un conjunto de información pueda compararse con otro. Un ejemplo perfecto de cómo es que esto puede ser útil se encuentra en el gráfico de línea. Usaremos dos conjuntos de datos para explorar esta funcionalidad.

1
var data = {
2
     labels : ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],
3
     datasets : [
4
         {
5
             fillColor : "rgba(99,123,133,0.4)",
6
             strokeColor : "rgba(220,220,220,1)",
7
             pointColor : "rgba(220,220,220,1)",
8
             pointStrokeColor : "#fff",
9
             data : [65,54,30,81,56,55,40]
10
         },
11
         {
12
             fillColor : "rgba(219,186,52,0.4)",
13
             strokeColor : "rgba(220,220,220,1)",
14
             pointColor : "rgba(220,220,220,1)",
15
             pointStrokeColor : "#fff",
16
             data : [20,60,42,58,31,21,50]
17
         },
18
     ]
19
 }
20
 var canvas = document.getElementById("shipments");
21
 var ctx = canvas.getContext("2d");
22
 new Chart(ctx).Line(data, options);

Hay unas cuantas cosas que debemos notar en este código nuevo: primero, estamos reutilizando las variables que usamos para construir el gráfico de dona. Esto es totalmente válido en JavaScript, y en realidad reduce ligeramente la cantidad de memoria usada por la secuencia de comandos en general. Sin embargo esto puede causar confusión en el futuro y, si planeas adaptar este código para usarlo en producción, quizá sea más eficiente usar variables nuevas para cada nuevo gráfico que generes.

A continuación, el gráfico de línea es compatible con etiquetas. Esto es importante, ya que nos permite evitar la creación de leyendas usando HTML. Sin embargo también es importante que los puntos de los datos estén alineados con las etiquetas proporcionadas. En este ejemplo, nuestro primer punto de datos en el primer conjunto, 65, coincide con "Mon" en las etiquetas.

Finalmente, nuestros fillColors para estos conjuntos de datos son versiones RGBa de los colores que definimos anteriormente (azul oscuro y amarillo). Encontramos los valores RGB introduciendo los colores en el selector de colores de Photoshop, pero esto puede logarse usando cualquiera de entre varias herramientas para seleccionar colores.

También agregaremos el marcado para unos cuantos botones y un rango legible para los humanos. El código html para el widget lineal se ve de la siguiente manera.

1
<div class="third widget line">
2
     <div class="chart-legend">
3
         <h3>Shipments per Day</h3>
4
         <p><span>This Week</span> &mdash; <strong>Last Week</strong></p>
5
         <p><a href="" class="button">Change Date Range</a><a href="" class="button">Filter by Location</a></p>
6
     </div>
7
     <div class="canvas-container">
8
         <canvas id="shipments"></canvas>
9
     </div>
10
 </div>

Podemos mejorar el HTML adicional y ayudar a los usuarios a conectar las fechas con el siguiente CSS:

1
.widget.line p span {
2
     color: #dbba34;
3
 }
4
 .widget.line p strong {
5
     color: #637b85;
6
     font-weight: 400;
7
 }

Gráfico de radar

Los gráficos de tipo radar son útiles para destilar una selección de variables en un solo gráfico legible, con el fin de obtener una percepción general de la interacción entre las diferentes variables. Por ejemplo, en nuestro ejemplo exploraremos la idea del servicio al cliente en base al número de veces que han sido mencionadas ciertas palabras clave. En un gráfico de radar, los puntos trazados crearán una figura. Esa figura nos puede dar una idea general de la efectividad del servicio al cliente.

¡Veamos cómo podemos crear esto! Una vez más, vamos a reutilizar las variables que creamos anteriormente.

1
var data = {
2
     labels : ["Helpful","Friendly","Kind","Rude","Slow","Frustrating"],
3
     datasets : [
4
         {
5
             fillColor : "rgba(220,220,220,0.5)",
6
             strokeColor : "#637b85",
7
             pointColor : "#dbba34",
8
             pointStrokeColor : "#637b85",
9
             data : [65,59,90,81,30,56]
10
         }
11
     ]
12
 }
13
 var canvas = document.getElementById("departments");
14
 var ctx = canvas.getContext("2d");
15
 new Chart(ctx).Radar(data, options);

Y el HTML que lo acompaña se verá de la siguiente manera:

1
<div class="third widget">
2
     <div class="chart-legend">
3
         <h3>Customer Service Assessment</h3>
4
         <p>based on words mentioned</p>
5
         <p><a href="" class="button">Track another word</a></p>
6
     </div>
7
     <div class="canvas-container">
8
         <canvas id="departments"></canvas>
9
     </div>
10
 </div>

Intuitivamente podemos comprender que una figura que se encuentra más arriba y a la derecha será mejor que una figura localizada más abajo y a la izquierda. Sin embargo no perdemos los datos específicos disponibles para nosotros dentro del gráfico a un nivel granular de una sola variable. En este caso, la palabra "rude" ("ofensivo") se menciona a menudo, pero la sensación general del servicio al cliente parece positiva en base a otras palabras clave.


Haciéndolo todo responsivo

Ya hemos configurado nuestros elementos canvas para que sean responsivos con el código JavaScript que usamos para responder al cambio de tamaño de la ventana. Ahora necesitamos lograr que nuestro CSS sea responsivo usando consultas de medios. Éste es el css que usaremos para lograrlo.

1
@media only screen and (min-width:300px){
2
     .container {
3
         width: 300px;
4
         margin: 0 auto;
5
     }
6
 }
7
 
8
 @media only screen and (min-width:600px){
9
     .container {
10
         width: 580px;
11
         margin: 0 auto;
12
     }
13
     .third {
14
         float: left;
15
         width: 47.5%;
16
         margin-left: 5%;
17
     }
18
     .third:first-child {
19
         margin-left: 0;
20
     }
21
     .third:last-child {
22
         display: block;
23
         width: 100%;
24
         margin-left: 0;
25
     }
26
 }
27
 
28
 @media only screen and (min-width:960px){
29
     .container {
30
         width: 940px;
31
     }
32
     .third {
33
         float: left;
34
         width: 30%;
35
         margin-left: 2.5%;
36
         margin-right: 2.5%;
37
     }
38
     .third:first-child {
39
         margin-left: 0;
40
     }
41
     .third:last-child {
42
         margin-right: 0;
43
         margin-left: 2.5%;
44
         width: 30%;
45
     }
46
 }
47
 @media only screen and (min-width:1140px){
48
     .container {
49
         width: 1120px;
50
     }
51
 }
52
 @media only screen and (min-width:1360px){
53
     .container {
54
         width: 1300px;
55
     }
56
 }

Lo primero que debemos notar acerca de este CSS es que todas las consultas de medios se basan únicamente en el ancho mínimo. Esto significa que estamos diseñando a partir de las pantallas con menor anchura y agregando nuevas reglas a medida que nos movemos hacia valores más grandes. Nuestro diseño no requiere muchos cambios en cada punto de interrupción, pero este es un patrón de mejores prácticas en diseños para todas las escalas.

chartjs-smallchartjs-smallchartjs-small
chartjs-midchartjs-midchartjs-mid
chartjs-largechartjs-largechartjs-large

Podemos ver algunos cambios de diseño básicos en cada punto de interrupción, incluyendo el ancho del elemento contenedor primario así como la forma en la que tratamos a la clase .third, que usamos en cada uno de los widgets. Por debajo de 400 apilamos todos los widgets uno encima del otro. Con valores de entre 400 y 600, hacemos que los primeros dos widgets sean columnas con la mitad del ancho, y al tercer widget (el gráfico de radar) lo dejamos con su ancho completo. Finalmente, con valores por encima de 960 usamos tres columnas en línea.


Conclusión

Este tutorial te ha guiado a través de los pasos básicos para la creación de un dashboard usando ChartJS. Los conceptos fundamentales descritos aquí deberán ayudarte a crear proyectos más complicados usando ChartJS, y también deberán alentarte a pensar acerca del diseño responsivo desde la perspectiva de abajo a arriba.

¿Qué experiencia has tenido con las bibliotecas de generación de gráficos? ¿usas SVG o canvas para crear gráficos de datos? ¿qué cosas te gustarían que ChartJS hiciera que por ahora no hace? ¡Agrega tus comentarios abajo!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.