Estructura de ggplot()

La estructura que utiliza la función ggplot() es la siguiente:

ggplot(data =  ,
       mapping = aes()) + 
  geom_*()
  scale_*()
  labs() +
  facet_*()
  theme()

Los argumentos data = y mapping = son los argumentos mínimos de la función. Adicional a esto, es casi indispensable agregar el layer de geom_*, para definir el tipo de gráfica que queremos visualizar.

Trabajando con la base de datos mpg

Para empezar a practicar el uso de ggplot utilizaremos una base datos precargada, llamada mpg.

Ya sabemos que al revisar una base de datos es común utilizar funciones como str() o summary(). En este caso empezaremos conociendo los nombres de las variables de la base de datos con la función names()

names(mpg)
 [1] "manufacturer" "model"        "displ"        "year"         "cyl"         
 [6] "trans"        "drv"          "cty"          "hwy"          "fl"          
[11] "class"       

Podemos observar que la base de datos cuenta con 11 variables.

Para conocer la clase de cada una de estas variables, utilizaremos la función sappply().

sapply(mpg, class)
manufacturer        model        displ         year          cyl        trans          drv 
 "character"  "character"    "numeric"    "integer"    "integer"  "character"  "character" 
         cty          hwy           fl        class 
   "integer"    "integer"  "character"  "character" 

Debemos recordadr que el primer argumento de la función sapply() es la base de datos. Con esto, podemos identificar las variables de la base de datos y el tipo de información que tiene cada una de ellas.

¿Qué pasa si al usar la función ggplot() no se definen los argumentos mínimos?

Si solo se usa la función, este sería el resultado

ggplot()

R nos arrojaría una gráfica gris. No le hemos definido qué variables queremos graficar, cómo las queremos ordenar ni en dónde se encuentran dichas variables.

Utilicemos la función definiendo los argumentos mínimos.

ggplot(data = mpg,
       mapping = aes(x = cty, y = hwy ))

En esta ocasión, se ha definido qué variables queremos graficar, dónde se encuentran pero no hemos definido la manera en que las queremos visualizar. ¡Nos falta un layer que defina esto!

El tipo gráfica deberá estar en función del propósito que tiene. Las variables cty y hwy representan el rendimiento por galón que tiene el vehículo en la ciudad y en la carretera, respectivamente.

¿Qué relación esperaríamos que tuviera? Deberían ser variables muy correlacionadas, y una forma de evaluar esta condición es a través de una gráfica de dispersión o scatter plot. Por lo tanto, utilizaremos el layer geom_*() y le asignaremos point para indicar que queremos obtener una gráfica de dispersión.

ggplot(data = mpg,
       mapping = aes(x = cty, y = hwy )) +
  geom_point()

Como podemos observar, las variables están correlacionados de forma positiva.

Otra forma de presentar la misma información sería:

ggplot(data = mpg,
       mapping = aes(x = cty, y = hwy )) +
  geom_line()

Al definir una gráfica con líneas, la gráfica se vuelve confusa. Debemos cuidar la forma en que presentamos la información.

¿Cómo podríamos incorporar títulos a nuestra gráfica?

Para incorporar títulos a nuestra gráfica tenemos que agregar el layer labs() que es una abreviación de labels.

ggplot(mpg, aes(x = cty, y = hwy)) + 
  geom_point() + 
  labs( title = "City Miles versus Highway Miles",
        subtitle = "Based on the data from 1999 to 2008",
        caption = "Created by JJGS"
        )

El layer labs tiene los argumentos title, subtitle y caption. Es importante recordar que al nos ser un objeto la información que se muestra en los títulos, debe ser escrita entre comillas.

Clases, categorías o factores

¿Cómo podemos hacer gráficas en función de las diferentes clases, categorías o factores que tienen las variables?

Una manera de hacer esto es a través de diferenciar las observaciones por color. Por ejemplo, la variable cyl mide la cantidad de cilindros que tienen los autos.

Para ver la tabla de frecuencia de alguna variables podemos usar la función table()

table(mpg$cyl)

 4  5  6  8 
81  4 79 70 

Para poder realizar está distinción a través de colores debemos incluirlo en el argumento aes() como color = var.

La gráfica estaría definida de la siguiente manera:

ggplot(mpg, aes(x=cty, y=hwy, color=cyl)) + 
  geom_point() +
  labs( title = "City Miles versus Highway Miles",
        subtitle = "Based on the data from 1999 to 2008",
        caption = "Created by JJGS"
        )

Es probable que la gráfica de arriba no sea lo que esperabamos. La razón más probable es porque la variable cyl esté definida como una variable continua cuando es una variable discreta. Para verificar esto, podemos usar la función class().

class(mpg$cyl)
[1] "integer"

Para hacer el cambio, podemos re definir la variable como caracter o como factor. Hagamos esto.

ggplot(mpg, aes(x=cty, y=hwy, color=as.factor(cyl))) + 
  geom_point() +
  labs( title = "City Miles versus Highway Miles",
        subtitle = "Based on the data from 1999 to 2008",
        caption = "Created by JJGS"
        )

¡Listo! Esta gráfica sí cumple con nuestras expectativas.

Otra forma de distinguir las observaciones en factores sería utilizando el layer facet_. Esto nos va a permitir hacer mini gráficas en función de los factores que tiene la variable.

Por ejmplo,

ggplot(mpg, aes(x=cty, y=hwy)) + 
  geom_point() +
  facet_wrap(~ cyl) + 
  labs( title = "City Miles versus Highway Miles",
        subtitle = "Based on the data from 1999 to 2008",
        caption = "Created by JJGS"
        )

De esta forma pudimos realizar una gráfica para cada uno de la cantidad de cilindros.

Una gráfica que puede resultar interesante es:

ggplot(mpg, aes(x=cty, y=hwy, color=as.factor(cyl))) + 
  geom_point() +
  facet_wrap(~ drv) + 
  labs( title = "City Miles versus Highway Miles",
        subtitle = "Based on the data from 1999 to 2008",
        caption = "Created by JJGS"
        )

LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpemF0aW9uIFNlc3Npb24gMSIKYXV0aG9yOiAiSkpHUyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIyAqKkVzdHJ1Y3R1cmEgZGUgZ2dwbG90KCkqKiAKCkxhIGVzdHJ1Y3R1cmEgcXVlIHV0aWxpemEgbGEgZnVuY2nDs24gYGdncGxvdCgpYCBlcyBsYSBzaWd1aWVudGU6CgpgYGB7ciBldmFsPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9ICAsCiAgICAgICBtYXBwaW5nID0gYWVzKCkpICsgCiAgZ2VvbV8qKCkKICBzY2FsZV8qKCkKICBsYWJzKCkgKwogIGZhY2V0XyooKQogIHRoZW1lKCkKYGBgCgpMb3MgYXJndW1lbnRvcyBgZGF0YSA9YCB5IGBtYXBwaW5nID1gIHNvbiBsb3MgYXJndW1lbnRvcyBtw61uaW1vcyBkZSBsYSBmdW5jacOzbi4gQWRpY2lvbmFsIGEgZXN0bywgZXMgY2FzaSBpbmRpc3BlbnNhYmxlIGFncmVnYXIgZWwgbGF5ZXIgZGUgYGdlb21fKmAsIHBhcmEgZGVmaW5pciBlbCB0aXBvIGRlIGdyw6FmaWNhIHF1ZSBxdWVyZW1vcyB2aXN1YWxpemFyLgoKIyMgKipUcmFiYWphbmRvIGNvbiBsYSBiYXNlIGRlIGRhdG9zIG1wZyoqCgpQYXJhIGVtcGV6YXIgYSBwcmFjdGljYXIgZWwgdXNvIGRlIGdncGxvdCB1dGlsaXphcmVtb3MgdW5hIGJhc2UgZGF0b3MgcHJlY2FyZ2FkYSwgbGxhbWFkYSAqKm1wZyoqLgoKWWEgc2FiZW1vcyBxdWUgYWwgcmV2aXNhciB1bmEgYmFzZSBkZSBkYXRvcyBlcyBjb23Dum4gdXRpbGl6YXIgZnVuY2lvbmVzIGNvbW8gYHN0cigpYCBvIGBzdW1tYXJ5KClgLiBFbiBlc3RlIGNhc28gZW1wZXphcmVtb3MgY29ub2NpZW5kbyBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIGRlIGxhIGJhc2UgZGUgZGF0b3MgY29uIGxhIGZ1bmNpw7NuIGBuYW1lcygpYAoKYGBge3J9Cm5hbWVzKG1wZykKYGBgCgpQb2RlbW9zIG9ic2VydmFyIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIGN1ZW50YSBjb24gKioxMSB2YXJpYWJsZXMqKi4KClBhcmEgY29ub2NlciBsYSBjbGFzZSBkZSBjYWRhIHVuYSBkZSBlc3RhcyB2YXJpYWJsZXMsIHV0aWxpemFyZW1vcyBsYSBmdW5jacOzbiBgc2FwcHBseSgpYC4KCmBgYHtyfQpzYXBwbHkobXBnLCBjbGFzcykKYGBgCgpEZWJlbW9zIHJlY29yZGFkciBxdWUgZWwgcHJpbWVyIGFyZ3VtZW50byBkZSBsYSBmdW5jacOzbiBgc2FwcGx5KClgIGVzIGxhIGJhc2UgZGUgZGF0b3MuIENvbiBlc3RvLCBwb2RlbW9zIGlkZW50aWZpY2FyIGxhcyB2YXJpYWJsZXMgZGUgbGEgYmFzZSBkZSBkYXRvcyB5IGVsIHRpcG8gZGUgaW5mb3JtYWNpw7NuIHF1ZSB0aWVuZSBjYWRhIHVuYSBkZSBlbGxhcy4KCiMjICoqwr9RdcOpIHBhc2Egc2kgYWwgdXNhciBsYSBmdW5jacOzbiBgZ2dwbG90KClgIG5vIHNlIGRlZmluZW4gbG9zIGFyZ3VtZW50b3MgbcOtbmltb3M/KioKClNpIHNvbG8gc2UgdXNhIGxhIGZ1bmNpw7NuLCBlc3RlIHNlcsOtYSBlbCByZXN1bHRhZG8KCmBgYHtyfQpnZ3Bsb3QoKQpgYGAKCmBSYCBub3MgYXJyb2phcsOtYSB1bmEgZ3LDoWZpY2EgZ3Jpcy4gTm8gbGUgaGVtb3MgZGVmaW5pZG8gcXXDqSB2YXJpYWJsZXMgcXVlcmVtb3MgZ3JhZmljYXIsIGPDs21vIGxhcyBxdWVyZW1vcyBvcmRlbmFyIG5pIGVuIGTDs25kZSBzZSBlbmN1ZW50cmFuIGRpY2hhcyB2YXJpYWJsZXMuCgpVdGlsaWNlbW9zIGxhIGZ1bmNpw7NuIGRlZmluaWVuZG8gbG9zIGFyZ3VtZW50b3MgbcOtbmltb3MuCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBtcGcsCiAgICAgICBtYXBwaW5nID0gYWVzKHggPSBjdHksIHkgPSBod3kgKSkKYGBgCgpFbiBlc3RhIG9jYXNpw7NuLCBzZSBoYSBkZWZpbmlkbyBxdcOpIHZhcmlhYmxlcyBxdWVyZW1vcyBncmFmaWNhciwgZMOzbmRlIHNlIGVuY3VlbnRyYW4gcGVybyBubyBoZW1vcyBkZWZpbmlkbyBsYSBtYW5lcmEgZW4gcXVlIGxhcyBxdWVyZW1vcyB2aXN1YWxpemFyLiDCoU5vcyBmYWx0YSB1biBsYXllciBxdWUgZGVmaW5hIGVzdG8hCgoqKkVsIHRpcG8gZ3LDoWZpY2EgZGViZXLDoSBlc3RhciBlbiBmdW5jacOzbiBkZWwgcHJvcMOzc2l0byBxdWUgdGllbmUqKi4gTGFzIHZhcmlhYmxlcyBgY3R5YCB5IGBod3lgIHJlcHJlc2VudGFuIGVsIHJlbmRpbWllbnRvIHBvciBnYWzDs24gcXVlIHRpZW5lIGVsIHZlaMOtY3VsbyBlbiBsYSBjaXVkYWQgeSBlbiBsYSBjYXJyZXRlcmEsIHJlc3BlY3RpdmFtZW50ZS4gCgoqKsK/UXXDqSByZWxhY2nDs24gZXNwZXJhcsOtYW1vcyBxdWUgdHV2aWVyYT8qKiBEZWJlcsOtYW4gc2VyIHZhcmlhYmxlcyBtdXkgY29ycmVsYWNpb25hZGFzLCB5IHVuYSBmb3JtYSBkZSBldmFsdWFyIGVzdGEgY29uZGljacOzbiBlcyBhIHRyYXbDqXMgZGUgdW5hICoqZ3LDoWZpY2EgZGUgZGlzcGVyc2nDs24gbyBzY2F0dGVyIHBsb3QqKi4gUG9yIGxvIHRhbnRvLCB1dGlsaXphcmVtb3MgZWwgbGF5ZXIgYGdlb21fKigpYCB5IGxlIGFzaWduYXJlbW9zICoqcG9pbnQqKiBwYXJhIGluZGljYXIgcXVlIHF1ZXJlbW9zIG9idGVuZXIgdW5hIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuLgoKYGBge3J9CmdncGxvdChkYXRhID0gbXBnLAogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gY3R5LCB5ID0gaHd5ICkpICsKICBnZW9tX3BvaW50KCkKYGBgCgpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGxhcyB2YXJpYWJsZXMgZXN0w6FuIGNvcnJlbGFjaW9uYWRvcyBkZSBmb3JtYSBwb3NpdGl2YS4gCgpPdHJhIGZvcm1hIGRlIHByZXNlbnRhciBsYSBtaXNtYSBpbmZvcm1hY2nDs24gc2Vyw61hOgoKYGBge3J9CmdncGxvdChkYXRhID0gbXBnLAogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gY3R5LCB5ID0gaHd5ICkpICsKICBnZW9tX2xpbmUoKQpgYGAKCkFsIGRlZmluaXIgdW5hIGdyw6FmaWNhIGNvbiBsw61uZWFzLCBsYSBncsOhZmljYSBzZSB2dWVsdmUgY29uZnVzYS4gRGViZW1vcyBjdWlkYXIgbGEgZm9ybWEgZW4gcXVlIHByZXNlbnRhbW9zIGxhIGluZm9ybWFjacOzbi4KCiMjICoqwr9Dw7NtbyBwb2Ryw61hbW9zIGluY29ycG9yYXIgdMOtdHVsb3MgYSBudWVzdHJhIGdyw6FmaWNhPyoqCgpQYXJhIGluY29ycG9yYXIgdMOtdHVsb3MgYSBudWVzdHJhIGdyw6FmaWNhIHRlbmVtb3MgcXVlIGFncmVnYXIgZWwgbGF5ZXIgYGxhYnMoKWAgcXVlIGVzIHVuYSBhYnJldmlhY2nDs24gZGUgKipsYWJlbHMqKi4KCmBgYHtyfQpnZ3Bsb3QobXBnLCBhZXMoeCA9IGN0eSwgeSA9IGh3eSkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyggdGl0bGUgPSAiQ2l0eSBNaWxlcyB2ZXJzdXMgSGlnaHdheSBNaWxlcyIsCiAgICAgICAgc3VidGl0bGUgPSAiQmFzZWQgb24gdGhlIGRhdGEgZnJvbSAxOTk5IHRvIDIwMDgiLAogICAgICAgIGNhcHRpb24gPSAiQ3JlYXRlZCBieSBKSkdTIgogICAgICAgICkKYGBgCgpFbCBsYXllciBgbGFic2AgdGllbmUgbG9zIGFyZ3VtZW50b3MgYHRpdGxlYCwgYHN1YnRpdGxlYCB5IGBjYXB0aW9uYC4gRXMgaW1wb3J0YW50ZSByZWNvcmRhciBxdWUgYWwgbm9zIHNlciB1biBvYmpldG8gbGEgaW5mb3JtYWNpw7NuIHF1ZSBzZSBtdWVzdHJhIGVuIGxvcyB0w610dWxvcywgKipkZWJlIHNlciBlc2NyaXRhIGVudHJlIGNvbWlsbGFzKiouCgojIyAqKkNsYXNlcywgY2F0ZWdvcsOtYXMgbyBmYWN0b3JlcyoqCgoqKsK/Q8OzbW8gcG9kZW1vcyBoYWNlciBncsOhZmljYXMgZW4gZnVuY2nDs24gZGUgbGFzIGRpZmVyZW50ZXMgY2xhc2VzLCBjYXRlZ29yw61hcyBvIGZhY3RvcmVzIHF1ZSB0aWVuZW4gbGFzIHZhcmlhYmxlcz8qKgoKVW5hIG1hbmVyYSBkZSBoYWNlciBlc3RvIGVzIGEgdHJhdsOpcyBkZSBkaWZlcmVuY2lhciBsYXMgb2JzZXJ2YWNpb25lcyBwb3IgY29sb3IuIFBvciBlamVtcGxvLCBsYSB2YXJpYWJsZSBgY3lsYCBtaWRlIGxhIGNhbnRpZGFkIGRlIGNpbGluZHJvcyBxdWUgdGllbmVuIGxvcyBhdXRvcy4gCgpQYXJhIHZlciBsYSB0YWJsYSBkZSBmcmVjdWVuY2lhIGRlIGFsZ3VuYSB2YXJpYWJsZXMgcG9kZW1vcyB1c2FyIGxhIGZ1bmNpw7NuIGB0YWJsZSgpYAoKYGBge3J9CnRhYmxlKG1wZyRjeWwpCmBgYAoKUGFyYSBwb2RlciByZWFsaXphciBlc3TDoSBkaXN0aW5jacOzbiBhIHRyYXbDqXMgZGUgY29sb3JlcyBkZWJlbW9zIGluY2x1aXJsbyBlbiBlbCBhcmd1bWVudG8gYGFlcygpYCBjb21vIGBjb2xvciA9IHZhcmAuCgpMYSBncsOhZmljYSBlc3RhcsOtYSBkZWZpbmlkYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKYGBge3J9CmdncGxvdChtcGcsIGFlcyh4PWN0eSwgeT1od3ksIGNvbG9yPWN5bCkpICsgCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKCB0aXRsZSA9ICJDaXR5IE1pbGVzIHZlcnN1cyBIaWdod2F5IE1pbGVzIiwKICAgICAgICBzdWJ0aXRsZSA9ICJCYXNlZCBvbiB0aGUgZGF0YSBmcm9tIDE5OTkgdG8gMjAwOCIsCiAgICAgICAgY2FwdGlvbiA9ICJDcmVhdGVkIGJ5IEpKR1MiCiAgICAgICAgKQpgYGAKCkVzIHByb2JhYmxlIHF1ZSBsYSBncsOhZmljYSBkZSBhcnJpYmEgbm8gc2VhIGxvIHF1ZSBlc3BlcmFiYW1vcy4gTGEgcmF6w7NuIG3DoXMgcHJvYmFibGUgZXMgcG9ycXVlIGxhIHZhcmlhYmxlIGBjeWxgIGVzdMOpIGRlZmluaWRhIGNvbW8gdW5hIHZhcmlhYmxlIGNvbnRpbnVhIGN1YW5kbyBlcyB1bmEgdmFyaWFibGUgZGlzY3JldGEuIFBhcmEgdmVyaWZpY2FyIGVzdG8sIHBvZGVtb3MgdXNhciBsYSBmdW5jacOzbiBgY2xhc3MoKWAuCgpgYGB7cn0KY2xhc3MobXBnJGN5bCkKYGBgCgpQYXJhIGhhY2VyIGVsIGNhbWJpbywgcG9kZW1vcyByZSBkZWZpbmlyIGxhIHZhcmlhYmxlIGNvbW8gY2FyYWN0ZXIgbyBjb21vIGZhY3Rvci4gSGFnYW1vcyBlc3RvLgoKYGBge3J9CmdncGxvdChtcGcsIGFlcyh4PWN0eSwgeT1od3ksIGNvbG9yPWFzLmZhY3RvcihjeWwpKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGxhYnMoIHRpdGxlID0gIkNpdHkgTWlsZXMgdmVyc3VzIEhpZ2h3YXkgTWlsZXMiLAogICAgICAgIHN1YnRpdGxlID0gIkJhc2VkIG9uIHRoZSBkYXRhIGZyb20gMTk5OSB0byAyMDA4IiwKICAgICAgICBjYXB0aW9uID0gIkNyZWF0ZWQgYnkgSkpHUyIKICAgICAgICApCmBgYAoKwqFMaXN0byEgRXN0YSBncsOhZmljYSBzw60gY3VtcGxlIGNvbiBudWVzdHJhcyBleHBlY3RhdGl2YXMuCgpPdHJhIGZvcm1hIGRlIGRpc3Rpbmd1aXIgbGFzIG9ic2VydmFjaW9uZXMgZW4gZmFjdG9yZXMgc2Vyw61hIHV0aWxpemFuZG8gZWwgbGF5ZXIgYGZhY2V0X2AuIEVzdG8gbm9zIHZhIGEgcGVybWl0aXIgaGFjZXIgbWluaSBncsOhZmljYXMgZW4gZnVuY2nDs24gZGUgbG9zIGZhY3RvcmVzIHF1ZSB0aWVuZSBsYSB2YXJpYWJsZS4KClBvciBlam1wbG8sCgpgYGB7cn0KZ2dwbG90KG1wZywgYWVzKHg9Y3R5LCB5PWh3eSkpICsgCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH4gY3lsKSArIAogIGxhYnMoIHRpdGxlID0gIkNpdHkgTWlsZXMgdmVyc3VzIEhpZ2h3YXkgTWlsZXMiLAogICAgICAgIHN1YnRpdGxlID0gIkJhc2VkIG9uIHRoZSBkYXRhIGZyb20gMTk5OSB0byAyMDA4IiwKICAgICAgICBjYXB0aW9uID0gIkNyZWF0ZWQgYnkgSkpHUyIKICAgICAgICApCmBgYAoKRGUgZXN0YSBmb3JtYSBwdWRpbW9zIHJlYWxpemFyIHVuYSBncsOhZmljYSBwYXJhIGNhZGEgdW5vIGRlIGxhIGNhbnRpZGFkIGRlIGNpbGluZHJvcy4KClVuYSBncsOhZmljYSBxdWUgcHVlZGUgcmVzdWx0YXIgaW50ZXJlc2FudGUgZXM6CgpgYGB7cn0KZ2dwbG90KG1wZywgYWVzKHg9Y3R5LCB5PWh3eSwgY29sb3I9YXMuZmFjdG9yKGN5bCkpKSArIAogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+IGRydikgKyAKICBsYWJzKCB0aXRsZSA9ICJDaXR5IE1pbGVzIHZlcnN1cyBIaWdod2F5IE1pbGVzIiwKICAgICAgICBzdWJ0aXRsZSA9ICJCYXNlZCBvbiB0aGUgZGF0YSBmcm9tIDE5OTkgdG8gMjAwOCIsCiAgICAgICAgY2FwdGlvbiA9ICJDcmVhdGVkIGJ5IEpKR1MiCiAgICAgICAgKQpgYGAKCgoKCgoKCgo=