{"id":2037,"date":"2019-07-10T20:12:59","date_gmt":"2019-07-10T18:12:59","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=2037"},"modified":"2019-08-18T13:40:15","modified_gmt":"2019-08-18T11:40:15","slug":"5-6-ejemplo-practico-de-tratamiento-de-datos","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/5-6-ejemplo-practico-de-tratamiento-de-datos\/","title":{"rendered":"5.6. Ejemplo pr\u00e1ctico de tratamiento de datos"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>Representar datos con gr\u00e1ficos es todo un arte. No es un tema f\u00e1cil, de hecho, al grado se le dedica una asignatura entera, pero vamos a ver un peque\u00f1o ejemplo de c\u00f3mo, con p5.js, podemos hacer gr\u00e1ficos a partir de unos datos que recuperaremos de un archivo externo.<\/p>\n<p>En este ejemplo trabajaremos el cap\u00edtulo 12 \u00abData\u00bb, del libro.<\/p>\n<p>Para hacer este ejemplo, cogeremos los datos de un repositorio p\u00fablico, en este caso del Ayuntamiento de Madrid. Hemos escogido los datos de accidentes de tr\u00e1fico donde hay implicadas bicicletas. Estos datos est\u00e1n disponibles en este enlace:<\/p>\n<p><a href=\"https:\/\/datos.madrid.es\/portal\/site\/egob\/menuitem.c05c1f754a33a9fbe4b2e4b284f1a5a0\/?vgnextoid=20f4a87ebb65b510VgnVCM1000001d4a900aRCRD&amp;vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&amp;vgnextfmt=default\" target=\"_blank\" rel=\"noopener\">https:\/\/datos.madrid.es\/portal\/site\/egob\/menuitem.c05c1f754a33a9fbe4b2e4b284f1a5a0\/?vgnextoid=20f4a87ebb65b510VgnVCM1000001d4a900aRCRD&amp;vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&amp;vgnextfmt=default<\/a><\/p>\n<p>Descargamos el archivo del a\u00f1o que queramos, pero la versi\u00f3n CSV. Para preparar este ejemplo se han cogido los datos de 2018, pero por la fecha en que hemos descargado los datos (finales de diciembre de 2018) solo est\u00e1n los datos hasta noviembre.<\/p>\n<p>\u00bfPor qu\u00e9 cogemos el archivo <em>csv<\/em>? Pues porque es el tipo de archivo que p5.js puede abrir para recuperar los datos (p\u00e1gina 182 del libro).<\/p>\n<div class=\"featured featured-grey\"><\/p>\n<p><strong>Problema<\/strong><\/p>\n<p>Este archivo, a pesar de que es <em>csv<\/em> y los programas de hoja de c\u00e1lculo lo abrir\u00e1n sin problemas, no usa como separador ninguna de las dos opciones que nos permite <a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/loadTable\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">loadTable()<\/span><\/a> que son comas o tabuladores. Este <em>csv<\/em> usa como separadores puntos y comas, que es el formato que se usa ah\u00ed donde usamos la coma como separador de decimales (m\u00e1s explicaciones en\u00a0la <a href=\"https:\/\/es.wikipedia.org\/wiki\/Valores_separados_por_comas\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">Wikipedia: CSV<\/span><\/a>). Como los puntos y coma no est\u00e1n soportados por <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>, lo primero que hay que hacer es sustituir todos los puntos y coma por comas. Esto lo podemos hacer f\u00e1cilmente con nuestro editor habitual. <strong>\u00a1Cuidado!<\/strong> Si tenemos n\u00fameros con decimales, la mejor opci\u00f3n ser\u00e1 cambiar los puntos y comas por tabuladores. Adem\u00e1s, habr\u00e1 que tener en cuenta el hecho de que p5.js usa el punto como separador de decimales (pero esto se podr\u00e1 arreglar una vez recuperados los datos).<\/p>\n<p>\n<\/div>\n<p>Bien, ya tenemos el archivo <em>csv<\/em> como le gusta a <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>. Lo pod\u00e9is descargar de aqu\u00ed: <a href=\"http:\/\/multimedia.uoc.edu\/carlos\/marques\/Dades\/datos\/AccidentesBicicletas_2018.csv\" target=\"_blank\" rel=\"noopener\">http:\/\/multimedia.uoc.edu\/carlos\/marques\/Dades\/datos\/AccidentesBicicletas_2018.csv<\/a><u>.<\/u><\/p>\n<p>Para poder trabajar con los datos, primero tenemos que saber qu\u00e9 datos tenemos y, sobre todo, \u00a1c\u00f3mo est\u00e1n organizados! Descargaos el archivo <em>csv<\/em> de la web del ayuntamiento y abridlo con vuestro programa de hoja de c\u00e1lculo preferida. Se nos abrir\u00e1 un archivo con este aspecto:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-968\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_005.jpg\" alt=\"\" width=\"1142\" height=\"253\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_005.jpg 1142w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_005-300x66.jpg 300w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_005-768x170.jpg 768w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_005-1024x227.jpg 1024w\" sizes=\"(max-width: 1142px) 100vw, 1142px\" \/><\/p>\n<p>Vemos que tenemos una primera fila de encabezamiento. Esto es importante porque esta informaci\u00f3n tambi\u00e9n la tendremos que llamar en la funci\u00f3n <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>.<\/p>\n<p>Despu\u00e9s del encabezamiento cada fila es un accidente. Y de cada accidente tenemos un mont\u00f3n de datos: fecha, hora aproximada, d\u00eda de la semana, distrito, etc. En la pr\u00e1ctica, por el ejercicio que haremos, de todos los datos solo usaremos la columna \u00abD\u00cdA SEMANA\u00bb. \u00a1Y un solo dato ya nos da para hacer una visualizaci\u00f3n!<\/p>\n<p>El siguiente paso ya es hacer el programa que muestre las gr\u00e1ficas representativas de estos datos. Para simplificar, haremos un gr\u00e1fico de barras donde las barras representar\u00e1n el n\u00famero de accidentes con bicicletas implicadas, por d\u00eda de la semana. El resultado con estos datos ser\u00e1 este:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-969\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_007.jpg\" alt=\"\" width=\"479\" height=\"242\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_007.jpg 479w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_007-300x152.jpg 300w\" sizes=\"(max-width: 479px) 100vw, 479px\" \/><\/p>\n<p>Es muy sencillo, pero lo que nos interesa es ver c\u00f3mo recuperamos y trabajamos los datos.<\/p>\n<p>Primer paso, recuperar los datos.<\/p>\n<pre>var bicis;\r\n\r\nfunction preload() {\r\n bicis = loadTable(\"datos\/AccidentesBicicletas_2018.csv\", \"header\");\r\n}<\/pre>\n<p>Para recuperar los datos necesitamos:<\/p>\n<ul>\n<li>Crear una variable que usaremos para guardar los datos. M\u00e1s adelante veremos c\u00f3mo trabajamos con esta variable.<\/li>\n<li>Crear una funci\u00f3n\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/preload\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">preload()<\/span><\/a> que parar\u00e1 nuestro programa hasta que no tengamos cargados todos los datos (mejor no intentar hacer nada sin tener todos los datos).<\/li>\n<li>Dentro de la funci\u00f3n <span style=\"font-family: Courier, Arial;\">preload()<\/span> llamamos a la funci\u00f3n <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>. Le indicamos que, como hemos visto, la tabla tiene cabecera.<\/li>\n<\/ul>\n<p>Igual que nos pasaba al cargar las im\u00e1genes, estos programas no los podremos ejecutar en local, har\u00e1 falta que est\u00e9n en un servidor.<\/p>\n<p>El siguiente paso ser\u00e1 trabajar los datos. \u00bfC\u00f3mo? Pues contaremos, para cada d\u00eda de la semana, cu\u00e1ntos accidentes ha habido. Vemos el programa c\u00f3mo va (crece bastante, pero no os asust\u00e9is, no es nada complicado). De momento no ponemos todav\u00eda la funci\u00f3n <span style=\"font-family: Courier, Arial;\">draw()<\/span> porque solo estamos recuperando y preparando los datos.<\/p>\n<pre>var bicis;\r\nvar dia;\r\nvar diasSemana = [];\r\nvar maximo = 0;\r\n\r\nfunction preload() {\r\n bicis = loadTable(\"datos\/AccidentesBicicletas_2018.csv\", \"header\");\r\n}\r\n\r\nfunction setup() {\r\n createCanvas(480, 240);\r\n noStroke();\r\n preparacion();\r\n}\r\n\r\nfunction preparacion(){\r\n for (var i = 0; i &lt; 7; i++) {\r\n  diasSemana[i]=0;\r\n}\r\nfor (var i = 0; i &lt; bicis.getRowCount(); i++){\r\n dia = bicis.getString(i,\"DIA SEMANA\");\r\n switch (dia) {\r\n\u00a0\u00a0 case \"LUNES\":\r\n\u00a0\u00a0  diasSemana[0]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"MARTES\":\r\n\u00a0\u00a0  diasSemana[1]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"MIERCOLES\":\r\n\u00a0   diasSemana[2]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"JUEVES\":\r\n\u00a0\u00a0  diasSemana[3]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"VIERNES\":\r\n\u00a0\u00a0  diasSemana[4]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"SABADO\":\r\n\u00a0\u00a0  diasSemana[5]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"DOMINGO\":\r\n\u00a0\u00a0  diasSemana[6]++;\r\n\u00a0\u00a0  break;\r\n }\r\n}\r\nfor (var i = 0; i &lt; 7; i++) {\r\n if (maximo &lt; diasSemana[i]) {\r\n\u00a0\u00a0maximo = diasSemana[i];\r\n  }\r\n }\r\n}<\/pre>\n<p>Como vemos, la gracia est\u00e1 en la funci\u00f3n <span style=\"font-family: Courier, Arial;\">preparacion()<\/span> que coge los datos que hemos cargado y calcula cu\u00e1ntos accidentes ha habido cada d\u00eda de la semana.<\/p>\n<p>Vamos poco a poco. Antes que nada, necesitamos un <em>array<\/em> para guardar el n\u00famero de accidentes de cada d\u00eda de la semana. A este <em>array<\/em> lo hemos llamado <span style=\"font-family: Courier, Arial;\">diasSemana<\/span>. Tambi\u00e9n hemos declarado una variable <span style=\"font-family: Courier, Arial;\">maximo<\/span> donde guardaremos el valor m\u00e1s grande (el n\u00famero de accidentes del d\u00eda que ha habido m\u00e1s accidentes). Lo usaremos a la hora de dibujar la gr\u00e1fica en el <em>canvas<\/em>.<\/p>\n<p>Vamos ahora a ver qu\u00e9 hace la funci\u00f3n <span style=\"font-family: Courier, Arial;\">preparacion()<\/span>. Lo primero que hace es esto:<\/p>\n<pre>for (var i = 0; i &lt; 7; i++) {\r\n diasSemana[i]=0;\r\n}<\/pre>\n<p>Pone las 7 posiciones del <em>array<\/em> que usaremos (del 0 al 6) a 0.<\/p>\n<div class=\"featured featured-blue\"><p><strong>\u00a1Y es muy importante!<\/strong> Si no lo hacemos, nuestro programa no funcionar\u00e1.<\/p>\n<\/div>\n<p>El siguiente paso es revisar todos los datos que hay en el archivo csv. Para lo cual usaremos una instrucci\u00f3n <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> de este modo:<\/p>\n<pre>for (var i = 0; i &lt; bicis.getRowCount(); i++){<\/pre>\n<p>Utilizamos una funci\u00f3n <span style=\"font-family: Courier, Arial;\">bicis.getRowCount()<\/span> que nos dice cu\u00e1ntos datos podemos encontrar en la variable <span style=\"font-family: Courier, Arial;\">bicis<\/span>.<\/p>\n<p>El siguiente paso es extraer, de cada fila, el d\u00eda de la semana:<\/p>\n<pre>dia = bicis.getString(i,\"DIA SEMANA\");<\/pre>\n<p>Repasemos un poco. El <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> nos ayudar\u00e1 a recorrer, una a una, todas las filas del archivo. Para cada accidente (recordad, uno por fila) necesitamos saber el d\u00eda de la semana en que ha pasado. La funci\u00f3n <span style=\"font-family: Courier, Arial;\">bicis.getString(<em>i<\/em>,\u201dDIA SEMANA\u201d)<\/span> coge, de la variable <span style=\"font-family: Courier, Arial;\">bicis <\/span>(que, recordad, es donde hemos guardado todos los datos del archivo), el dato que hay en la fila <em>i<\/em>, columna <em>DIA SEMANA<\/em>.<\/p>\n<p>El siguiente paso es sumar 1 al contador de este d\u00eda de la semana. Esto lo hacemos con la instrucci\u00f3n siguiente, el <span style=\"font-family: Courier, Arial;\">switch<\/span>:<\/p>\n<pre>switch (dia) {\r\n\u00a0\u00a0 case \"LUNES\":\r\n\u00a0\u00a0  diasSemana[0]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"MARTES\":\r\n    diasSemana[1]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"MIERCOLES\":\r\n\u00a0\u00a0  diasSemana[2]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"JUEVES\":\r\n\u00a0\u00a0  diasSemana[3]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"VIERNES\":\r\n\u00a0\u00a0  diasSemana[4]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"SABADO\":\r\n\u00a0\u00a0  diasSemana[5]++;\r\n\u00a0\u00a0  break;\r\n\u00a0\u00a0 case \"DOMINGO\":\r\n\u00a0\u00a0  diasSemana[6]++; \r\n\u00a0\u00a0  break;\r\n}<\/pre>\n<p>As\u00ed, si el d\u00eda es \u00abLUNES\u00bb sumamos 1 a <span style=\"font-family: Courier, Arial;\">diasSemana[0]<\/span>. Y si es domingo le sumaremos 1 a <span style=\"font-family: Courier, Arial;\">diasSemana[6]<\/span>.<\/p>\n<p>Al final, se calcula cu\u00e1l es el n\u00famero m\u00e1s grande de accidentes que ha habido en un d\u00eda determinado de la semana (como hemos dicho, usaremos este dato para dibujar mejor la gr\u00e1fica).<\/p>\n<pre>for (var i = 0; i &lt; 7; i++) {\r\n if (maximo &lt; diasSemana[i]) {\r\n\u00a0\u00a0 maximo = diasSemana[i];\r\n }\r\n}<\/pre>\n<p>Ahora ya tenemos los datos que queremos representar. Solo hay que representarlos. Y dibujar es cosa de la funci\u00f3n <span style=\"font-family: Courier, Arial;\">draw()<\/span>.<\/p>\n<pre>function draw() {\r\n background(100);\r\n fill(255);\r\n for (var i = 0; i &lt; 7; i++) {\r\n  rect(40+(i*60), 210-map(diasSemana[i],0,maximo,0,200), 40, map(diasSemana[i],0,maximo,0,200));\r\n\u00a0\u00a0 }\r\n}<\/pre>\n<p>Lo que hacemos es, para cada d\u00eda de la semana, dibujar un rect\u00e1ngulo. El <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> nos sirve para pintar los 7 d\u00edas. Y el dibujo se hace con una funci\u00f3n <span style=\"font-family: Courier, Arial;\">rect()<\/span>.<\/p>\n<p>Dibujar las barras es un poco complicado, as\u00ed que iremos viendo todos los par\u00e1metros de la funci\u00f3n <span style=\"font-family: Courier, Arial;\">rect()<\/span> uno a uno. Primero, sin embargo, recordemos c\u00f3mo es la funci\u00f3n\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/rect\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">rect()<\/span><\/a>:<\/p>\n<pre>rect(x, y, w, h)\r\nx\u00a0\u00a0\u00a0\u00a0 N\u00famero: coordenada x del rect\u00e1ngulo.\r\ny\u00a0\u00a0\u00a0\u00a0 N\u00famero: coordenada y del rect\u00e1ngulo.\r\nw\u00a0\u00a0\u00a0\u00a0 N\u00famero: ancho del rect\u00e1ngulo.\r\nh\u00a0\u00a0\u00a0\u00a0 N\u00famero: altura del rect\u00e1ngulo.<\/pre>\n<p>Recordemos que empezamos a pintar los rect\u00e1ngulos a partir de su v\u00e9rtice superior izquierdo. Bien, veamos ahora los diferentes par\u00e1metros. La <strong>x<\/strong>:<\/p>\n<pre>40+(i*60)<\/pre>\n<p>Lo que estamos haciendo es que la primera barra la pondremos a 40 p\u00edxeles de la izquierda del <em>canvas<\/em>. La segunda 60 p\u00edxeles m\u00e1s all\u00e1, y as\u00ed sucesivamente. Como las barras las haremos de 40 p\u00edxeles, tendremos una separaci\u00f3n de 20 p\u00edxeles entre barra y barra.<\/p>\n<p>Ahora la <strong>y<\/strong>.<\/p>\n<pre>210-map(diasSemana[i],0,maximo,0,200)<\/pre>\n<p>Esto es m\u00e1s complicado. Las barras empezar\u00e1n (visualmente) en los 210 p\u00edxeles. Y tendr\u00e1n una altura m\u00e1xima de 200 p\u00edxeles. Primero, lo que tenemos que hacer es convertir el n\u00famero de accidentes, que estar\u00e1 entre 0 y <span style=\"font-family: Courier, Arial;\">maximo<\/span> (\u00bfrecord\u00e1is de d\u00f3nde viene este valor?), en un valor entre 0 y 200. Esto lo hacemos con la funci\u00f3n\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/map\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">map()<\/span><\/a><span style=\"font-family: Courier, Arial;\">\u00a0<\/span>que ya hab\u00edamos trabajado. Con la funci\u00f3n <span style=\"font-family: Courier, Arial;\">map()<\/span> tenemos la altura que tendr\u00e1 la barra. Para decidir en qu\u00e9 posici\u00f3n <strong>y <\/strong>hay que empezar, restamos a la posici\u00f3n final (210) la altura de la barra. Y ya sabemos d\u00f3nde tenemos que empezar a pintar.<\/p>\n<p>Ahora nos falta determinar la anchura:<\/p>\n<pre>40<\/pre>\n<p>y la altura<\/p>\n<pre>map(diasSemana[i],0,maximo,0,200)<\/pre>\n<p>Que ya hab\u00edamos usado antes. El programa queda as\u00ed:<\/p>\n<pre>var bicis;\r\nvar dia;\r\nvar diasSemana = [];\r\nvar maximo = 0;\r\n\r\nfunction preload() {\r\n bicis = loadTable(\"datos\/AccidentesBicicletas_2018.csv\", \"header\");\r\n}\r\n\r\nfunction setup() {\r\n createCanvas(480, 240);\r\n noStroke();\r\n preparacion();\r\n}\r\n\r\nfunction draw() {\r\n background(100);\r\n fill(255);\r\n for (var i = 0; i &lt; 7; i++) {\r\n  rect(40+(i*60), 210-map(diasSemana[i],0,maximo,0,200), 40, map(diasSemana[i],0,maximo,0,200));\r\n   }\r\n}\r\n\r\nfunction preparacion(){\r\n for (var i = 0; i &lt; 7; i++) {\r\n  diasSemana[i]=0;\r\n}\r\nfor (var i = 0; i &lt; bicis.getRowCount(); i++){\r\n dia = bicis.getString(i,\"DIA SEMANA\");\r\n switch (dia) {\r\n  case \"LUNES\":\r\n   diasSemana[0]++;\r\n   break;\r\n  case \"MARTES\":\r\n   diasSemana[1]++;\r\n   break;\r\n  case \"MIERCOLES\":\r\n   diasSemana[2]++;\r\n   break;\r\n  case \"JUEVES\":\r\n   diasSemana[3]++;\r\n   break;\r\n  case \"VIERNES\":\r\n   diasSemana[4]++;\r\n   break;\r\n  case \"SABADO\":\r\n   diasSemana[5]++;\r\n   break;\r\n  case \"DOMINGO\":\r\n   diasSemana[6]++;\r\n   break;\r\n }\r\n}\r\nfor (var i = 0; i &lt; 7; i++) {\r\n if (maximo &lt; diasSemana[i]) {\r\n  maximo = diasSemana[i];\r\n  }\r\n }\r\n}<\/pre>\n<p>Y lo pod\u00e9is probar en esta direcci\u00f3n <a href=\"http:\/\/multimedia.uoc.edu\/carlos\/marques\/Dades\/index2.html\" target=\"_blank\" rel=\"noopener\">http:\/\/multimedia.uoc.edu\/carlos\/marques\/Dades\/index2.html<\/a><u>.<\/u><\/p>\n<p>Hasta aqu\u00ed hemos visto c\u00f3mo recuperar los datos y trabajar despu\u00e9s con ellos.<\/p>\n<p>Sin embargo, es verdad que falta informaci\u00f3n. Nos ir\u00eda bien al menos indicar los d\u00edas de la semana que es cada barra y el n\u00famero real de accidentes.<\/p>\n<p>Lo haremos reduciendo el tama\u00f1o de las barras (a 100 p\u00edxeles) y, cuando el cursor pase por encima de una barra, pint\u00e1ndola de color rojo y escribiendo el d\u00eda de la semana y el n\u00famero de accidentes encima, como se puede ver en esta captura:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-970\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_009.jpg\" alt=\"\" width=\"478\" height=\"240\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_009.jpg 478w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_009-300x151.jpg 300w\" sizes=\"(max-width: 478px) 100vw, 478px\" \/><\/p>\n<p>Los cambios que tenemos que hacer afectan a las funciones <span style=\"font-family: Courier, Arial;\">setup()<\/span> y <span style=\"font-family: Courier, Arial;\">draw()<\/span>. Adem\u00e1s, he a\u00f1adido una nueva variable:<\/p>\n<pre>var nombresDias = [\"Lunes\",\"Martes\",\"Mi\u00e9rcoles\",\"Jueves\",\"Viernes\",\"S\u00e1bado\",\"Domingo\"];\r\n\r\nfunction setup() {\r\n createCanvas(480, 240);\r\n noStroke();\r\n preparacion();\r\n textFont(\"Arial\");\r\n textSize(24); \r\n}\r\n\r\nfunction draw() {\r\n background(100);\r\n for (var i = 0; i &lt; 7; i++) {\r\n  fill(255);\r\n  rect(40+(i*60), 210-map(diasSemana[i],0,maximo,0,100), 40, map(diasSemana[i],0,maximo,0,100));\r\n  if ((mouseX &gt; 40+(i*60)) &amp;&amp; (mouseX &lt; 40+(i*60)+40)) {\r\n\u00a0\u00a0 fill(255,0,0);\r\n\u00a0\u00a0 rect(40+(i*60), 210-map(diasSemana[i],0,maximo,0,100), 40, map(diasSemana[i],0,maximo,0,100));\r\n\u00a0\u00a0 fill(\"#CECEF6\");\r\n\u00a0\u00a0 text(nombresDias[i] + \": \"+diasSemana[i]+\" accidentes.\", 40, 70);\r\n  }\r\n }\r\n}<\/pre>\n<p>La nueva variable es un <span style=\"font-family: Courier, Arial;\">array<\/span> donde hemos guardado los d\u00edas de la semana.<\/p>\n<p>En la funci\u00f3n <span style=\"font-family: Courier, Arial;\">setup()<\/span> hemos a\u00f1adido la fuente y el tama\u00f1o del texto que escribiremos:<\/p>\n<pre>textFont(\"Arial\");\r\ntextSize(24);<\/pre>\n<p>Y en la funci\u00f3n <span style=\"font-family: Courier, Arial;\">draw()<\/span> esto:<\/p>\n<pre>if ((mouseX &gt; 40+(i*60)) &amp;&amp; (mouseX &lt; 40+(i*60)+40)) {\r\n\u00a0\u00a0 fill(255,0,0);\r\n\u00a0\u00a0 rect(40+(i*60), 210-map(diasSemana[i],0,maximo,0,100), 40, map(diasSemana[i],0,maximo,0,100));\r\n\u00a0\u00a0 fill(\"#CECEF6\");\r\n\u00a0\u00a0 text(nombresDias[i] + \": \"+diasSemana[i]+\" accidentes.\", 40, 70);\r\n  }<\/pre>\n<p>Para cada barra preguntamos si el rat\u00f3n est\u00e1 encima (para simplificar, hacemos como si las barras llegaran hasta arriba de todo). Si es as\u00ed, volvemos a dibujar la barra pero en color rojo (funciones <span style=\"font-family: Courier, Arial;\">fill()<\/span> y <span style=\"font-family: Courier, Arial;\">rect()<\/span>) y escribimos el texto con la funci\u00f3n <span style=\"font-family: Courier, Arial;\">text()<\/span>.<\/p>\n<pre>text(nombresDias[i] + \": \"+diasSemana[i]+\" accidentes.\", 40, 70);<\/pre>\n<p><span style=\"font-family: Courier, Arial;\">nombresDias[i]<\/span> escribir\u00e1 el nombre del d\u00eda de la semana de la barra sobre la cual est\u00e1 el rat\u00f3n y <span style=\"font-family: Courier, Arial;\">diasSemana[i]<\/span> el n\u00famero de accidentes que ha habido este d\u00eda de la semana.<\/p>\n<p>Pod\u00e9is ver el resultado en esta direcci\u00f3n\u00a0<a href=\"http:\/\/multimedia.uoc.edu\/carlos\/marques\/Dades\/\" target=\"_blank\" rel=\"noopener\">http:\/\/multimedia.uoc.edu\/carlos\/marques\/Dades\/<\/a><u>.<\/u><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Representar datos con gr\u00e1ficos es todo un arte. No es un tema f\u00e1cil, de hecho, al grado se le dedica una asignatura entera, pero vamos a ver un peque\u00f1o ejemplo de c\u00f3mo, con p5.js, podemos hacer gr\u00e1ficos a partir de unos datos que recuperaremos de un archivo externo. En este ejemplo trabajaremos el cap\u00edtulo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false},"acf":[],"_links":{"self":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2037"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/comments?post=2037"}],"version-history":[{"count":23,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2037\/revisions"}],"predecessor-version":[{"id":4084,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2037\/revisions\/4084"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/media?parent=2037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}