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=