{"id":974,"date":"2019-07-07T21:31:32","date_gmt":"2019-07-07T19:31:32","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=974"},"modified":"2019-08-18T13:40:34","modified_gmt":"2019-08-18T11:40:34","slug":"5-6-exemple-practic-de-tractament-de-dades","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/5-6-exemple-practic-de-tractament-de-dades\/","title":{"rendered":"5.6. Exemple pr\u00e0ctic de tractament de dades"},"content":{"rendered":"<h2>Introducci\u00f3<\/h2>\n<p>Representar dades amb gr\u00e0fics \u00e9s tot un art. No \u00e9s un tema f\u00e0cil, de fet, el Grau lI dedica una assignatura sencera, per\u00f2 vegem un petit exemple de com, amb p5.js, podem fer gr\u00e0fics a partir de dades que recuperarem d\u2019un arxiu extern.<\/p>\n<p>En aquest exemple treballarem el cap\u00edtol 12 \u00abData\u00bb del llibre.<\/p>\n<p>Per a fer aquest exemple agafarem les dades d\u2019un repositori p\u00fablic, en aquest cas de l\u2019Ajuntament de Madrid. Hem escollit les dades d\u2019accidents de tr\u00e0fic on hi ha implicades bicicletes. Aquestes dades estan disponibles en aquest enlla\u00e7:<\/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>Descarreguem l\u2019arxiu de l\u2019any que vulguem, per\u00f2 la versi\u00f3 CSV. Per a preparar aquest exemple hem agafat les dades de 2018, per\u00f2 per la data en qu\u00e8 hem descarregat les dades (finals de desembre de 2018) nom\u00e9s hi ha dades fins al novembre.<\/p>\n<p>Per qu\u00e8 cal agafar l\u2019arxiu <em>csv<\/em>? Doncs perqu\u00e8 \u00e9s el tipus d\u2019arxiu que p5.js pot obrir per a recuperar les dades (p\u00e0gina 182 del llibre).<\/p>\n<div class=\"featured featured-grey\"><\/p>\n<p><strong>Problema<\/strong><\/p>\n<p>Aquest arxiu, tot i que \u00e9s <em>csv<\/em> i els programes de full de c\u00e0lcul l\u2019obriran sense problemes, no fa servir com a separador cap de les dues opcions que ens permet <a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/loadTable\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">loadTable()<\/span><\/a> que s\u00f3n comes o tabuladors. Aquest <em>csv<\/em> fa servir com a separadors punts i comes, que \u00e9s el format que es fa servir all\u00e0 on fem servir la coma com a separador de decimals (m\u00e9s explicacions a la <a href=\"https:\/\/ca.wikipedia.org\/wiki\/CSV\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">Viquip\u00e8dia: CSV<\/span><\/a>). Com que els punts i coma no estan suportats per <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>, el primer que toca fer \u00e9s substituir tots els punts i coma per comes. Aix\u00f2 ho podem fer f\u00e0cilment amb el nostre editor habitual. <strong>Compte<\/strong>! Si tenim nombres amb decimals, la millor opci\u00f3 ser\u00e0 canviar els punt i comes per tabuladors. A m\u00e9s, caldr\u00e0 tenir en compte el fet que p5.js fa servir el punt com a separador de decimals (per\u00f2 aix\u00f2 es podr\u00e0 arreglar un cop recuperades les dades).<\/p>\n<p>\n<\/div>\n<p>B\u00e9, ja tenim l\u2019arxiu <em>csv<\/em> com li agrada a <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>. El podeu descarregar 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>Per a poder treballar amb les dades, primer hem de saber quines dades tenim i, sobretot, com estan organitzades! Descarregueu-vos l\u2019arxiu <em>csv<\/em> de la web de l\u2019Ajuntament i obriu-lo amb el vostre programa de full de c\u00e0lcul preferit. Se\u2019ns obrir\u00e0 un arxiu amb aquest aspecte:<\/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>Veiem que tenim una primera fila d\u2019encap\u00e7alament. Aix\u00f2 \u00e9s important perqu\u00e8 aquesta informaci\u00f3 tamb\u00e9 l\u2019haurem de fer saber a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>.<\/p>\n<p>Despr\u00e9s de l\u2019encap\u00e7alament cada fila \u00e9s un accident. I de cada accident tenim un munt de dades: data, hora aproximada, dia de la setmana, districte, etc. A la pr\u00e0ctica, per a l\u2019exercici que farem, de totes les dades nom\u00e9s farem servir la columna \u00abDIA SEMANA\u00bb. I una sola dada ja ens dona per fer una visualitzaci\u00f3!<\/p>\n<p>El pas seg\u00fcent ja \u00e9s fer el programa que mostri les gr\u00e0fiques representatives d\u2019aquestes dades. Per a simplificar-ho, farem un gr\u00e0fic de barres on les barres representaran el nombre d\u2019accidents amb bicicletes implicades, per dia de la setmana. El resultat amb aquestes dades ser\u00e0 aquest:<\/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>\u00c9s molt senzill per\u00f2 el que ens interessa \u00e9s veure com recuperem i treballem les dades.<\/p>\n<p>Primer pas, recuperar les dades.<\/p>\n<pre>var bicis;\r\n\r\nfunction preload() {\r\n bicis = loadTable(\"datos\/AccidentesBicicletas_2018.csv\", \"header\");\r\n}<\/pre>\n<p>Per a recuperar les dades, necessitem:<\/p>\n<ul>\n<li>Crear una variable que farem servir per a guardar les dades. M\u00e9s endavant veurem com treballem amb aquesta variable.<\/li>\n<li>Crear una funci\u00f3 <a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/preload\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">preload()<\/span><\/a> que aturar\u00e0 el nostre programa fins que no tinguem carregades totes les dades (millor no intentar fer res sense tenir totes les dades).<\/li>\n<li>Dins de la funci\u00f3 <span style=\"font-family: Courier, Arial;\">preload()<\/span> cridem a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">loadTable()<\/span>. Li indiquem que, com hem vist, la taula t\u00e9 una cap\u00e7alera.<\/li>\n<\/ul>\n<p>Igual que ens passava quan carreg\u00e0vem les imatges, aquests programes no els podrem executar en local, caldr\u00e0 que estiguin a un servidor.<\/p>\n<p>El pas seg\u00fcent ser\u00e0 treballar les dades. Com? Doncs comptarem, per a cada dia de la setmana, quants accidents hi ha hagut. Vegem el programa com va (creix for\u00e7a per\u00f2 no us espanteu, no \u00e9s gens complicat). De moment, encara no posem la funci\u00f3 <span style=\"font-family: Courier, Arial;\">draw()<\/span> perqu\u00e8 nom\u00e9s estem recuperant i preparant les dades.<\/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>Com veiem, la gr\u00e0cia est\u00e0 a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">preparacion()<\/span> que agafa les dades que hem carregat i calcula quants accidents hi ha hagut cada dia de la setmana.<\/p>\n<p>Anem a poc a poc. Primer de tot, necessitem un <em>array<\/em> per a guardar el nombre d\u2019accidents de cada dia de la setmana. A aquest array li hem dit <span style=\"font-family: Courier, Arial;\">diasSemana<\/span>. Tamb\u00e9 hem declarat una variable <span style=\"font-family: Courier, Arial;\">maximo<\/span> on guardarem el valor m\u00e9s gran (el nombre d\u2019accidents del dia que hi ha hagut m\u00e9s accidents). Ho farem servir a l\u2019hora de dibuixar la gr\u00e0fica al <em>canvas<\/em>.<\/p>\n<p>Vegem qu\u00e8 fa la funci\u00f3 <span style=\"font-family: Courier, Arial;\">preparacion()<\/span>. El primer que fa \u00e9s aix\u00f2:<\/p>\n<pre>for (var i = 0; i &lt; 7; i++) {\r\n diasSemana[i]=0;\r\n}<\/pre>\n<p>Posa les 7 posicions de l<em>\u2019array<\/em> que farem servir (del 0 al 6) a 0.<\/p>\n<div class=\"featured featured-blue\"><p><strong>I \u00e9s molt important!<\/strong> Si no ho fem, el nostre programa no funcionar\u00e0.<\/p>\n<\/div>\n<p>El pas seg\u00fcent \u00e9s revisar totes les dades que hi ha a l\u2019arxiu csv. Per a aix\u00f2, farem servir una instrucci\u00f3 <span style=\"font-family: Courier, Arial;\">for<\/span> d\u2019aquesta manera:<\/p>\n<pre>for (var i = 0; i &lt; bicis.getRowCount(); i++){<\/pre>\n<p>Utilitzem una funci\u00f3 <span style=\"font-family: Courier, Arial;\">bicis.getRowCount()<\/span> que ens diu quantes dades podem trobar a la variable <span style=\"font-family: Courier, Arial;\">bicis<\/span>.<\/p>\n<p>El pas seg\u00fcent \u00e9s extreure, de cada fila, el dia de la setmana:<\/p>\n<pre>dia = bicis.getString(i,\"DIA SEMANA\");<\/pre>\n<p>Repassem una mica. El <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> ens ajudar\u00e0 a rec\u00f3rrer, una a una, totes les fileres de l\u2019arxiu. Per a cada accident (recordeu, un per fila) necessitem saber el dia de la setmana en qu\u00e8 ha passat. La funci\u00f3 <span style=\"font-family: Courier, Arial;\">bicis.getString(<em>i<\/em>,\u201dDIA SEMANA\u201d)<\/span> agafa, de la variable <span style=\"font-family: Courier, Arial;\">bicis <\/span>(que recordeu \u00e9s on hem guardat totes les dades de l\u2019arxiu), la dada que hi ha a la fila <em>i<\/em>, columna <em>DIA SEMANA<\/em>.<\/p>\n<p>El pas seg\u00fcent \u00e9s sumar 1 al comptador d\u2019aquest dia de la setmana. Aix\u00f2 ho fem amb la instrucci\u00f3 seg\u00fcent, 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>Aix\u00ed, si el dia \u00e9s \u00abLUNES\u00bb sumen 1 a <span style=\"font-family: Courier, Arial;\">diasSemana[0]<\/span>. I si \u00e9s diumenge li sumarem 1 a <span style=\"font-family: Courier, Arial;\">diasSemana[6]<\/span>.<\/p>\n<p>Finalment, calculem quin \u00e9s el nombre m\u00e9s gran d\u2019accidents que hi ha hagut en un dia determinat de la setmana (com hem dit, farem servir aquesta dada per a dibuixar millor la gr\u00e0fica).<\/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>Ara ja tenim les dades que volem representar. Nom\u00e9s cal representar-les. I dibuixar-ho \u00e9s cosa de la funci\u00f3 <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>El que fem \u00e9s, per a cada dia de la setmana, dibuixar un rectangle. El <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> ens serveix per a pintar els 7 dies. I el dibuix es fa amb una funci\u00f3 <span style=\"font-family: Courier, Arial;\">rect()<\/span>.<\/p>\n<p>Dibuixar les barres \u00e9s una mica complicat, aix\u00ed que anirem veient tots els par\u00e0metres de la funci\u00f3 <span style=\"font-family: Courier, Arial;\">rect()<\/span> un a un. Primer, per\u00f2, recordem com \u00e9s la funci\u00f3 <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>Recordem que comencem a pintar els rectangles a partir del seu v\u00e8rtex superior esquerre. B\u00e9, veiem ara els diferents par\u00e0metres. L\u2019<strong>x<\/strong>:<\/p>\n<pre>40+(i*60)<\/pre>\n<p>El que estem fent, \u00e9s que la primera barra la posarem a 40 p\u00edxels de l\u2019esquerra del <em>canvas<\/em>. La segona 60 p\u00edxels m\u00e9s enll\u00e0 i, aix\u00ed, successivament. Com que les barres les farem de 40 p\u00edxels, tindrem una separaci\u00f3 de 20 p\u00edxels entre barra i barra.<\/p>\n<p>Ara l\u2019<strong>y<\/strong>.<\/p>\n<pre>210-map(diasSemana[i],0,maximo,0,200)<\/pre>\n<p>Aix\u00f2 \u00e9s m\u00e9s complicat. Les barres comen\u00e7aran (visualment) als 210 p\u00edxels. I tindran una al\u00e7ada m\u00e0xima de 200 p\u00edxels. Primer el que hem de fer \u00e9s convertir el nombre d\u2019accidents, que estar\u00e0 entre 0 i <span style=\"font-family: Courier, Arial;\">maximo<\/span> (recordeu d\u2019on ve aquest valor?) a un valor entre 0 i 200. Aix\u00f2 ho fem amb la funci\u00f3 <a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/map\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">map()<\/span><\/a> que ja hem treballat. Amb la funci\u00f3 <span style=\"font-family: Courier, Arial;\">map()<\/span> tenim l\u2019al\u00e7ada que tindr\u00e0 la barra. Per a decidir a quina posici\u00f3 <strong>y<\/strong> cal comen\u00e7ar, restem a la posici\u00f3 final (210) l\u2019al\u00e7ada de la barra. I ja sabem on hem de comen\u00e7ar a pintar.<\/p>\n<p>Ara ens falta determinar l\u2019amplada:<\/p>\n<pre>40<\/pre>\n<p>i l\u2019al\u00e7ada<\/p>\n<pre>map(diasSemana[i],0,maximo,0,200)<\/pre>\n<p>que ja hem fet servir abans. El programa queda aix\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>I el podeu provar en l&#8217;adre\u00e7a <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>Fins aqu\u00ed, hem vist com recuperar les dades i despr\u00e9s treballar amb aquestes.<\/p>\n<p>Per\u00f2 la veritat \u00e9s que manca informaci\u00f3. Ens aniria b\u00e9, almenys, indicar els dies de la setmana que \u00e9s cada barra i el nombre real d\u2019accidents.<\/p>\n<p>Ho farem reduint la mida de les barres (a 100 p\u00edxels) i, quan el cursor passi per sobre d\u2019una barra, pintant-la de color vermell i escrivint el dia de la setmana i el nombre d\u2019accidents a sobre, com es pot veure en aquesta 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>Els canvis que hem de fer afecten les funcions <span style=\"font-family: Courier, Arial;\">setup()<\/span> i <span style=\"font-family: Courier, Arial;\">draw()<\/span>. A m\u00e9s, he afegit una nova 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 nova variable \u00e9s un<em> array<\/em> on hem guardat els dies de la setmana.<\/p>\n<p>A la funci\u00f3 <span style=\"font-family: Courier, Arial;\">setup()<\/span> hem afegit la font i la mida del text que escriurem:<\/p>\n<pre>textFont(\"Arial\");\r\ntextSize(24);<\/pre>\n<p>I a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">draw()<\/span> aix\u00f2:<\/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>Per a cada barra preguntem si el ratol\u00ed est\u00e0 a sobre (per a simplificar-ho, fem com si les barres arribessin fins a dalt de tot). Si \u00e9s aix\u00ed, tornem a dibuixar la barra per\u00f2 de color vermell (funcions <span style=\"font-family: Courier, Arial;\">fill()<\/span> i <span style=\"font-family: Courier, Arial;\">rect()<\/span>) i escrivim el text amb la funci\u00f3 <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> escriur\u00e0 el nom del dia de la setmana de la barra sobre la qual est\u00e0 el ratol\u00ed i <span style=\"font-family: Courier, Arial;\">diasSemana[i]<\/span> el nombre d\u2019accidents que hi ha hagut aquest dia de la setmana.<\/p>\n<p>Podeu veure el resultat en l&#8217;adre\u00e7a <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\u00f3 Representar dades amb gr\u00e0fics \u00e9s tot un art. No \u00e9s un tema f\u00e0cil, de fet, el Grau lI dedica una assignatura sencera, per\u00f2 vegem un petit exemple de com, amb p5.js, podem fer gr\u00e0fics a partir de dades que recuperarem d\u2019un arxiu extern. En aquest exemple treballarem el cap\u00edtol 12 \u00abData\u00bb del llibre. Per [&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\/wp-json\/wp\/v2\/pages\/974"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/comments?post=974"}],"version-history":[{"count":17,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/974\/revisions"}],"predecessor-version":[{"id":4085,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/974\/revisions\/4085"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/media?parent=974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}