Las herramientas para gráficos en R con impresionantes. Personalmente, me gusta mucho la librería gráfica que viene instalada en R por defecto (es nclara, sencilla y permite construir practicamente cualquier figura que podamos imaginar). Sin embargo, esa flexibilidad viene a costa de tener que poner mucho esfuerzo para manipular cada elemento de la figura. La libraría ggplot2 implementa un sistema de gráficos conocido como gramática de gráficos que es muy popular no solo en R sino en otros lenguajes.

Además, ggplot2 nos permite tener una excusa para ver cómo añadir nueva funcionalidad a R.

En primer lugar, tenemos que instalar la nueva librería usando:

install.packages("ggplot2")

La función se dirigirá al un servidor reflejo de CRAN, descarga el archivo que necesitamos y lleva a cabo la instalación (que incluye un número de evaluaciones del código y de nuestra máquina). Ahora el paquete está disponible en nuestro sistema y podemos usarlo en nuestra sesión usando:

library(ggplot2)

Echemos un vistazo a nuestros nuevos datos:

tobacco <- read.csv("http://koaning.io/theme/data/cigarette.csv")

La estructura de una figura en ggplot2 es sencilla. Primero definiremos un data.frame que aloja los datos que queremos usar, despues indicaremos las características de la figura que queremos (qué variables van a cada eje o cómo se definen los grupos) y finalmente el tipo de figura que queremos (líneas, puntos, barras, …). Para ello usamos la función ggplot.

Por ejemplo, para definir un gráfico de densidad, todo lo que necesitamos es indicar qué variable queremos y dónde está esa variable:

p <- ggplot(tobacco, aes(x=tax))
p + geom_density()

Añadir una densidad por año es sencillo: todo lo que tenemos que hacer es declarar qué variable usaremos para definir los grupos (por año) y a través de qué variable queremos que cambien los colores (por año también). También añadiremos etiquetas y título:

p <- ggplot(tobacco, aes(x=tax, group=year, colour=year))
p + geom_density() +
    labs(title="Tax rate and tobacco consumption", x="Tax rate", y="Consumption")

Un gráfico de dispersión se define a través de dos dimensiones, pero la estructura es la misma que antes:

p <- ggplot(tobacco, aes(x=packpc, y=tax))
p + geom_point() +
    labs(title="Tax rate and tobacco consumption", x="Tax rate", y="Consumption")

¿Cómo guardar la figura que acabamos de generar? La forma más sencilla quizás sea con ggsave:

p <- ggplot(tobacco, aes(x=tax))
pq <- p + geom_density()
ggsave("my-pretty-figure.png", pq)
LS0tIAp0aXRsZTogIkZpZ3VyYXMgY29uIGBnZ3Bsb3QyYCIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBjYWNoZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGV2YWwgPSBGQUxTRSkgCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucGF0aCA9ICcuL2Fzc2V0cy8nKQpgYGAKCkxhcyBoZXJyYW1pZW50YXMgcGFyYSBncsOhZmljb3MgZW4gYFJgIGNvbiBpbXByZXNpb25hbnRlcy4gUGVyc29uYWxtZW50ZSwgbWUKZ3VzdGEgbXVjaG8gbGEgbGlicmVyw61hIGdyw6FmaWNhIHF1ZSB2aWVuZSBpbnN0YWxhZGEgZW4gYFJgIHBvciBkZWZlY3RvIChlcwpuY2xhcmEsIHNlbmNpbGxhIHkgcGVybWl0ZSBjb25zdHJ1aXIgcHJhY3RpY2FtZW50ZSBjdWFscXVpZXIgZmlndXJhIHF1ZSBwb2RhbW9zCmltYWdpbmFyKS4gU2luIGVtYmFyZ28sIGVzYSBmbGV4aWJpbGlkYWQgdmllbmUgYSBjb3N0YSBkZSB0ZW5lciBxdWUgcG9uZXIgbXVjaG8KZXNmdWVyem8gcGFyYSBtYW5pcHVsYXIgY2FkYSBlbGVtZW50byBkZSBsYSBmaWd1cmEuIExhIGxpYnJhcsOtYSBgZ2dwbG90MmAKaW1wbGVtZW50YSB1biBzaXN0ZW1hIGRlIGdyw6FmaWNvcyBjb25vY2lkbyBjb21vIGBncmFtw6F0aWNhIGRlIGdyw6FmaWNvc2AgcXVlIAplcyBtdXkgcG9wdWxhciBubyBzb2xvIGVuIGBSYCBzaW5vIGVuIG90cm9zIGxlbmd1YWplcy4gCgpBZGVtw6FzLCBgZ2dwbG90MmAgbm9zIHBlcm1pdGUgdGVuZXIgdW5hIGV4Y3VzYSBwYXJhIHZlciBjw7NtbyBhw7FhZGlyIG51ZXZhCmZ1bmNpb25hbGlkYWQgYSBgUmAuCgpFbiBwcmltZXIgbHVnYXIsIHRlbmVtb3MgcXVlIGluc3RhbGFyIGxhIG51ZXZhIGxpYnJlcsOtYSB1c2FuZG86CgpgYGB7ciBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKYGBgCgpMYSBmdW5jacOzbiBzZSBkaXJpZ2lyw6EgYWwgdW4gc2Vydmlkb3IgcmVmbGVqbyBkZSBDUkFOLCBkZXNjYXJnYSBlbCBhcmNoaXZvIHF1ZQpuZWNlc2l0YW1vcyB5IGxsZXZhIGEgY2FibyBsYSBpbnN0YWxhY2nDs24gKHF1ZSBpbmNsdXllIHVuIG7Dum1lcm8gZGUgZXZhbHVhY2lvbmVzCmRlbCBjw7NkaWdvIHkgZGUgbnVlc3RyYSBtw6FxdWluYSkuIEFob3JhIGVsIHBhcXVldGUgZXN0w6EgZGlzcG9uaWJsZSBlbiBudWVzdHJvCnNpc3RlbWEgeSBwb2RlbW9zIHVzYXJsbyBlbiBudWVzdHJhIHNlc2nDs24gdXNhbmRvOgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKYGBgCgpFY2hlbW9zIHVuIHZpc3Rhem8gYSBudWVzdHJvcyBudWV2b3MgZGF0b3M6CgpgYGB7cn0KdG9iYWNjbyA8LSByZWFkLmNzdigiaHR0cDovL2tvYW5pbmcuaW8vdGhlbWUvZGF0YS9jaWdhcmV0dGUuY3N2IikKYGBgCgpMYSBlc3RydWN0dXJhIGRlIHVuYSBmaWd1cmEgZW4gYGdncGxvdDJgIGVzIHNlbmNpbGxhLiBQcmltZXJvIGRlZmluaXJlbW9zIHVuCmBkYXRhLmZyYW1lYCBxdWUgYWxvamEgbG9zIGRhdG9zIHF1ZSBxdWVyZW1vcyB1c2FyLCBkZXNwdWVzIGluZGljYXJlbW9zIGxhcwpjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIGZpZ3VyYSBxdWUgcXVlcmVtb3MgKHF1w6kgdmFyaWFibGVzIHZhbiBhIGNhZGEgZWplIG8gY8OzbW8Kc2UgZGVmaW5lbiBsb3MgZ3J1cG9zKSB5IGZpbmFsbWVudGUgZWwgdGlwbyBkZSBmaWd1cmEgcXVlIHF1ZXJlbW9zIChsw61uZWFzLApwdW50b3MsIGJhcnJhcywgLi4uKS4gUGFyYSBlbGxvIHVzYW1vcyBsYSBmdW5jacOzbiBgZ2dwbG90YC4KClBvciBlamVtcGxvLCBwYXJhIGRlZmluaXIgdW4gZ3LDoWZpY28gZGUgZGVuc2lkYWQsIHRvZG8gbG8gcXVlIG5lY2VzaXRhbW9zIGVzCmluZGljYXIgcXXDqSB2YXJpYWJsZSBxdWVyZW1vcyB5IGTDs25kZSBlc3TDoSBlc2EgdmFyaWFibGU6CgpgYGB7cn0KcCA8LSBnZ3Bsb3QodG9iYWNjbywgYWVzKHg9dGF4KSkKcCArIGdlb21fZGVuc2l0eSgpCmBgYAoKQcOxYWRpciB1bmEgZGVuc2lkYWQgcG9yIGHDsW8gZXMgc2VuY2lsbG86IHRvZG8gbG8gcXVlIHRlbmVtb3MgcXVlIGhhY2VyIGVzCmRlY2xhcmFyIHF1w6kgdmFyaWFibGUgdXNhcmVtb3MgcGFyYSBkZWZpbmlyIGxvcyBncnVwb3MgKHBvciBhw7FvKSB5IGEgdHJhdsOpcyBkZQpxdcOpIHZhcmlhYmxlIHF1ZXJlbW9zIHF1ZSBjYW1iaWVuIGxvcyBjb2xvcmVzIChwb3IgYcOxbyB0YW1iacOpbikuIFRhbWJpw6luCmHDsWFkaXJlbW9zIGV0aXF1ZXRhcyB5IHTDrXR1bG86CmBgYHtyfQpwIDwtIGdncGxvdCh0b2JhY2NvLCBhZXMoeD10YXgsIGdyb3VwPXllYXIsIGNvbG91cj15ZWFyKSkKcCArIGdlb21fZGVuc2l0eSgpICsKICAgIGxhYnModGl0bGU9IlRheCByYXRlIGFuZCB0b2JhY2NvIGNvbnN1bXB0aW9uIiwgeD0iVGF4IHJhdGUiLCB5PSJDb25zdW1wdGlvbiIpCmBgYAoKVW4gZ3LDoWZpY28gZGUgZGlzcGVyc2nDs24gc2UgZGVmaW5lIGEgdHJhdsOpcyBkZSBkb3MgZGltZW5zaW9uZXMsIHBlcm8gbGEKZXN0cnVjdHVyYSBlcyBsYSBtaXNtYSBxdWUgYW50ZXM6CmBgYHtyfQpwIDwtIGdncGxvdCh0b2JhY2NvLCBhZXMoeD1wYWNrcGMsIHk9dGF4KSkKcCArIGdlb21fcG9pbnQoKSArCiAgICBsYWJzKHRpdGxlPSJUYXggcmF0ZSBhbmQgdG9iYWNjbyBjb25zdW1wdGlvbiIsIHg9IlRheCByYXRlIiwgeT0iQ29uc3VtcHRpb24iKQpgYGAKCsK/Q8OzbW8gZ3VhcmRhciBsYSBmaWd1cmEgcXVlIGFjYWJhbW9zIGRlIGdlbmVyYXI/IExhIGZvcm1hIG3DoXMgc2VuY2lsbGEgcXVpesOhcwpzZWEgY29uIGBnZ3NhdmVgOgoKYGBge3IgZXZhbD1GQUxTRX0KcCA8LSBnZ3Bsb3QodG9iYWNjbywgYWVzKHg9dGF4KSkKcHEgPC0gcCArIGdlb21fZGVuc2l0eSgpCmdnc2F2ZSgibXktcHJldHR5LWZpZ3VyZS5wbmciLCBwcSkKYGBgCg==