{"id":452,"date":"2022-10-06T14:28:00","date_gmt":"2022-10-06T12:28:00","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=452"},"modified":"2022-11-18T15:18:29","modified_gmt":"2022-11-18T13:18:29","slug":"10-3-tablas","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/10-3-tablas\/","title":{"rendered":"10.3. Tablas"},"content":{"rendered":"<p>Muchos de los datos a los que podemos tener acceso los podemos encontrar en forma de tablas con filas y columnas. En P5 disponemos de un m\u00e9todo para leer los datos de tablas accediendo a sus celdas mediante coordenadas.<\/p>\n<figure id=\"attachment_288\" aria-describedby=\"caption-attachment-288\" style=\"width: 540px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-288\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_124.jpg\" alt=\"\" width=\"540\" height=\"205\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_124.jpg 540w, \/wp-content\/uploads\/2022\/10\/PID_00290094_124-300x114.jpg 300w\" sizes=\"(max-width: 540px) 100vw, 540px\" \/><figcaption id=\"caption-attachment-288\" class=\"wp-caption-text\">Figura 125. Coordenadas de las celdas de una tabla<br \/>Fuente: adaptaci\u00f3n de L. McCarthy; A. P. C. Reas; B. Fry (2015). Getting Started with P5.Js: Making Interactive Graphics in JavaScript and Processing. Make Community, LLC.<\/figcaption><\/figure>\n<p>Para cargar una tabla, normalmente lo haremos en un formato de texto plano conocido como .csv (<em>comma-separated values<\/em>), en el que los valores de cada fila est\u00e1n separados mediante comas. Desde cualquier editor de hojas de c\u00e1lculo podemos exportar los datos de una tabla en formato .csv.<\/p>\n<p>Tomemos como ejemplo los siguientes datos sobre los diez lagos m\u00e1s grandes del mundo:<\/p>\n<figure id=\"attachment_290\" aria-describedby=\"caption-attachment-290\" style=\"width: 450px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"wp-image-290\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_125.jpg\" alt=\"\" width=\"450\" height=\"306\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_125.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_125-300x204.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_125-768x522.jpg 768w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><figcaption id=\"caption-attachment-290\" class=\"wp-caption-text\">Figura 126. Datos en formato tabla<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Vemos que los datos que contiene la tabla son el nombre del lago, su superficie, su latitud y su longitud. Su equivalente en formato .csv, que podemos abrir en cualquier editor de texto, es el siguiente:<\/p>\n<figure id=\"attachment_292\" aria-describedby=\"caption-attachment-292\" style=\"width: 500px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"wp-image-292\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_126.jpg\" alt=\"\" width=\"500\" height=\"242\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_126.jpg 724w, \/wp-content\/uploads\/2022\/10\/PID_00290094_126-300x145.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><figcaption id=\"caption-attachment-292\" class=\"wp-caption-text\">Figura 127. Datos en formato .csv<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<h3>Leyendo una tabla<\/h3>\n<p>Este archivo .csv es el que podemos cargar en nuestro <em>sketch<\/em> de p5.js para acceder a sus datos y visualizarlos. Lo primero que debemos hacer, al igual que con cualquier archivo externo, es subirlo a la mediateca de CodeLab. Una vez hecho esto, usaremos el m\u00e9todo <span class=\"courier\">loadTable()<\/span> para cargar la tabla.<\/p>\n<pre>let tableData;\r\n\r\nfunction preload() {\r\n  tableData = loadTable(\"lakes.csv\", \"header\");\r\n}<\/pre>\n<p>Notemos que cargamos la tabla en <span class=\"courier\">preload()<\/span>, para evitar que tratemos de acceder a sus datos sin haberla descargado a\u00fan. Como primer par\u00e1metro de <span class=\"courier\">loadTable()<\/span> tenemos que pasarle el nombre del archivo que contiene la tabla y como segundo par\u00e1metro vamos a pasarle \u201cheader\u201d para indicarle que, en nuestro caso, la primera fila no son datos en s\u00ed sino que son los nombres de cada columna.<\/p>\n<p>Ahora ya podemos acceder a los datos de la tabla haciendo uso de sus coordenadas. Lo haremos mediante el m\u00e9todo <span class=\"courier\">get()<\/span>, al que le pasaremos las coordenadas de la celda que queramos consultar. Si queremos por ejemplo acceder al dato de la celda situada en la primera fila (recordemos que no tenemos en cuenta la primera fila con los nombres) y en la primera columna, necesitaremos la coordenada (0, 0).<\/p>\n<pre>let lakesData;\r\n\r\nfunction preload() {\r\n  lakesData = loadTable(\"lakes.csv\", \"header\");\r\n}\r\n\r\nfunction setup() {\r\n  createCanvas(800, 300);\r\n  \/\/ Primera fila, primera columna\r\n  console.log(lakesData.get(0, 0));\r\n  \/\/ Segunda fila, tercera columna\r\n  console.log(lakesData.getNum(1, 2));\r\n}<\/pre>\n<p>Cuando busquemos extraer datos num\u00e9ricos podemos usar <span class=\"courier\">getNum()<\/span> en lugar de <span class=\"courier\">get()<\/span> para asegurarnos de que el dato se almacene como n\u00famero y no como texto, lo que nos puede llevar a errores m\u00e1s adelante.<\/p>\n<p>Para leer toda la tabla de una vez y almacenar sus datos, podemos utilizar bucles y <em>arrays<\/em> con el fin de automatizar el proceso y tener los datos ordenados de manera m\u00e1s conveniente:<\/p>\n<pre>let lakesData;\r\nlet areas = [];\r\n\r\nfunction preload() {\r\n  lakesData = loadTable(\"lakes.csv\", \"header\");\r\n}\r\n\r\nfunction setup() {\r\n  createCanvas(800, 300);\r\n  for(let i = 0; i &lt; lakesData.getRowCount(); i++) {\r\n    areas[i] = lakesData.getNum(i, 2);\r\n  }\r\n}<\/pre>\n<p>En este caso, hemos almacenado en el <em>array <\/em><span class=\"courier\">areas<\/span> los datos de la superficie de cada lago, que est\u00e1n en la tercera columna. Podemos hacer lo mismo para el resto de los datos.<\/p>\n<h3>Visualizando la tabla<\/h3>\n<p>Ahora que ya hemos extra\u00eddo los datos, podemos usarlos para dibujar en nuestro <em>sketch<\/em>. Podr\u00edamos por ejemplo crear una clase <span class=\"courier\">Lake()<\/span> que se encargue de dibujarlos.<\/p>\n<pre>class Lake {\r\n\tconstructor(name, lat, lon, area) {\r\n\t\tthis.name = name;\r\n\t\tthis.posX = map(lon, -180, 180, 0, width);\r\n\t\tthis.posY = map(lat, -90, 90, height, 0);\r\n\t\tthis.area = area;\r\n\t\tthis.diameter = 2 * sqrt(area \/ PI);\r\n\t\tthis.alpha = 50;\r\n\t}\r\n\t\r\n\tdisplay(){\r\n\t\tfill(0, 0, 255, this.alpha);\r\n\t\tnoStroke();\r\n\t\tcircle(this.posX, this.posY, this.diameter);\r\n\t}\r\n}<\/pre>\n<p>En el constructor le damos como par\u00e1metros los datos que podemos extraer de la tabla: nombre, latitud, longitud y superficie, y los asignamos a las propiedades que m\u00e1s tarde utilizaremos en el m\u00e9todo <span class=\"courier\">display()<\/span> para dibujarlos. Para calcular <span class=\"courier\">posX<\/span> y <span class=\"courier\">posY<\/span> hemos tenido en cuenta que la latitud puede ir de \u2013180 a 180 grados y que la longitud puede ir de \u201390 a 90 grados.<\/p>\n<p>Ahora podemos colocar el c\u00f3digo de la clase en otra pesta\u00f1a y escribir el c\u00f3digo principal de nuestro <em>sketch<\/em>:<\/p>\n<pre>let lakesData;\r\nlet areas = [];\r\nlet names = [];\r\nlet lats = [];\r\nlet lons = [];\r\n\r\nlet lakes = [];\r\n\r\nfunction preload() {\r\n\tlakesData = loadTable(\"lakes.csv\", \"header\");\t\r\n}\r\n\r\nfunction setup() {\r\n\tcreateCanvas(400, 250);\r\n\tfor(let i = 0; i &lt; lakesData.getRowCount(); i ++){\r\n\t\tareas[i] = lakesData.getNum(i, 2);\r\n\t\tnames[i] = lakesData.get(i, 1);\r\n\t\tlats[i] = lakesData.get(i, 3);\r\n\t\tlons[i] = lakesData.get(i, 4);\t\r\n\t}\r\n\t\r\n\tfor(let i = 0; i &lt; lakesData.getRowCount(); i++) {\r\n\t\tlet newLake = new Lake(names[i], \r\n                                 lats[i], \r\n                                 lons[i],\r\n                                 areas[i] * 0.025);\r\n\t\tlakes[i] = newLake;\r\n\t}\r\n}\r\n\r\nfunction draw() {\r\n\tbackground(250);\r\n\tfor(let i = 0; i &lt; lakes.length; i ++) {\r\n\t\tlakes[i].display();\r\n\t}\t\r\n}<\/pre>\n<p>Primero creamos una serie de <em>arrays<\/em> para almacenar los datos que extraeremos de la tabla, que rellenamos en el <span class=\"courier\">setup()<\/span> mediante bucles. A continuaci\u00f3n, creamos los objetos Lake pas\u00e1ndoles como par\u00e1metros los datos anteriormente extra\u00eddos y, por \u00faltimo, en el <span class=\"courier\">draw()<\/span> iteramos por el <em>array<\/em> de objetos <span class=\"courier\">Lake<\/span> para dibujarlos mediante su m\u00e9todo <span class=\"courier\">display()<\/span>.<\/p>\n<p>Como resultado obtendremos una visualizaci\u00f3n de la superficie de los lagos asociada a su posici\u00f3n geogr\u00e1fica:<\/p>\n<figure id=\"attachment_294\" aria-describedby=\"caption-attachment-294\" style=\"width: 600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"wp-image-294\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_127.jpg\" alt=\"\" width=\"600\" height=\"372\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_127.jpg 796w, \/wp-content\/uploads\/2022\/10\/PID_00290094_127-300x186.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_127-768x477.jpg 768w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption id=\"caption-attachment-294\" class=\"wp-caption-text\">Figura 128. Visualizaci\u00f3n de los lagos<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Con los datos que tenemos, podr\u00edamos hacer m\u00e1s interesante la visualizaci\u00f3n y hacerla interactiva con el fin de que al pasar por encima de los c\u00edrculos nos mostrase el nombre del lago. Es tan sencillo como a\u00f1adir un nuevo m\u00e9todo a nuestra clase <span class=\"courier\">Lake<\/span>:<\/p>\n<pre>checkMouse() {\r\n  let d = dist(mouseX, mouseY, this.posX, this.posY);\r\n  if(d &lt; this.diameter * 0.5){\r\n    this.alpha = 150;\r\n    textAlign(CENTER);\r\n    textSize(20);\r\n    text(this.name, width * 0.5, height - 25);\r\n  } else {\r\n    this.alpha = 50;\r\n  }\r\n}<\/pre>\n<p>Y a\u00f1adir la comprobaci\u00f3n de la distancia para cada objeto <span class=\"courier\">Lake<\/span> en el <span class=\"courier\">draw()<\/span> del <em>sketch<\/em> principal:<\/p>\n<pre>function draw() {\r\n\tbackground(250);\r\n\tfor(let i = 0; i &lt; lakes.length; i ++) {\r\n\t\tlakes[i].display();\r\n\t\tlakes[i].checkMouse();\r\n\t}\t\r\n}<\/pre>\n<figure id=\"attachment_296\" aria-describedby=\"caption-attachment-296\" style=\"width: 600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"wp-image-296\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_128.jpg\" alt=\"\" width=\"600\" height=\"372\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_128.jpg 790w, \/wp-content\/uploads\/2022\/10\/PID_00290094_128-300x186.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_128-768x476.jpg 768w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption id=\"caption-attachment-296\" class=\"wp-caption-text\">Figura 129. Visualizaci\u00f3n interactiva de los lagos<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Muchos de los datos a los que podemos tener acceso los podemos encontrar en forma de tablas con filas y columnas. En P5 disponemos de un m\u00e9todo para leer los datos de tablas accediendo a sus celdas mediante coordenadas. Para cargar una tabla, normalmente lo haremos en un formato de texto plano conocido como .csv [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/452"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=452"}],"version-history":[{"count":2,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/452\/revisions"}],"predecessor-version":[{"id":997,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/452\/revisions\/997"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}