Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 8
Tema 8
un archivo
[8.1] ¿Cómo estudiar este tema?
8
TEMA
Esquema
TEMA 8 – Esquema
Acabando con las visualizaciones
(Layouts y exportando el resultado a un archivo)
Otras librerías de
Exportando la visualización Exportando la visualización
visualización
Ideas clave
Para estudiar este tema lee las Ideas clave que encontrarás a continuación.
En este tema intentaremos ultimar los conceptos básicos de D3.js. Hablaremos de tres
temas principales:
» Layouts, que podríamos decir que son una forma de predefinir el tipo de visualización
que vamos a utilizar.
» Exportar las visualizaciones a otros formatos para poderla utilizar en contextos
diferentes.
» Mencionaremos también otras librerías de visualizaciones, algunas de ellas
basadas en D3.js.
Reflexiona al final de este tema sobre tu nivel de D3.js, porque a estas alturas deberías tener
soltura. En caso contrario, dedícale más horas a practicar.
Acabado este tema ya solo nos quedan dos. Este es el último tema en el que trataremos
conceptos de D3.js, pero eso nunca será un problema. Lo importante es que acabes este curso
siendo capaz de diseñar e implementar nuestras propias visualizaciones, ya sea desde cero o
modificando una existente. En particular, este tema introducirá los conceptos mínimos de
D3.js.
Conceptos e ideas han ido completando las páginas de nuestro temario. Pero solo
conseguirás dominar D3.js cuando hayas practicado e intentes hacer cosas nuevas. Hasta
ahora el nivel ha sido muy básico. Lo que veremos en los siguientes temas requiere
mucho más esfuerzo y, seguramente, equivocarse a menudo.
El mismo discurso que doy en todos los temas… Intenta asentar los conceptos poco a
poco. Si intentas rápidamente modificar visualizaciones tendrás problemas. Estás
aprendiendo, no hay nada malo en empezar lento pero seguro. No te confíes porque
tengas conocimientos de programación o hasta conocimiento de JavaScript. Con D3 es
difícil perderse.
https://github.com/mikedewar/getting_started_with_d3/blob/master/visualisations/
data/stations_graph.json
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="styles.css"/>
<script language="javascript" type="text/javascript"
src="http://d3js.org/d3.v3.min.js"></script>
<script type="text/javascript">
function read(){
d3.json("stations_graph.json", function(json) {
visualizeLayout(json);
});
}
function visualizeLayout(data){
.attr("class", "node")
.attr("r", 12);
var link = svg.selectAll("line.link")
.data(data.links)
.enter().append("line")
.style("stroke","black");
var force = d3.layout.force()
.charge(-120)
.linkDistance(30)
.size([width, height])
.nodes(data.nodes)
.links(data.links)
.start();
force.on("tick", function() {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
}
</script>
</head>
<body onload="read()">
</body>
</html>
Ahora sí que hay una diferencia, aunque, por ahora, similar a cuando dibujamos el
histograma. Definimos los círculos o puntos del gráfico.
force.on("tick", function() {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
Con la función force.on adaptamos los valores de nuestro dataset a los requerimientos del
algoritmo.
Por último, algo muy típico de este tipo de gráficos es proporcionar la habilidad de arrastrar
los nodos por la pantalla. Esto se consigue añadiendo una simple línea de código:
node.call(force.drag);
Haremos lo mismo para trabajar con la idea del histograma. Para este ejemplo crea un
archivo que se llame interarrival_times.json con los datos que tenemos en:
https://github.com/mikedewar/getting_started_with_d3/blob/master/visualisations/
data/interarrival_times.json
Los datos que tenemos en este archivo son los tiempos de llegada en todas las paradas
de cinco líneas de metro. Si te da problemas de memoria Plunker no dudes en utilizar
otros editores como WebStorm.
Creamos un objeto histograma que nos permite organizar nuestras observaciones, que
tratamos en grupos continuos (bins). Generamos con la función range grupos desde 1.5
hasta 23 en unidades de 2.2. Frequency indica que el histograma ha de ser normalizado
y no hacer un muestreo por grupo o bin.
Con esta función mapeamos los valores a nuestro histograma. El resultado que deberíais
obtener es la figura siguiente.
Tenemos cinco líneas, por lo tanto, combinaremos el layout del histograma con las
barras apiladas: Stack Charts. Introduciremos el nuevo layout:
svg.selectAll("g")
.data(stack(counts))
.enter()
.append("g")
.attr("class",function(d,i){return lines[i]})
.selectAll("rect")
.data(function(d){return d})
.enter()
.append("rect")
.attr("x",function(d){return x_scale(d.x) })
.attr("y",function(d){return count_scale(d.y) - (height - margin -
count_scale(d.y0))})
.attr("width", function(d){return x_scale(d.x + d.dx) - x_scale(d.x)})
.attr("height", function(d){return height - margin - count_scale(d.y)});
En principio todas las funciones las hemos tratado en temas anteriores. Si tienes dudas,
puedes plantearlas en el foro.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
<link rel="stylesheet" type="text/css"
href="https://github.com/mikedewar/getting_started_with_d3/blob/master
/visualisations/train_colours.css" />
<style>
rect {
stroke: none;
}
line {
stroke: black;
}
path {
stroke: black;
fill: none;
}
</style>
<script>
function draw(data) {
"use strict";
var width = 800,
height = 300,
margin = 50;
.bins(d3.range(1.5,bar_max,bar_width))
.frequency(false)
var max_count = 2
var count_scale = d3.scale.linear()
.domain([0, max_count])
.range([height-margin, margin])
.nice();
.attr('height', height);
svg.selectAll('g')
.data(stack(counts))
.enter()
.append('g')
.attr('class',function(d,i){return lines[i]})
.selectAll('rect')
.data(function(d){return d})
.enter()
.append('rect')
.attr('x',function(d){return x_scale(d.x) })
.attr('y',function(d){return count_scale(d.y) - (height - margin -
count_scale(d.y0))})
.attr('width', function(d){return x_scale(d.x + d.dx) - x_scale(d.x)})
.attr('height', function(d){return height - margin - count_scale(d.y)});
svg.append('g').attr('transform','translate(0,' + (height-margin)
+ ')').call(xaxis)
svg.append('text').attr('x',x_scale(10)).attr('y', height -
margin/5).text('scheduled wait time (minutes)')
}
</script>
</head>
<body>
<script>
d3.json('interarrival_times.json', draw);
</script>
</body>
</html>
Y el resultado gráfico:
Esta sección no está muy relacionada con D3.js en sí, pero es evidente la utilidad de poder
exportar nuestro gráfico desde la ventana del navegador a otros formatos.
Tenemos la primera opción que es la captura de pantalla que nos generará un archivo de tipo
Bitmap o PNG. Es la forma más antigua y más fácil para obtener resultados, aunque de baja
calidad.
También podemos «Imprimir en PDF». Pero la opción más interesante es trabajar con
SVG, así podremos modificar la imagen en Photoshop, escalar la imagen a todos los
tamaños, etc.
Para eso, en el caso anterior, seleccionaremos el gráfico, pulsaremos el botón derecho del
ratón y seleccionaremos «Inspeccionar elemento». Como indica la siguiente figura.
Lo copiaremos en un archivo nuevo que tenga la extensión .svg. Ese archivo lo podrás
abrir con Acrobat Reader, Photoshop, etc.
https://github.com/ignacioola/insights
http://dimplejs.org/
http://www.visualsedimentation.org/
http://nvd3.org/
» Tenxer. Otro ejemplo de librería que simplifica line charts y bar charts basadas en D3js.
http://tenxer.github.io/xcharts/
Al margen de las librerías basadas en D3.js, podemos tener en cuenta las siguientes
librerías:
http://www.flotcharts.org/
» Infovis JT. Una de las librerías de visualizaciones en JavaScript más antiguas con
visualizaciones comunes.
http://philogb.github.io/jit/
http://www.highcharts.com/
http://timeline.knightlab.com/
http://kartograph.org/
Lo + recomendado
No dejes de leer…
No dejes de ver…
Europe 24
Es bueno escuchar lo que nos pueden enseñar otros expertos, así que en este vídeo podéis
encontrar una excelente charla de Alex Gibson en WDCNZ sobre visualización de datos
con D3.js.
+ Información
A fondo
Murray, S. (2013). Interactive Data Visualization for the Web. Sebastopol: O’ Reilly.
Accede al capítulo desde el aula virtual o a través de las siguientes direcciones web:
http://chimera.labs.oreilly.com/books/1230000000345/ch02.html#_easy_charts
Accede al artículo desde el aula virtual o a través de las siguientes direcciones web:
http://mikemcdearmon.com/portfolio/techposts/charting-libraries-using-d3
Webgrafía
Till Nagel
Aesthetics Weblog
Este interesante weblog sobre infographics explora la relación simbiótica entre el diseño
creativo y el campo de la visualización de la información. Más específicamente, recoge
proyectos que representan los datos o la información de un modo original.
Test
2. Wait time aparece en el código que tienes a continuación ¿tiene este alguna
repercusión en lo que tarda en visualizarse el gráfico?
svg.append('text').attr('x',x_scale(10)).attr('y', height -
margin/5).text('scheduled wait time (minutes)')
A. Sí.
B. No.
8. La librería Kartograph:
A. Es para dibujar mapas.
B. No existe.