Ir al contenido principal

15 preguntas que todos los usuarios de R tienen sobre gráficos

Existen distintos tipos de gráficos en R, desde los más básicos hasta otros más complejos. Aquí veremos cómo crearlos.
Actualizado 17 sept 2026  · 15 min leer

Explorar con IA

ChatGPTClaudePerplexity
explore datacamp's r course library banner

R te permite crear distintos tipos de gráficos, desde los básicos como densidades, diagramas de puntos, boxplots y gráficos de dispersión, hasta otros más complejos desde el punto de vista estadístico, como los gráficos de probabilidad.

Además, puedes pasar de producir gráficos básicos con poca personalización a crear gráficos avanzados con personalización total y elementos interactivos. Aun así, no siempre obtenemos el resultado que queremos: Stack Overflow está lleno de preguntas sobre gráficos en R, muchas de ellas recurrentes.

Por eso en DataCamp hemos reunido en un solo post las preguntas más frecuentes y sus respuestas mejor valoradas.

Para practicar la creación de gráficos en R, prueba este curso de visualización de datos en R.

Las 15 preguntas sobre gráficos en R

1. Cómo dibujar un gráfico vacío en R

Abrir un nuevo marco de gráfico

Puedes abrir un marco de gráfico vacío y activar el dispositivo gráfico en R así:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJwbG90Lm5ldygpXG5cbiMgT3IgdHJ5IG91dCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgXG4jIGZyYW1lKCkifQ==

Nota: las funciones plot.new() y frame() definen un nuevo marco de gráfico sin ejes, etiquetas ni bordes. Indican que va a dibujarse un gráfico nuevo: se abrirá una ventana gráfica si no hay ninguna abierta, o se preparará la existente para el nuevo gráfico. Puedes leer más sobre estas funciones aquí.

  • x11() también abre un dispositivo de ventanas nuevo en R para el sistema X Window (versión 11).
  • quartz() inicia un dispositivo gráfico para macOS.

Configurar las dimensiones de la ventana gráfica

También puedes usar la función plot.window() para definir las dimensiones horizontales y verticales del gráfico vacío que acabas de crear:

plot.new()
pWidth = 3
pHeight = 2
plot.window(c(0,pWidth),
            c(0,pHeight))

Dibujar un gráfico realmente vacío

Puedes dibujar un gráfico vacío con la función plot(). Además, rellénalo con ejes, etiquetas y un título con las funciones mtext() y title().

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERyYXcgYW4gZW1wdHkgcGxvdFxucGxvdCg1LCBcbiAgICAgNSwgXG4gICAgIHR5cGU9XCJuXCIsIFxuICAgICBheGVzPUZBTFNFLCBcbiAgICAgYW5uPUZBTFNFLCBcbiAgICAgeGxpbT1jKDAsIDEwKSwgXG4gICAgIHlsaW0gPSBjKDAsMTApKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB4LWF4aXNcbm10ZXh0KFwieC1heGlzXCIsIFxuICAgICAgc2lkZT0xKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB5LWF4aXNcbm10ZXh0KFwieS1heGlzXCIsXG4gICAgICBzaWRlPTIpIFxuXG4jIEFkZCBhIHRpdGxlXG50aXRsZShcIkFuIFIgUGxvdFwiKSJ9

Das las coordenadas (5,5) para el gráfico, pero no dibujas nada porque estableces el argumento type como "n".

Truco: prueba a ponerlo en "p" o "b" y mira qué ocurre.

Además, no anotas el gráfico, pero sí fijas los límites de 0 a 10 en los ejes x e y.

Por último, puedes dibujar un marco alrededor con la función box() y añadir puntos con points():

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERyYXcgYW4gZW1wdHkgcGxvdFxucGxvdCg1LCBcbiAgICAgNSwgXG4gICAgIHR5cGU9XCJuXCIsIFxuICAgICBheGVzPUZBTFNFLCBcbiAgICAgYW5uPUZBTFNFLCBcbiAgICAgeGxpbT1jKDAsIDEwKSwgXG4gICAgIHlsaW0gPSBjKDAsMTApKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB4LWF4aXNcbm10ZXh0KFwieC1heGlzXCIsIFxuICAgICAgc2lkZT0xKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB5LWF4aXNcbm10ZXh0KFwieS1heGlzXCIsXG4gICAgICBzaWRlPTIpIFxuXG4jIEFkZCBhIHRpdGxlXG50aXRsZShcIkFuIFIgUGxvdFwiKVxuXG4jRHJhdyBhIGJveFxuYm94KClcblxuI1B1dCAocmVkKSBwb2ludCBpbiB0aGUgcGxvdCBhdCAoNSw1KVxucG9pbnRzKDUsXG4gICAgICAgNSwgXG4gICAgICAgY29sPVwicmVkXCIpIFxucG9pbnRzKDUsIFxuICAgICAgIDcsIFxuICAgICAgIGNvbD1cIm9yYW5nZVwiLCBcbiAgICAgICBwY2g9MywgXG4gICAgICAgY2V4PTIpXG5wb2ludHMoYygwLCAwLCAxKSwgXG4gICAgICAgYygyLCA0LCA2KSwgXG4gICAgICAgY29sPVwiZ3JlZW5cIiwgXG4gICAgICAgcGNoPTQpIn0=

Nota: puedes pasar coordenadas x e y en vectores para trazar varios puntos a la vez. El argumento pch te permite elegir el símbolo, mientras que cex controla cuánto se escalan respecto al valor por defecto los textos y símbolos trazados.

Truco: si quieres ver qué número corresponde a cada símbolo, haz clic aquí.

2. Cómo establecer las etiquetas de los ejes y el título de los gráficos en R

Los ejes de los gráficos en R son uno de los temas más populares en las preguntas de Stack Overflow; y las dudas son de lo más variado.

Sigue leyendo para descubrir qué preguntas son las más habituales según DataCamp.

¿Cómo nombrar los ejes (con superíndices o subíndices) y poner un título?

Puedes nombrar fácilmente los ejes y añadir un título para que tu gráfico sea más específico y fácil de entender para tu audiencia.

Basta con añadir los argumentos main para el título principal, sub para el subtítulo, xlab para la etiqueta del eje x y ylab para la del eje y.

Nota: si quieres un título con superíndices o subíndices, añádelos en el argumento main de plot(). Usa expression() y el símbolo ^ para superíndices o corchetes para subíndices.

Pruébalo en el bloque de DataCamp Light de abajo:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIG1haW49ZXhwcmVzc2lvbihcIm1haW4gdGl0bGVcIl4yKSwgXG4gICAgIHN1Yj1leHByZXNzaW9uKFwic3ViLXRpdGxlXCJbMl0pLCBcbiAgICAgeGxhYj1cIngtYXhpcyBsYWJlbFwiLCBcbiAgICAgeWxhYj1cInktYXhpcyBsYWJlbFwiKSJ9

También puedes incluir letras griegas en las etiquetas de los ejes combinando expression() y paste(). Ejecuta este código:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIHhsYWIgPSBleHByZXNzaW9uKHBhc3RlKFwiR3JlZWsgbGV0dGVyIFwiLCBwaGkpKSxcbiAgICAgeWxhYiA9IGV4cHJlc3Npb24ocGFzdGUoXCJHcmVlayBsZXR0ZXIgXCIsbXUpKSkifQ==

Ajustar la apariencia de las etiquetas de los ejes

Para ajustar la apariencia de las etiquetas de los ejes x e y, usa los argumentos col.lab y cex.lab. El primero cambia el color de las etiquetas y el segundo su tamaño relativo al ajuste por defecto de cex.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIG1haW49ZXhwcmVzc2lvbihcIm1haW4gdGl0bGVcIl4yKSwgXG4gICAgIHN1Yj1leHByZXNzaW9uKFwic3ViLXRpdGxlXCJbMl0pLCBcbiAgICAgeGxhYj1cIngtYXhpcyBsYWJlbFwiLCBcbiAgICAgeWxhYj1cInktYXhpcyBsYWJlbFwiLFxuICAgICBjb2wubGFiPVwiYmx1ZVwiLFxuICAgICBjZXgubGFiPTAuNzUpIn0=

Para más información sobre estos argumentos, visita esta página.

Quitar las etiquetas y anotaciones de los ejes

Si quieres ocultar los valores de los ejes, añade los argumentos xaxt y yaxt con el valor "n". Estos argumentos especifican el tipo de eje. Con "n" suprimes el trazado del eje.

Si pasas cualquier otro carácter a xaxt y yaxt, los ejes x e y se dibujarán.

A continuación, añade el argumento de anotación ann con valor FALSE para eliminar las etiquetas de los ejes.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIHhheHQ9XCJuXCIsXG4gICAgIHlheHQ9XCJuXCIsXG4gICAgIGFubj1GQUxTRSkifQ==

Truco: ¿no es esto lo que buscabas? Ve a esta página.

Rotar las etiquetas de los ejes

Puedes añadir el argumento las a la función axis() para rotar los números de cada eje:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhLCBubyBheGVzXG5wbG90KHgsXG4gICAgIHksIFxuICAgICBheGVzPUZBTFNFKVxuXG4jIERyYXcgYSBib3hcbmJveCgpXG5cbiMgQWRkIChtb2RpZmllZCkgYXhlcyB0byB0aGUgcGxvdFxuYXhpcygyLCBcbiAgICAgbGFzPTIpXG5heGlzKDEsIFxuICAgICBsYXM9MCkifQ==

Nota: para hacer esto, primero debes indicar en plot() que aún no se dibujen ejes: esa tarea la realizarán después las dos llamadas a axis().

El argumento las puede tomar cuatro valores. Según elijas, cambiará la orientación: con 0 (por defecto) la etiqueta queda paralela al eje; con 1, horizontal; con 2, perpendicular, y con 3, vertical.

Y hay más. Si quieres conocer todas las posibilidades de axis(), sigue leyendo.

Mover las etiquetas de los ejes

¿Quieres cambiar la posición de las etiquetas de los ejes?

Sin problema: con axis() puedes especificar dónde dibujar cada eje. Por ejemplo, dibujar el eje x arriba del área del gráfico y el eje y a la derecha.

Recuerda: si pasas 1 o 2 a axis(), el eje se dibuja abajo o a la izquierda. Desplázate un poco arriba para ver un ejemplo en el bloque anterior.

Esto significa que querrás pasar 3 y 4 a axis():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54PC1zZXEoMCwyKnBpLDAuMSlcbnk8LXNpbih4KVxuXG4jIFBsb3QgdGhlIGRhdGEsIGJ1dCBkb24ndCBwbG90IGF4ZXMgb3IgYW5ub3RhdGlvbnNcbnBsb3QoeCxcbiAgICAgeSxcbiAgICAgYXhlcz1GQUxTRSwgXG4gICAgIGFubj1GQUxTRSlcblxuIyBEcmF3IHRoZSB4LWF4aXMgYWJvdmUgdGhlIHBsb3QgYXJlYVxuYXhpcygzKVxuXG4jIERyYXcgdGhlIHktYXhpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHBsb3QgYXJlYVxuYXhpcyg0KVxuXG4jIERyYXcgYSBib3hcbmJveCgpIn0=

Como ves, primero representas x e y sin ejes ni anotaciones. Luego añades los ejes que quieres y especificas su ubicación respecto al gráfico.

La flexibilidad que te da axis() no se queda ahí. Mira la siguiente pregunta frecuente para ver qué más puedes resolver con esta función básica de R.

Truco: ve a la última pregunta para ver más sobre cómo mover el texto de las etiquetas de los ejes con hjust y vjust.

3. Cómo añadir y cambiar el espaciado de las marcas de los ejes

Cómo cambiar el espaciado de las marcas de los ejes

Dejar que R decida las marcas del eje puede ser frustrante y en algún momento querrás ajustarlas.

1. Usar la función axis() para definir las marcas

Considera este código:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERlZmluZSB0aGUgcG9zaXRpb24gb2YgdGljayBtYXJrc1xudjEgPC0gYygwLHBpLzIscGksMypwaS8yLDIqcGkpXG5cbiMgRGVmaW5lIHRoZSBsYWJlbHMgb2YgdGljayBtYXJrc1xudjIgPC0gYyhcIjBcIixcIlBpLzJcIixcIlBpXCIsXCIzKlBpLzJcIixcIjIqUGlcIilcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwyKnBpLDAuMSlcbnkgPC0gc2luKHgpXG5cbiMgUGxvdCB0aGUgZGF0YVxucGxvdCh4LFxuICAgICB5LFxuICAgICB4YXh0ID0gXCJuXCIpXG5cbiMgQWRkIGFuIGF4aXMgdG8gdGhlIHBsb3QgXG5heGlzKHNpZGUgPSAxLCBcbiAgICAgYXQgPSB2MSwgXG4gICAgIGxhYmVscyA9IHYyLFxuICAgICB0Y2s9LS4wNSkifQ==

Primero defines la posición de las marcas y sus etiquetas. Luego dibujas el gráfico especificando el tipo de eje x como "n", suprimiendo su trazado.

Después empieza lo interesante:

  • La función axis() permite especificar el lado del gráfico donde dibujar el eje. Con 1 se dibuja abajo; con 2, a la izquierda; con 3 o 4, arriba o a la derecha, respectivamente.
  • El argumento at indica los puntos donde trazar las marcas. Aquí usas las posiciones definidas en V1.
  • Igualmente, las labels son las definidas en V2.
  • Ajustas la dirección de las marcas con tck: con un valor negativo, las marcas aparecen por debajo del eje.

Truco: pasa un valor positivo a tck y mira qué ocurre.

Puedes afinar el tamaño de las marcas con tcl y la apariencia de sus etiquetas con cex.axis, col.axis y font.axis.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERlZmluZSB0aGUgcG9zaXRpb24gb2YgdGljayBtYXJrc1xudjEgPC0gYygwLHBpLzIscGksMypwaS8yLDIqcGkpXG5cbiMgRGVmaW5lIHRoZSBsYWJlbHMgb2YgdGljayBtYXJrc1xudjIgPC0gYyhcIjBcIixcIlBpLzJcIixcIlBpXCIsXCIzKlBpLzJcIixcIjIqUGlcIilcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwyKnBpLDAuMSlcbnkgPC0gc2luKHgpXG5cbiMgUGxvdCB0aGUgZGF0YVxucGxvdCh4LFxuICAgICB5LFxuICAgICB4YXh0ID0gXCJuXCIpXG5cbiMgQWRkIGF4aXMgdG8gdGhlIHBsb3QgXG5heGlzKHNpZGUgPSAxLCBcbiAgICAgYXQgPSB2MSwgXG4gICAgIGxhYmVscyA9IHYyLFxuICAgICB0Y2s9LS4xLFxuICAgICB0Y2wgPSAtMC41LFxuICAgICBjZXguYXhpcz0xLjA1LFxuICAgICBjb2wuYXhpcz1cImJsdWVcIixcbiAgICAgZm9udC5heGlzPTUpIn0=

2. Usar otras funciones para definir las marcas

También puedes usar par() y plot() para definir la posición de las marcas y el número de intervalos entre ellas.

Nota: con el argumento xaxp pasas la posición de las marcas en los extremos del eje x, seguida del número de intervalos entre marcas:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIHhheHAgPSBjKDAsIDIqcGksIDUpKSJ9

También puedes ejecutar este código para lograr prácticamente lo mismo:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhIFxueCA8LSBzZXEoMCwyKnBpLDAuMSlcbnkgPC0gc2luKHgpXG5cbiMgUGxvdCB0aGUgZGF0YSBcbnBsb3QoeCwgXG4gICAgIHksIFxuICAgICB4YXh0PVwiblwiKVxuXG4jIFVzZSBgcGFyKClgIHRvIHNldCBncmFwaGljYWwgYHhheHBgIHBhcmFtZXRlclxucGFyKHhheHA9IGMoMCwgMipwaSwgMikpIFxuXG4jIEFkZCBhbiBheGlzIHRvIHRoZSBwbG90IFxuYXhpcygxKSJ9

Nota: esto solo funciona si no usas escala logarítmica. Si los ejes están en logaritmos (par(xlog=T)), los tres valores de xaxp significan otra cosa: para rangos pequeños, n es negativo. En caso contrario, n está en 1:3 e indica un caso; x1 y x2 son las potencias de 10 más baja y más alta dentro de las coordenadas del usuario, 10 ^ par(“usr”)[1:2].

Un ejemplo:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJuIDwtIDFcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwgMTAwMDAsIDEpXG55IDwtIGV4cChuKS8oZXhwKG4pK3gpXG5cbiMgU2V0IGdyYXBoaWNhbCBwYXJhbWV0ZXJzIGB4bG9nYCBhbmQgYHhheHBgXG5wYXIoeGxvZz1UUlVFLCBcbiAgICB4YXhwPSBjKDEsIDQsIDMpKVxuXG4jIFBvdCB0aGUgZGF0YSBcbnBsb3QoeCwgXG4gICAgIHksIFxuICAgICBsb2c9XCJ4XCIpICJ9

En este ejemplo usas par(): estableces xlog a TRUE y añades xaxp con las coordenadas de las marcas extremas y el número de intervalos. Aquí el mínimo es 1, el máximo 4 y hay 3 intervalos entre marcas.

Luego representas x e y, añadiendo el argumento log para indicar si quieres el eje x, el y o ambos en escala logarítmica. Puedes pasar "x", "y" o "xy".

Un ejemplo con ambos ejes en logaritmos:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJuIDwtIDFcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwgMjAsIDEpXG55IDwtIGV4cCh4KS8oeClcblxuIyBTZXQgZ3JhcGhpY2FsIHBhcmFtZXRlcnMgYHhsb2dgIGFuZCBgeGF4cGBcbnBhcih4bG9nPVRSVUUsIFxuICAgIHhheHA9IGMoMSwgNCwgMykpXG4jIFNldCBncmFwaGljYWwgcGFyYW1ldGVycyBgeWxvZ2AgYW5kIGB5YXhwYFxucGFyKHlsb2c9VFJVRSwgXG4gICAgeWF4cD0gYygxLCAxMSwgMikpIFxuXG4jIFBsb3QgdGhlIGRhdGEgXG5wbG90KHgsIFxuICAgICB5LCBcbiAgICAgbG9nPVwieHlcIikifQ==

Cómo añadir marcas menores

Puedes añadir marcas menores rápidamente con la función minor.tick() del paquete Hmisc:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEltcG9ydCBgSG1pc2NgIGxpYnJhcnlcbmxpYnJhcnkoSG1pc2MpXG5cbiMgTWFrZSBhIG5ldyBwbG90XG5wbG90Lm5ldygpXG5cbiMgU2V0IG1pbm9yIHRpY2sgbWFya1xubWlub3IudGljayhueCA9IDEuNSwgXG4gICAgICAgICAgIG55ID0gMiwgXG4gICAgICAgICAgIHRpY2sucmF0aW89MC43NSkifQ==
  • El argumento nx define en cuántos intervalos dividir el espacio entre marcas principales del eje. Si pasas 1, se suprimen las marcas menores.
  • ny hace lo mismo para el eje y.
  • tick.ratio indica la proporción entre la longitud de las marcas menores y las mayores. La longitud de estas últimas se obtiene de par(tck=x).

4. Cómo crear dos ejes X o Y diferentes

La primera opción es crear un primer gráfico y ejecutar par() con el argumento new a TRUE para evitar que R limpie el dispositivo gráfico:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFNldCBhIHNlZWQgXG5zZXQuc2VlZCgxMDEpXG5cbiMgVGhlIGRhdGFcbnggPC0gMToxMFxueSA8LSBybm9ybSgxMClcbnogPC0gcnVuaWYoMTAsIG1pbj0xMDAwLCBtYXg9MTAwMDApXG5cbiMgUGxvdCB0aGUgZGF0YVxucGxvdCh4LCB5KSBcblxuIyBEb24ndCBjbGVhbiB0aGUgZnJhbWUgYmVmb3JlIGRyYXdpbmdcbnBhcihuZXcgPSBUUlVFKSJ9

Después creas el segundo gráfico con plot(). Pasa los datos y ajusta argumentos como type, axes, bty, xlab y ylab:

  • type: pasa l para trazar líneas;
  • axes a FALSE para no dibujar ejes;
  • bty suprime la caja alrededor del gráfico;
  • xlab vacío para que no haya etiqueta en el eje x, y
  • ylab también vacío para no etiquetar el eje y.

Compruébalo en este bloque de DataCamp Light. El código anterior ya está cargado en tu entorno. Puedes verificarlo en la consola de R a la derecha del bloque:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6InNldC5zZWVkKDEwMSlcbnggPC0gMToxMFxueSA8LSBybm9ybSgxMClcbnogPC0gcnVuaWYoMTAsIG1pbj0xMDAwLCBtYXg9MTAwMDApXG5wbG90KHgsIHkpIFxucGFyKG5ldyA9IFRSVUUpIiwic2FtcGxlIjoicGxvdCh4LCBcbiAgICAgeiwgXG4gICAgIHR5cGUgPSBcImxcIiwgXG4gICAgIGF4ZXMgPSBGQUxTRSxcbiAgICAgYnR5ID0gXCJuXCIsIFxuICAgICB4bGFiID0gXCJcIiwgXG4gICAgIHlsYWIgPSBcIlwiKSJ9

Ahora toca añadir un eje y escribir texto en los márgenes con axis() y mtext() respectivamente.

Puedes añadir un eje nuevo a la derecha pasando el argumento side con valor 4 a axis(). Después, especifica at con los puntos donde dibujar marcas. En este caso, calculas una secuencia de n+1 valores «redondos» igualmente espaciados que cubren el rango de z con pretty(). Así replicas los números del eje y del segundo gráfico, que llamaste z.

Prueba todo esto abajo:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6InNldC5zZWVkKDEwMSlcbnggPC0gMToxMFxueSA8LSBybm9ybSgxMClcbnogPC0gcnVuaWYoMTAsIG1pbj0xMDAwLCBtYXg9MTAwMDApXG5wbG90KHgsIHkpIFxucGFyKG5ldyA9IFRSVUUpXG5wbG90KHgsIFxuICAgICB6LCBcbiAgICAgdHlwZSA9IFwibFwiLCAjUGxvdCB3aXRoIGxpbmVzXG4gICAgIGF4ZXMgPSBGQUxTRSwgI05vIGF4ZXNcbiAgICAgYnR5ID0gXCJuXCIsICNCb3ggYWJvdXQgcGxvdCBpcyBzdXBwcmVzc2VkXG4gICAgIHhsYWIgPSBcIlwiLCAgI05vIGxhYmVscyBvbiB4LWFuZCB5LWF4aXNcbiAgICAgeWxhYiA9IFwiXCIpIiwic2FtcGxlIjoiYXhpcyhzaWRlPTQsIFxuICAgICBhdCA9IHByZXR0eShyYW5nZSh6KSkpXG5tdGV4dChcInpcIiwgXG4gICAgICBzaWRlPTQsIFxuICAgICAgbGluZT0zKSJ9

Nota: el argumento side puede valer 1 (abajo), 2 (izquierda), 3 (arriba) o 4 (derecha). El argumento line indica en qué línea del margen empieza el texto.

El resultado final de tu código será así:

set.seed(101)
x <- 1:10
y <- rnorm(10)
z <- runif(10, min=1000, max=10000)
plot(x, y) 
par(new = TRUE)
plot(x, 
     z, 
     type = "l", 
     axes = FALSE, 
     bty = "n", 
     xlab = "", 
     ylab = "")
axis(side=4, 
     at = pretty(range(z)))
mtext("z", 
      side=4, 
      line=3)

Como ejercicio adicional, intenta construir un gráfico con dos ejes x distintos. Hazlo en este bloque de DataCamp Light:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJwbG90Lm5ldygpXG5zZXQuc2VlZCgxMDEpXG54IDwtIDE6MTBcbnkgPC0gcm5vcm0oMTApXG56IDwtIHJ1bmlmKDEwLCBtaW49MTAwMCwgbWF4PTEwMDAwKSBcbnBhcihtYXIgPSBjKDUsIDQsIDQsIDQpICsgMC4zKVxucGxvdCh4LCB5KVxucGFyKG5ldyA9IFRSVUUpXG5wbG90KHosIHksIHR5cGUgPSBcImxcIiwgYXhlcyA9IEZBTFNFLCBidHkgPSBcIm5cIiwgeGxhYiA9IFwiXCIsIHlsYWIgPSBcIlwiKVxuYXhpcyhzaWRlPTMsIGF0ID0gcHJldHR5KHJhbmdlKHopKSlcbm10ZXh0KFwielwiLCBzaWRlPTMsIGxpbmU9MykifQ==

Ten en cuenta que, aunque puedes hacerlo todo a mano con las funciones básicas plot(), axis() y mtext(), hay paquetes que automatizan el proceso: twoord.plot() del paquete plotrix y doubleYScale() del paquete latticeExtra son muy prácticos y quizá más rápidos para este fin:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEltcG9ydCBgbGF0dGljZUV4dHJhYFxubGlicmFyeShsYXR0aWNlRXh0cmEpXG5cbiMgVGhlIGRhdGFcbmNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbkFnZSA8LSBjaG9sJEFHRVxuQ2hvbCA8LSBjaG9sJENIT0xcblNtb2tlIDwtIGNob2wkU01PS0VcblN0YXRlIDwtIGNob2wkTU9SVFxuXG4jIENyZWF0ZSBhIGJpdmFyaWF0ZSBzY2F0dGVycGxvdCBgYWAgXG5hIDwtIHh5cGxvdChDaG9sIH4gQWdlfFN0YXRlKVxuXG4jIENyZWF0ZSBhIGJpdmFyaWF0ZSBzY2F0dGVycGxvdCBgYmAgXG5iIDwtIHh5cGxvdChTbW9rZSB+IEFnZXxTdGF0ZSlcblxuIyBEcmF3IHRoZSB0d28gcGxvdHMgd2l0aCBkaWZmZXJlbnQgeSBzY2FsZXMgXG5kb3VibGVZU2NhbGUoYSwgYiwgc3R5bGUxID0gMCwgc3R5bGUyID0gMywgYWRkLnlsYWIyID0gVFJVRSwgY29sdW1ucz0zKSJ9

Nota: el ejemplo anterior usa este conjunto de datos. Si tienes dudas sobre cómo importarlo o sobre read.table(), revisa el tutorial de DataCamp sobre importación de datos en R.

5. Cómo añadir o cambiar la leyenda de un gráfico en R

Añadir y cambiar la leyenda con R base

Puedes añadir una leyenda fácilmente con la función legend():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLHBpLDAuMSlcbnkxIDwtIGNvcyh4KVxueTIgPC0gc2luKHgpXG5cbiMgUGxvdCBcbnBsb3QoYygwLDMpLCBjKDAsMyksIHR5cGU9XCJuXCIsIHhsYWI9XCJ4XCIsIHlsYWI9XCJ5XCIpXG5cbiMgRHJhdyBsaW5lc1xubGluZXMoeCwgeTEsIGNvbD1cInJlZFwiLCBsd2Q9MilcbmxpbmVzKHgsIHkyLCBjb2w9XCJibHVlXCIsIGx3ZD0yKVxuXG4jIEFkZCBsZWdlbmQgdG8gcGxvdCBcbmxlZ2VuZChcInRvcHJpZ2h0XCIsIFxuICAgICAgIGluc2V0PS4wNSwgXG4gICAgICAgY2V4ID0gMSwgXG4gICAgICAgdGl0bGU9XCJMZWdlbmRcIiwgXG4gICAgICAgYyhcIkNvc2ludXNcIixcIlNpbnVzXCIpLCBcbiAgICAgICBob3Jpej1UUlVFLCBcbiAgICAgICBsdHk9YygxLDEpLCBcbiAgICAgICBsd2Q9YygyLDIpLCBcbiAgICAgICBjb2w9YyhcInJlZFwiLFwiYmx1ZVwiKSwgXG4gICAgICAgYmc9XCJncmV5OTZcIikifQ==

Ojo: los argumentos pt.cex y title.cex que aparecen en la documentación de legend() no funcionan como cabría esperar. Hay algunos apaños:

  1. Poner el título o las etiquetas de la leyenda en otra fuente añadiendo text.font a legend():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLHBpLDAuMSlcbnkxIDwtIGNvcyh4KVxueTIgPC0gc2luKHgpXG5cbiMgUGxvdCBcbnBsb3QoYygwLDMpLCBjKDAsMyksIHR5cGU9XCJuXCIsIHhsYWI9XCJ4XCIsIHlsYWI9XCJ5XCIpXG5cbiMgRHJhdyBsaW5lc1xubGluZXMoeCwgeTEsIGNvbD1cInJlZFwiLCBsd2Q9MilcbmxpbmVzKHgsIHkyLCBjb2w9XCJibHVlXCIsIGx3ZD0yKVxuXG4jIEFkZCBsZWdlbmRcbmxlZ2VuZChcInRvcHJpZ2h0XCIsIFxuICAgICAgIGluc2V0PS4wNSwgXG4gICAgICAgY2V4ID0gMSwgXG4gICAgICAgdGl0bGU9XCJMZWdlbmRcIiwgXG4gICAgICAgYyhcIkNvc2ludXNcIixcIlNpbnVzXCIpLCBcbiAgICAgICBob3Jpej1UUlVFLCBcbiAgICAgICBsdHk9YygxLDEpLCBcbiAgICAgICBsd2Q9YygyLDIpLCBcbiAgICAgICBjb2w9YyhcInJlZFwiLFwiYmx1ZVwiKSwgXG4gICAgICAgYmc9XCJncmV5OTZcIixcbiAgICAgICB0ZXh0LmZvbnQ9MykifQ==
  1. Dibujar la leyenda dos veces con valores distintos de cex
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLHBpLDAuMSlcbnkxIDwtIGNvcyh4KVxueTIgPC0gc2luKHgpXG5cbiMgUGxvdFxucGxvdChjKDAsMyksIGMoMCwzKSwgdHlwZT1cIm5cIiwgeGxhYj1cInhcIiwgeWxhYj1cInlcIilcblxuIyBEcmF3IGxpbmVzXG5saW5lcyh4LCB5MSwgY29sPVwicmVkXCIsIGx3ZD0yKVxubGluZXMoeCwgeTIsIGNvbD1cImJsdWVcIiwgbHdkPTIpXG5cbiMgQWRkIHN1YnRpdGxlcyBmb3IgbGVnZW5kXG5sZWdlbmQoXCJ0b3ByaWdodFwiLFxuICAgICAgIGluc2V0PS4wNSxcbiAgICAgICBjZXggPSAwLjc1LFxuICAgICAgIGMoXCJDb3NpbnVzXCIsXCJTaW51c1wiKSxcbiAgICAgICB0aXRsZT1cIlwiLFxuICAgICAgIGhvcml6PVRSVUUsXG4gICAgICAgbHR5PWMoMSwxKSwgXG4gICAgICAgbHdkPWMoMiwyKSwgXG4gICAgICAgY29sPWMoXCJyZWRcIixcImJsdWVcIikpXG5cbiMgQWRkIHRpdGxlIHRvIGxlZ2VuZCBcbmxlZ2VuZCgyLjA1LCAyLjk3LCBcbiAgICAgICBpbnNldD0uMDUsXG4gICAgICAgYyhcIlwiLFwiXCIpLFxuICAgICAgIHRpdGxlPVwiTGVnZW5kXCIsXG4gICAgICAgY2V4PTEuMTUsIFxuICAgICAgIGJ0eT1cIm5cIikifQ==

Truco: si te interesan los colores disponibles en R, echa un vistazo a este PDF.

Cómo añadir y cambiar la leyenda y etiquetas en ggplot2

Añadir una leyenda en ggplot2 es bastante sencillo. Basta con ejecutar lo siguiente:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgUmVhZCBpbiB0aGUgZGF0YVxuY2hvbCA8LSByZWFkLnRhYmxlKHVybChcImh0dHA6Ly9hc3NldHMuZGF0YWNhbXAuY29tL2Jsb2dfYXNzZXRzL2Nob2wudHh0XCIpLCBcbiAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKVxuXG4jIFBsb3QgdGhlIGRhdGEgXG5nZ3Bsb3QoY2hvbCwgYWVzKHg9Y2hvbCRXRUlHSFQsIFxuICAgICAgICAgICAgICAgICB5PWNob2wkSEVJR0hUKSkgKyBcbiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gZmFjdG9yKGNob2wkTU9SVCksIFxuICAgICAgICAgICAgICAgICBzaGFwZT1jaG9sJFNNT0tFKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICJ9

Y obtienes una leyenda por defecto. Pero normalmente querrás ajustar su apariencia.

Hay dos formas de cambiar el título y las etiquetas de la leyenda en ggplot2:

  1. Indicar a la escala que use otro título y etiquetas
Si has especificado estéticas como colour o shape, debes cambiar nombres y etiquetas mediante scale_color_discrete() y scale_shape_discrete() respectivamente:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgUmVhZCBpbiBkYXRhXG5jaG9sIDwtIHJlYWQudGFibGUodXJsKFwiaHR0cDovL2Fzc2V0cy5kYXRhY2FtcC5jb20vYmxvZ19hc3NldHMvY2hvbC50eHRcIiksIFxuICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpXG5cbiMgUGxvdCB0aGUgZGF0YVxuZ2dwbG90KGNob2wsIGFlcyh4PWNob2wkV0VJR0hULCBcbiAgICAgICAgICAgICAgICAgeT1jaG9sJEhFSUdIVCkpICsgXG4gIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGZhY3RvcihjaG9sJE1PUlQpLCBcbiAgICAgICAgICAgICAgICAgc2hhcGUgPSBjaG9sJFNNT0tFKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICsgXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDEsMC41KSxcbiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygxLDEpKSArIFxuICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID1cIkNvbmRpdGlvblwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoXCJBbGl2ZVwiLCBcIkRlYWRcIikpICtcbiAgc2NhbGVfc2hhcGVfZGlzY3JldGUobmFtZT1cIlNtb2tlclwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoXCJOb24tc21va2VyXCIsIFwiU2lnYXJlXCIsIFwiUGlwZVwiICkpIn0=

Puede que el gráfico se vea algo «apretado» en la pestaña Plot del bloque, pero en RStudio no tendrás ese problema.

Puedes crear dos leyendas si añades el argumento shape en geom_point() y en los argumentos labels.

Si quieres mover la leyenda a la parte inferior, establece legend.position como "bottom". Por su parte, legend.justification te permite situarla dentro del gráfico.

Truco: consulta aquí los distintos tipos de escalas para cambiar nombres y etiquetas.

  1. Cambiar el data frame para que el factor tenga la forma deseada
Por ejemplo:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFJlYWQgaW4gZGF0YVxuY2hvbCA8LSByZWFkLnRhYmxlKHVybChcImh0dHA6Ly9hc3NldHMuZGF0YWNhbXAuY29tL2Jsb2dfYXNzZXRzL2Nob2wudHh0XCIpLCBoZWFkZXIgPSBUUlVFKVxuXG4jIE1hbmlwdWxhdGUgdGhlIGRhdGFcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuXG4jIEluc3BlY3QgcmVzdWx0IFxuaGVhZChjaG9sKSJ9

Luego puedes usar los nuevos nombres de factor para construir tu gráfico en ggplot2, evitando tener que cambiar nombres y etiquetas con líneas extra de código.

Truco: para una cheat sheet completa de ggplot2, ve aquí.

6. Cómo dibujar una cuadrícula en tu gráfico de R

Dibujar una cuadrícula con R base

Para ciertos fines quizá quieras incluir una cuadrícula. Puedes añadirla fácilmente con la función grid():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gYygxLDIsMyw0LDUpXG55IDwtIDIqeFxuXG4jIFBsb3RcbnBsb3QoeCx5KVxuXG4jIEdyaWRcbmdyaWQoMTAsMTApIn0=

Dibujar una cuadrícula con ggplot2

El bloque siguiente muestra cómo asegurarte de que tu gráfico tenga cuadrícula con ggplot2. Los datos de chol ya están cargados y con las transformaciones de antes aplicadas.

Si no tienes claro cómo son los datos, imprime las primeras filas en la consola de R del bloque:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IGRhdGEgXG5nZ3Bsb3QoY2hvbCwgYWVzKHg9Y2hvbCRXRUlHSFQsIHk9Y2hvbCRIRUlHSFQpKSArIFxuICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBmYWN0b3IoY2hvbCRNT1JUKSwgc2hhcGUgPSBjaG9sJFNNT0tFKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICsgXG4gIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIiksXG4gICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIikpIn0=

Truco: si no quieres las líneas menores de la cuadrícula, pasa element_blank() a panel.grid.minor.

Si quieres rellenar el fondo con un color, añade panel.background = element_rect(fill = "navy") a tu código. Puedes verlo en el bloque de abajo. Los datos chol están cargados y ligeramente transformados, igual que antes. ¡Pruébalo!

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6ImxpYnJhcnkoZ2dwbG90MilcbmdncGxvdChjaG9sLCBhZXMoeD1jaG9sJFdFSUdIVCwgeT1jaG9sJEhFSUdIVCkpICsgXG4gIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGZhY3RvcihjaG9sJE1PUlQpLCBzaGFwZSA9IGNob2wkU01PS0VSKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICsgXG4gIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPVwiQ29uZGl0aW9uXCIsIGxhYmVscz1jKFwiQWxpdmVcIiwgXCJEZWFkXCIpKSArXG4gIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWU9XCJTbW9rZXJcIiwgbGFiZWxzPWMoXCJOb24tc21va2VyXCIsIFwiU2lnYXJlXCIsIFwiUGlwZVwiICkpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMSwwLjUpLFxuICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMSksXG4gICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIiksXG4gICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIiksXG4gICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFwibmF2eVwiKVxuICAgICAgICApIn0=

7. Cómo dibujar un gráfico con un PNG como fondo

Puedes dibujar un gráfico con una imagen .png como fondo fácilmente con el paquete png. Instálalo si lo necesitas, actívalo con library() y empieza a trazar.

Primero, carga la imagen. Usa readPNG() indicando la ruta del archivo.

Truco: puedes comprobar y cambiar tu directorio de trabajo ejecutando estos comandos.

Si la imagen está guardada en tu directorio de trabajo, basta con readPNG("picture.png") en lugar de pasar la ruta completa.

Después, configura el área del gráfico y llama a par() para establecer los parámetros gráficos de rasterImage(). Usa el argumento usr para definir los extremos de las coordenadas de usuario de la región de trazado. En este caso, 1, 3, 2 y 4.

Luego dibuja una cuadrícula y añade algunas líneas:

install.packages("png")
library(png)
image <- readPNG("<path to your picture>")

getwd()
setwd("<path to a folder>")

plot(1:2, type='n', main="Plotting Over an Image", xlab="x", ylab="y")

lim <- par()

rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])

grid()
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")

Esto puede darte el siguiente resultado si usas el logo de DataCamp:

library(png)
image <- readPNG("datacamp.png")
plot(1:2, type="n", main="Plotting Over an Image", xlab="x", ylab="y", asp=1)
lim <- par()
rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1.5, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")

Plotting over DataCamp logo

Ten en cuenta que readPNG() requiere un archivo .png y que puedes seguir el mismo procedimiento con imágenes jpg: en ese caso, carga la librería jpeg.

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERvd25sb2FkIGFuIGltYWdlXG5kb3dubG9hZC5maWxlKFwiaHR0cHM6Ly9ob2x0enlhbi5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMTAvY3JvcHBlZC1wMTA5MDUxOC5qcGdcIiAsIGRlc3RmaWxlPVwibXlfaW1hZ2UuanBnXCIpXG5cbiMgTG9hZCBganBlZ2AgXG5saWJyYXJ5KGpwZWcpXG5cbiMgUmVhZCBpbiB0aGUganBnIGZpbGUgXG5teV9pbWFnZT1yZWFkSlBFRyhcIm15X2ltYWdlLmpwZ1wiKVxuXG4jIFNldCB1cCBhIHBsb3QgYXJlYSB3aXRoIG5vIHBsb3RcbnBsb3QoMToyLCB0eXBlPSduJywgbWFpbj1cIlwiLCB4bGFiPVwieFwiLCB5bGFiPVwieVwiKVxuXG4jIEdldCB0aGUgcGxvdCBpbmZvcm1hdGlvblxubGltIDwtIHBhcigpXG5yYXN0ZXJJbWFnZShteV9pbWFnZSwgbGltJHVzclsxXSwgbGltJHVzclszXSwgbGltJHVzclsyXSwgbGltJHVzcls0XSlcbmdyaWQoKVxuXG4jQWRkIHlvdXIgcGxvdFxubGluZXMoYygxLCAxLjIsIDEuNCwgMS42LCAxLjgsIDIuMCksIGMoMSwgMS4zLCAxLjcsIDEuNiwgMS43LCAxLjApLCB0eXBlPVwiYlwiLCBsd2Q9NSwgY29sPVwid2hpdGVcIikifQ==

En este ejemplo primero descargas una imagen de la web para usarla en tu gráfico, pero también puedes guardarla localmente y pasar la ruta a readJPEG().

Este ejemplo procede de la R Graph Gallery, que ofrece mucha inspiración para visualización en R, con código y resultados juntos. Ideal para inspirarte o encontrar rápido el código que necesitas.

8. Cómo ajustar el tamaño de los puntos en un gráfico de R

Ajustar el tamaño de los puntos con R base

Para ajustar el tamaño de los puntos con R base, basta con usar el argumento cex:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJ4IDwtIGMoMSwyLDMsNCw1KVxueSA8LSBjKDYsNyw4LDksMTApXG5cbnBsb3QoeCx5LGNleD0yLGNvbD1cInJlZFwiKSJ9
Recuerda que R te permite mucho más control sobre los símbolos con la función symbols():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJkZiA8LSBkYXRhLmZyYW1lKHgxPTE6MTAsIFxuICAgICAgICAgICAgICAgICB4Mj1zYW1wbGUoMTA6OTksIDEwKSwgXG4gICAgICAgICAgICAgICAgIHgzPTEwOjEpXG5zeW1ib2xzKHg9ZGYkeDEsIFxuICAgICAgICB5PWRmJHgyLCBcbiAgICAgICAgY2lyY2xlcz1kZiR4MywgXG4gICAgICAgIGluY2hlcz0xLzMsIFxuICAgICAgICBhbm49RiwgXG4gICAgICAgIGJnPVwic3RlZWxibHVlMlwiLCBcbiAgICAgICAgZmc9TlVMTCkifQ==

En este gráfico, los círculos toman los valores de df$x3 como radios, mientras que el argumento inches controla su tamaño. Si recibe un número positivo, los símbolos se escalan de forma que su dimensión mayor mida ese valor en pulgadas.

Ajustar el tamaño de los puntos con ggplot2

En este caso, quieres ajustar el tamaño de los puntos en tu diagrama de dispersión. Puedes hacerlo con el argumento size. Los datos de chol están cargados para ti:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6ImxpYnJhcnkoZ2dwbG90MilcblxuZ2dwbG90KGNob2wsIFxuICAgICAgIGFlcyh4PWNob2wkV0VJR0hULCB5PWNob2wkSEVJR0hUKSwgXG4gICAgICAgc2l6ZSA9IDIpICsgXG4gIGdlb21fcG9pbnQoKSJ9

También puedes pasar size a geom_point():

ggplot(chol, 
       aes(x=chol$WEIGHT, y=chol$HEIGHT)) + 
  geom_point(size = 2)

Obtendrás el mismo resultado. ¡Pruébalo sustituyendo el último bloque del ejemplo de arriba!

9. Cómo ajustar una curva suave a tus datos en R

La función loess() es quizá la solución favorita en R para esta tarea. «Ajusta una superficie polinómica determinada por uno o más predictores numéricos, usando ajuste local».

En resumen: con tus datos, usas loess() correlacionando y con x. Así defines la respuesta numérica y de uno a cuatro predictores numéricos.

Luego representas x e y y trazas las líneas con los valores predichos por lo:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJ4IDwtIDE6MTBcbnkgPC0gYygyLDQsNiw4LDcsMTIsMTQsMTYsMTgsMjApXG5cbiNFc3RpbWF0aW9ucyBiZXR3ZWVuIGRhdGFcbmxvIDwtIGxvZXNzKHl+eClcblxucGxvdCh4LHkpXG5cbmxpbmVzKHByZWRpY3QobG8pKSJ9

10. Cómo añadir barras de error en un gráfico de R

Dibujar barras de error con R base

La mala noticia: R no dibuja barras de error «de serie». La buena: puedes hacerlo sin instalar paquetes extra.

Primero, define esta función para calcular estadísticas descriptivas de tu data frame:

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
    library(plyr)

    # New version of length which can handle NA's: if na.rm==T, don't count them
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }

    # This does the summary. For each group's data frame, return a vector with
    # N, mean, and sd
    datac <- ddply(data, groupvars, .drop=.drop,
      .fun = function(xx, col) {
        c(N    = length2(xx[[col]], na.rm=na.rm),
          mean = mean   (xx[[col]], na.rm=na.rm),
          sd   = sd     (xx[[col]], na.rm=na.rm)
        )
      },
      measurevar
    )

    # Rename the "mean" column    
    datac <- rename(datac, c("mean" = measurevar))

    datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean

    # Confidence interval multiplier for standard error
    # Calculate t-statistic for confidence interval: 
    # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
    ciMult <- qt(conf.interval/2 + .5, datac$N-1)
    datac$ci <- datac$se * ciMult

    return(datac)
}

La función está tomada de esta fuente y también está disponible en la librería Rmisc.

Ahora puedes usarla para calcular estadísticas del conjunto chol, ya cargado. Con esos resultados, crea tu gráfico.

Asegúrate de inspeccionar los datos antes de empezar:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGBjaG9sYCBkYXRhc2V0XG5jaG9sYyA8LSBzdW1tYXJ5U0UoY2hvbCwgXG4gICAgICAgICAgICAgICAgICAgbWVhc3VyZXZhcj1cIkNIT0xcIiwgXG4gICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoXCJNT1JUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTTU9LRVJcIikpXG4jUGxvdCB0aGUgZGF0YVxucGxvdChjaG9sYyROLCBcbiAgICAgY2hvbGMkQ0hPTCxcbiAgICAgeWxpbT1yYW5nZShjKGNob2xjJENIT0wtY2hvbGMkc2QsIFxuICAgICAgICAgICAgICAgICAgY2hvbGMkQ0hPTCtjaG9sYyRzZCkpLFxuICAgICBwY2g9MTksIFxuICAgICB4bGFiPVwiQ2hvbGVzdGVyb2wgTWVhc3VyZW1lbnRzXCIsIFxuICAgICB5bGFiPVwiQ2hvbGVzdGVyb2wgTWVhbiArLy0gU0RcIixcbiAgICAgbWFpbj1cIlNjYXR0ZXJwbG90IFdpdGggc2QgRXJyb3IgQmFyc1wiXG4pXG5cbiNEcmF3IGFycm93cyBvZiBhIFwic3BlY2lhbFwiIHR5cGVcbmFycm93cyhjaG9sYyROLCBcbiAgICAgICBjaG9sYyRDSE9MLWNob2xjJHNkLCBcbiAgICAgICBjaG9sYyROLCBcbiAgICAgICBjaG9sYyRDSE9MK2Nob2xjJHNkLCBcbiAgICAgICBsZW5ndGg9MC4wNSwgXG4gICAgICAgYW5nbGU9OTAsIFxuICAgICAgIGNvZGU9MykifQ==

Si quieres consultar todos los argumentos de arrows(), visita esta página.

Dibujar barras de error con ggplot2

Barras de error con error estándar de la media

Primero, resume tus datos con la función summarySE() de Rmisc o usa la función definida más arriba. Luego usa el data frame resultante para trazar variables y sus barras de error, por ejemplo, el error estándar de la media.

Por comodidad, tanto los datos como la función están cargados para ti:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLCBcbiAgICAgICAgICAgICAgICAgIGNvbG91cj1NT1JUKSkgKyBcbiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2UsIFxuICAgICAgICAgICAgICAgICAgICAgIHltYXg9Q0hPTCtzZSwgXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9TU9SVCksIFxuICAgICAgICAgICAgICAgICAgd2lkdGg9LjEpICtcbiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArXG4gICAgZ2VvbV9wb2ludCgpIn0=
Si quieres cambiar la posición de las barras de error (por ejemplo, cuando se solapan), considera usar la función position_dodge():
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxucGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4xKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLCBcbiAgICAgICAgICAgICAgICAgIGNvbG91cj1NT1JUKSkgKyBcbiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2UsXG4gICAgICAgICAgICAgICAgICAgICAgeW1heD1DSE9MK3NlLCBcbiAgICAgICAgICAgICAgICAgICAgICBncm91cD1NT1JUKSwgXG4gICAgICAgICAgICAgICAgICB3aWR0aD0uMSwgXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wZCkgK1xuICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TU9SVCkpICtcbiAgICBnZW9tX3BvaW50KCkifQ==

Truco: si aparece el error «geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?», normalmente debes ajustar la estética de grupo.

Barras de error con intervalos de confianza

Partiendo del resumen que hiciste con summarySE(), también puedes trazar barras de error que representen intervalos de confianza. En este caso, de confianza al 95%.

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxucGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4xKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLFxuICAgICAgICAgICAgICAgICAgY29sb3VyPU1PUlQpKSArIFxuICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q0hPTC1jaSwgXG4gICAgICAgICAgICAgICAgICAgICAgeW1heD1DSE9MK2NpLCBcbiAgICAgICAgICAgICAgICAgICAgICBncm91cD1NT1JUKSwgXG4gICAgICAgICAgICAgICAgICB3aWR0aD0uMSwgXG4gICAgICAgICAgICAgICAgICBjb2xvdXI9XCJibGFja1wiLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb249cGQpICtcbiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArXG4gICAgZ2VvbV9wb2ludCgpIn0=

Observa cómo ahora el color de las barras de error se fija a negro con el argumento colour.

Barras de error con desviación estándar

Por último, también puedes usar los resultados de summarySE() (paquete Rmisc) o de la función copiada arriba para trazar barras de error que representen la desviación estándar.

Concretamente, solo tendrías que ajustar los argumentos ymin y ymax que pasas a geom_errorbar():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxucGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4xKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLCBcbiAgICAgICAgICAgICAgICAgIGNvbG91cj1NT1JUKSkgKyBcbiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2QsIFxuICAgICAgICAgICAgICAgICAgICAgIHltYXg9Q0hPTCtzZC,IFxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwPU1PUlQpLCBcbiAgICAgICAgICAgICAgICAgIHdpZHRoPS4xLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb249cGQpICtcbiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArXG4gICAgZ2VvbV9wb2ludCgpIn0=

Big tip*: también echa un vistazo a esto para ver ejemplos detallados sobre cómo trazar medias y barras de error.

11. Cómo guardar un gráfico como imagen en disco

Puedes usar dev.copy() para copiar tu gráfico, creado en el dispositivo actual, al dispositivo o carpeta que especifiques.

x <- seq(0,2*pi,0.1)
y <- sin(x)
plot(x,y)
dev.copy(jpeg,
         filename="<path to your file/name.jpg>");
dev.off();
(x)
(y)

12. Cómo colocar dos gráficos de R uno al lado del otro

Colocar dos gráficos lado a lado con R base

Puedes hacerlo con comandos básicos de R:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbmQwIDwtIG1hdHJpeChybm9ybSgxNSksIG5jb2w9MylcbmQxIDwtIG1hdHJpeChybm9ybSgxNSksIG5jb2w9MylcblxuIyBTZXQgbGltaXRzIFxubGltaXRzIDwtIHJhbmdlKGQwLGQxKVxuXG4jIFNldCBncmFwaGljYWwgcGFyYW1ldGVyIGBtZnJvd2BcbnBhcihtZnJvdyA9IGMoMSwgMikpIFxuXG4jIE1ha2UgMiBib3hwbG90c1xuYm94cGxvdChkMCxcbiAgICAgICAgeWxpbT1saW1pdHMpXG5ib3hwbG90KGQxLFxuICAgICAgICB5bGltPWxpbWl0cykifQ==

Añadiendo la función par() con el argumento mfrow, especificas un vector (aquí 1 y 2): todas las figuras se dibujarán en una matriz de 1 fila y 2 columnas por filas (mfrow).

En otras palabras, los boxplots se imprimirán en una fila dentro de dos columnas.

Colocar dos gráficos lado a lado con ggplot2

Si quieres poner gráficos lado a lado y no quieres especificar límites, considera usar el paquete ggplot2.

Tus datos chol y la función summarySE() ya están cargados. Inspecciónalos en la consola de R si no estás seguro de cómo son:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiNDYWxjdWxhdGUgc29tZSBzdGF0aXN0aWNzIGZvciB0aGUgY2hvbCBkYXRhc2V0XG5jaG9sYyA8LSBzdW1tYXJ5U0UoY2hvbCwgXG4gICAgICAgICAgICAgICAgICAgbWVhc3VyZXZhcj1cIkNIT0xcIiwgXG4gICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoXCJNT1JUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTTU9LRVJcIikpXG5cbiNQbG90IHRoZSBjaG9sYyBkYXRhc2V0XG5nZ3Bsb3QoY2hvbGMsIGFlcyh4PVNNT0tFUiwgXG4gICAgICAgICAgICAgICAgICB5PUNIT0wsIFxuICAgICAgICAgICAgICAgICAgY29sb3VyPU1PUlQpKSArIFxuICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2QsIFxuICAgICAgICAgICAgICAgICAgICB5bWF4PUNIT0wrc2QsIFxuICAgICAgICAgICAgICAgICAgICBncm91cD1NT1JUKSwgXG4gICAgICAgICAgICAgICAgd2lkdGg9LjEsIFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBkKSArIFxuICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArIFxuICBnZW9tX3BvaW50KCkgKyBcbiAgZmFjZXRfZ3JpZCguIH4gTU9SVCkifQ==

Nota cómo añades la función facet_grid() para indicar que quieres dos gráficos lado a lado. El elemento usado para determinar cómo se dibujan es MORT, como puedes ver arriba.

Colocar más gráficos lado a lado con gridExtra

Para imprimir gráficos lado a lado, puedes usar el paquete gridExtra; asegúrate de tenerlo instalado y activado, y ejecuta algo así:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdyaWRFeHRyYWAgYW5kIGBnZ3Bsb3QyYFxubGlicmFyeShncmlkRXh0cmEpXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgUGxvdFxucGxvdDEgPC0gcXBsb3QoMSlcbnBsb3QyIDwtIHFwbG90KDEpXG5cbiMgQXJyYW5nZSBgcGxvdDFgIGFuZCBgcGxvdDJgXG5ncmlkLmFycmFuZ2UocGxvdDEsIFxuICAgICAgICAgICAgIHBsb3QyLCBcbiAgICAgICAgICAgICBuY29sPTIpIn0=

Nota cómo aquí también determinas cómo aparecerán los dos gráficos gracias al argumento ncol.

Colocar más gráficos lado a lado con lattice

Al igual que con ggplot2, el paquete lattice no requiere especificar límites ni la forma de imprimir los gráficos lado a lado.

En su lugar, usas bwplot() para hacer gráficos de enrejado (trellis) con el tipo de gráfico de boxplot. Los gráficos trellis muestran una variable o la relación entre variables, condicionados a una o más variables.

En este caso, si usas el conjunto de datos chol (que puedes encontrar aquí o cargar con read.table()), muestras la variable CHOL por separado para cada combinación de niveles de los factores SMOKE y MORT.

¡Ten en cuenta que los datos ya están cargados en el bloque de DataCamp Light de abajo!

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBgbGF0dGljZWBcbmxpYnJhcnkobGF0dGljZSlcblxuI1Bsb3QgdHdvIHBsb3RzIHNpZGUgYnkgc2lkZVxuYndwbG90KH4gQ0hPTHxTTU9LRVIrTU9SVCxcbiAgICAgICBjaG9sKSJ9

Colocar gráficos lado a lado con gridBase

Otra forma de poner dos gráficos lado a lado es usando el paquete gridBase, que se encarga de la «integración de gráficos base y grid». Esto es útil cuando quieres poner un gráfico base de R y un ggplot lado a lado.

Funciona así: primero, activa los paquetes necesarios. En este caso, necesitas gridBase para poner los dos gráficos lado a lado, y grid y ggplot2 para crearlos:

library(grid)
library(gridBase)
library(ggplot2)

plot.new()

gl <- grid.layout(nrow=1, 
                  ncol=2)
vp.1 <- viewport(layout.pos.col=1, 
                 layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, 
                 layout.pos.row=1)
                 
pushViewport(viewport(layout=gl))
pushViewport(vp.1)

par(new=TRUE, 
    fig=gridFIG())
plot(x = 1:10, 
     y = 10:1)
     
popViewport()

pushViewport(vp.2)

ggplotted <- qplot(x=1:10,y=10:1, 'point')
print(ggplotted, newpage = FALSE)

popViewport(1)

Si lo necesitas, puedes iniciar un gráfico vacío para configurar el diseño. Como quieres que los dos gráficos se generen lado a lado, esto requiere crear un diseño de cuadrícula con una fila y dos columnas.

Ahora, rellena las celdas de la cuadrícula con viewports. Estos definen regiones rectangulares en tu dispositivo gráfico con la ayuda de coordenadas dentro de esas regiones. En este caso, es mucho más práctico usar las especificaciones de la cuadrícula descritas arriba en lugar de coordenadas x o y reales. Por eso debes usar los argumentos layout.pos.col y layout.pos.row.

Como los viewports son solo descripciones o definiciones, estos objetos deben ser empujados (pushed) al árbol de viewports antes de ver cualquier efecto en el dibujo. Usa la función pushViewport() para lograrlo.

Ahora puedes proceder a añadir la primera región rectangular vp.1 al árbol ViewPort, después de lo cual le dices a R con gridFig() que dibuje un gráfico base dentro de un viewport de grid (vp.1). El argumento fig normalmente toma las coordenadas de la región de la figura en la región de visualización del dispositivo. En este caso, usas el argumento fig para iniciar un nuevo gráfico, añadiéndolo a un gráfico existente mediante new = TRUE en la función par(). Dibujas el gráfico base y eliminas el viewport del árbol:

plot.new()

gl <- grid.layout(nrow=1, 
                  ncol=2)

vp.1 <- viewport(layout.pos.col=1, 
                 layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, 
                 layout.pos.row=1)

pushViewport(viewport(layout=gl))

pushViewport(vp.1)

par(new=TRUE, 
    fig=gridFIG())
plot(x = 1:10, 
     y = 10:1)
popViewport()

Como quieres que los dos gráficos se generen lado a lado, quieres poner uno en la primera columna y el otro en la segunda, ambos en la primera fila.

Ten en cuenta que la función pushViewport() toma la función viewport(), que a su vez contiene un argumento layout. Este último indica «un objeto de diseño de cuadrícula que divide el viewport en subregiones».

Ten en cuenta también que puedes especificar en la función popViewport() un argumento para indicar cuántos viewports quieres eliminar del árbol. Si este valor es 0, indica que quieres eliminar los viewports hasta el viewport raíz. El valor por defecto de este argumento es 1.

Ve a añadir la segunda región rectangular vp.2 al árbol ViewPort. Luego puedes hacer el ggplot y eliminar el viewport del árbol.

pushViewport(vp.2)
ggplotted <- qplot(x=1:10,
                   y=10:1, 
                   'point')
print(ggplotted, 
      newpage = FALSE)
popViewport(1)

Ten en cuenta que necesitas imprimir el objeto gráfico hecho por qplot() para dibujarlo y mostrarlo. Al mismo tiempo, especifica newpage = FALSE, de lo contrario solo verás el qplot()

Además, recuerda que el valor por defecto de viewports a eliminar en la función popViewport() es 1. Esto hace que sea redundante poner popViewport(1) en el código.

13. Cómo representar varias líneas o puntos

Usar R base para representar varias líneas o puntos en el mismo gráfico

Para representar dos o más gráficos en el mismo, empieza haciendo un gráfico básico en R. Luego, añade más líneas o puntos. En este caso, añades más líneas, así que definirás más ejes y:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAscGksMC4xKVxueTEgPC0gY29zKHgpXG5cbiMgUGxvdFxucGxvdCh4LFxuICAgICB5MSxcbiAgICAgdHlwZT1cImxcIixcbiAgICAgY29sID0gXCJyZWRcIilcblxuIyBNb3JlIGRhdGFcbnkyIDwtIHNpbih4KVxueTMgPC0gdGFuKHgpXG55NCA8LSBsb2coeClcblxuIyBMaW5lc1xubGluZXMoeCx5Mixjb2w9XCJncmVlblwiKVxubGluZXMoeCx5Mixjb2w9XCJncmVlblwiKVxubGluZXMoeCx5Myxjb2w9XCJibGFja1wiKVxubGluZXMoeCx5NCxjb2w9XCJibHVlXCIpIn0=

Luego, verás que estas líneas se dibujan usando la función lines().

Esto da el siguiente resultado:

Ten en cuenta que la función lines() toma tres argumentos: el eje x, el eje y que quieres representar y el color (representado con el argumento col). También puedes incluir las siguientes características:

Característica Argumento Entrada
Tipo de línea lty Entero o cadena de caracteres
Grosor de línea lwd Entero
Tipo de gráfico pch Entero o carácter único
Estilo final de línea lend Entero o cadena
Estilo unión de línea ljoin Entero o cadena
Límite de inglete lmitre Entero < 1

Aquí tienes algunos ejemplos:

lines(x,y2,col="green", lty = 2, lwd = 3)
lines(x,y2,col="green", lty = 5, lwd = 2, pch = 2)
lines(x,y3,col="black", lty = 3, lwd = 5, pch = 3, lend = 0, ljoin = 2)
lines(x,y4,col="blue", lty = 1, lwd = 2, pch = 3, lend = 2, ljoin = 1, lmitre = 2)

Ten en cuenta que el argumento pch no funciona muy bien con la función lines() y que es mejor usarlo solo con points().

Truco: si quieres representar puntos en el mismo gráfico, puedes usar la función points():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAscGksMC4xKVxueTUgPC0geF4zXG5cbiMgUG9pbnRzXG5wbG90HMoeCxcbiAgICAgICB5NSxcbiAgICAgICBjb2w9XCJ5ZWxsb3dcIikifQ==

Puedes añadir los mismos argumentos a la función points() que usaste con lines() y que aparecen arriba. Sin embargo, hay algunas adiciones:

Característica Argumento Entrada
Color de fondo (relleno) bg Solo si pch = 21:25
Expansión de carácter (o símbolo) cex Entero

Ejemplos de código de estos argumentos son los siguientes:

points(x,y4,col="blue", pch=21, bg = "red") 
points(x, y5, col="yellow", pch = 5, bg = "blue") 
Si incorporas estos cambios al gráfico que ves arriba, obtendrás el siguiente resultado:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAscGksMC4xKVxueTEgPC0gY29zKHgpXG5cbiNiYXNpYyBncmFwaGljYWwgb2JqZWN0XG5wbG90KHgseTEsdHlwZT1cImxcIiAsY29sID0gXCJyZWRcIilcblxuIyBNb3JlIGRhdGFcbnkyIDwtIHNpbih4KVxueTMgPC0gdGFuKHgpXG55NCA8LSBsb2coeClcbnk1IDwtIHheM1xuXG4jZmlyc3QgbGF5ZXJcbmxpbmVzKHgseTIsY29sPVwiZ3JlZW5cIiwgbHR5ID0gMSwgbHdkID0gMykgXG4jc2Vjb25kIGxheWVyXG5saW5lcyh4LHkyLGNvbD1cImdyZWVuXCIsIGx0eSA9IDMsIGx3ZCA9IDIsIHBjaCA9IDIpIFxuI3RoaXJkIGxheWVyXG5saW5lcyh4LHkzLGNvbD1cImJsYWNrXCIsIGx0eSA9IDIsIGx3ZCA9IDEsIHBjaCA9IDMsIGxlbmQgPSAwLCBsam9pbiA9IDIpIFxuI2ZvdXJ0aCBsYXllclxucG9pbnRzKHgseTQsY29sPVwiYmx1ZVwiLCBwY2g9MjEsIGJnID0gXCJyZWRcIikgXG4jZmlmdGggbGF5ZXJcbnBvaW50cyh4LCB5NSwgY29sPVwieWVsbG93XCIsIHBjaCA9IDI0LCBiZyA9IFwiYmx1ZVwiKSAifQ==

Usar ggplot2 para representar varias líneas o puntos en un gráfico

El paquete ggplot2 te permite crear capas cómodamente, lo que te permite representar dos o más gráficos en el mismo gráfico de R sin dificultades:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgRGF0YVxueCA8LSAxOjEwXG55MSA8LSBjKDIsNCw2LDgsNywxMiwxNCwxNiwxOCwyMClcbnkyIDwtIHJub3JtKDEwLCBtZWFuID0gNSlcbmRmIDwtIGRhdGEuZnJhbWUoeCwgeTEsIHkyKVxuXG4jIGJhc2ljIGdyYXBoaWNhbCBvYmplY3RcbmdncGxvdChkZiwgYWVzKHgpKSArICBcbiAgIyBmaXJzdCBsYXllclxuICBnZW9tX2xpbmUoYWVzKHk9eTEpLCBcbiAgICAgICAgICAgIGNvbG91cj1cInJlZFwiKSArIFxuICAjIHNlY29uZCBsYXllclxuICBnZW9tX2xpbmUoYWVzKHk9eTIpLCAgICAgIFxuICAgICAgICAgICAgY29sb3VyPVwiZ3JlZW5cIikgIn0=

14. Cómo fijar la relación de aspecto de tus gráficos en R

Si quieres guardar tu gráfico como imagen donde los ejes sean proporcionales a su tamaño, es señal de que quieres fijar la relación de aspecto.

Ajustar la relación de aspecto con R base

Cuando trabajas con comandos básicos de R para producir tus gráficos, puedes añadir el argumento asp de la función plot(), completado con un entero, para establecer la relación de aspecto. Mira este primer ejemplo sin relación de aspecto definida:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAsMipwaSwwLjEpXG55IDwtIHNpbih4KVxuXG4jIFBsb3RcbnBsb3QoeCx5KSJ9
Compara esto ahora con el gráfico donde la relación de aspecto se define con el argumento asp:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAsMipwaSwwLjEpXG55IDwtIHNpbih4KVxuXG4jIFBsb3RcbnBsb3QoeCxcbiAgICAgeSwgXG4gICAgIGFzcD0yKSJ9

Ajustar la relación de aspecto con ggplot2

Para fijar la relación de aspecto en gráficos ggplot2, añade la función coord_fixed(), que proporciona un «sistema de coordenadas de escala fija [que] fuerza una relación especificada entre la representación física de las unidades de datos en los ejes».

En otras palabras, esta función te permite especificar un número de unidades en el eje y que es equivalente a una unidad en el eje x. El valor por defecto es siempre 1, lo que significa que una unidad en el eje x tiene la misma longitud que una unidad en el eje y. Si tu relación se establece en un valor más alto, las unidades en el eje y son más largas que las unidades en el eje x y viceversa.

Compara los siguientes ejemplos:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgRGF0YVxuZGYgPC0gZGF0YS5mcmFtZSh4ID0gcnVuaWYoMTAwLCAwLCA1KSxcbiAgICAgICAgICAgICAgICAgeSA9IHJ1bmlmKDEwMCwgMCwgNSkpXG5cbiMgUGxvdFxuZ2dwbG90KGRmLCBhZXMoeD14LCB5PXkpKSArIGdlb21fcG9pbnQoKSJ9
frente a
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgRGF0YVxuZGYgPC0gZGF0YS5mcmFtZSh4ID0gcnVuaWYoMTAwLCAwLCA1KSxcbiAgICAgICAgICAgICAgICAgeSA9IHJ1bmlmKDEwMCwgMCwgNSkpXG5cbiMgUGxvdFxuZ2dwbG90KGRmLCBhZXMoeD14LCB5PXkpKSArIFxuICBnZW9tX3BvaW50KCkgKyBcbiAgY29vcmRfZml4ZWQocmF0aW89MSkifQ==

Ajustar la relación de aspecto con MASS

También puedes considerar usar el paquete MASS, que incluye la función eqscplot(): produce gráficos con escalas geométricamente iguales. Esto lo hace para diagramas de dispersión:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBpbiBgTUFTU2BcbmxpYnJhcnkoTUFTUylcblxuIyBEYXRhXG54ID0gY2hvbCRIRUlHSFRcbnkgPSBjaG9sJFdFSUdIVFxueiA9IGFzLm51bWVyaWMoY2hvbCRNT1JUKVxuXG4jIFBsb3QgXG5lcXNjcGxvdCh4LCBcbiAgICAgICAgIHksIFxuICAgICAgICAgcmF0aW8gPSAxLCBcbiAgICAgICAgIGNvbD1jKFwicmVkXCIsIFwiZ3JlZW5cIiksIFxuICAgICAgICAgcGNoPWMoMSwyKSkifQ==

Truco: ¡te irá bien iniciar un nuevo marco de gráfico antes de ejecutar el código anterior!

Ten en cuenta que puedes dar argumentos adicionales a la función eqscplot() para personalizar el aspecto del diagrama de dispersión.

15. Para qué sirven hjust y vjust en ggplot2

Básicamente, usas estos argumentos cuando quieres establecer la posición del texto en tu ggplot. hjust te permite definir la justificación horizontal, mientras que vjust está pensado para controlar la justificación vertical. Consulta la documentación sobre geom_text() para más información.

Para demostrar qué ocurre exactamente, puedes crear un data frame a partir de todas las combinaciones de factores con la función expand.grid():

hjustvjust <- expand.grid(hjust=c(0, 0.5, 1),
                          vjust=c(0, 0.5, 1),
                          angle=c(0, 45, 90),
                          text="Text"
                          )

Ten en cuenta que hjust y vjust solo pueden tomar valores entre 0 y 1.

  • 0 significa que el texto está justificado a la izquierda; en otras palabras, todo el texto está alineado con el margen izquierdo. Esto es lo que sueles ver al trabajar con editores de texto como Microsoft Word.
  • 1 significa que el texto está justificado a la derecha: todo el texto está alineado con el margen derecho.
Luego, puedes representar el data frame que acabas de crear con la función ggplot(), definiendo el eje x e y como hjust y vjust respectivamente:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImhqdXN0dmp1c3QgPC0gZXhwYW5kLmdyaWQoaGp1c3Q9YygwLCAwLjUsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdD1jKDAsIDAuNSwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlPWMoMCwgNDUsIDkwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIiwic2FtcGxlIjoibGlicmFyeShnZ3Bsb3QyKVxuZ2dwbG90KGhqdXN0dmp1c3QsIGFlcyh4PWhqdXN0LCBcbiAgICAgICAgICAgICAgIHk9dmp1c3QpKSArIFxuICAgIGdlb21fcG9pbnQoKSArXG4gICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD10ZXh0LCBcbiAgICAgICAgICAgICAgICAgIGFuZ2xlPWFuZ2xlLCBcbiAgICAgICAgICAgICAgICAgIGhqdXN0PWhqdXN0LCBcbiAgICAgICAgICAgICAgICAgIHZqdXN0PXZqdXN0KSkgKyBcbiAgICBmYWNldF9ncmlkKH5hbmdsZSkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwLCAwLjUsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kPWMoMCwgMC4yKSkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLCAwLjUsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kPWMoMCwgMC4yKSkifQ==

Observa también cómo los argumentos hjust y vjust se añaden a geom_text(), que se encarga de las anotaciones textuales del gráfico.

En el gráfico de arriba ves que el texto en el punto (0,0) está alineado a la izquierda, tanto horizontal como verticalmente. Por otro lado, el texto en el punto (1,1) está alineado a la derecha tanto en dirección horizontal como vertical. El punto (0.5,0.5) está justo en el medio: no está realmente alineado a la izquierda ni a la derecha en lo que respecta a las direcciones horizontal y vertical.

Ten en cuenta que cuando estos argumentos se definen para cambiar el texto del eje, la alineación horizontal para el texto del eje se define en relación con todo el gráfico, ¡no con el eje x!
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJsaWJyYXJ5KGdncGxvdDIpXG5kZiA8LSBkYXRhLmZyYW1lKHg9TEVUVEVSU1sxOjNdLFxuICAgICAgICAgICAgICAgICB5PTE6MylcbnAgPC0gZ2dwbG90KGRmLCBhZXMoeCx5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHlsYWIoXCJWZXJ5IGxvbmcgbGFiZWwgZm9yIHlcIikgKyBcbiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChhbmdsZT0wKSlcblxuXG5wMSA8LSBwICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChoanVzdD0wKSkgKyB4bGFiKFwiWC1heGlzIGF0IGhqdXN0PTBcIilcbnAyIDwtIHAgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsgeGxhYihcIlgtYXhpcyBhdCBoanVzdD0wLjVcIilcbnAzIDwtIHAgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGhqdXN0PTEpKSArIHhsYWIoXCJYLWF4aXMgYXQgaGp1c3Q9MVwiKVxuXG5saWJyYXJ5KGdyaWRFeHRyYSlcbmdyaWQuYXJyYW5nZShwMSwgcDIsIHAzKSJ9
Además, prueba por ti mismo qué hace definir el argumento vjust para cambiar el texto del eje en la representación de tu gráfico:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJsaWJyYXJ5KGdncGxvdDIpXG5kZiA8LSBkYXRhLmZyYW1lKHg9YyhcImFcXG5hXCIsXCJiXCIsXCJjZGVmZ2hpamtcIixcImxcIiksXG4gICAgICAgICAgICAgICAgIHk9MTo0KVxucCA8LSBnZ3Bsb3QoZGYsIGFlcyh4LHkpKSArIGdlb21fcG9pbnQoKVxuXG5wMSA8LSBwICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHZqdXN0PTAsIGNvbG91cj1cInJlZFwiKSkgKyBcbiAgICAgICAgeGxhYihcIlgtYXhpcyBsYWJlbHMgYWxpZ25lZCB3aXRoIHZqdXN0PTBcIilcbnAyIDwtIHAgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQodmp1c3Q9MC41LCBjb2xvdXI9XCJyZWRcIikpICsgXG4gICAgICAgIHhsYWIoXCJYLWF4aXMgbGFiZWxzIGFsaWduZWQgd2l0aCB2anVzdD0wLjVcIilcbnAzIDwtIHAgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQodmp1c3Q9MSwgY29sb3VyPVwicmVkXCIpKSArIFxuICAgICAgICB4bGFiKFwiWC1heGlzIGxhYmVscyBhbGlnbmVkIHdpdGggdmp1c3Q9MVwiKVxuXG5cbmxpYnJhcnkoZ3JpZEV4dHJhKVxuZ3JpZC5hcnJhbmdlKHAscDEscDIscDMpIn0=

Para ir a la excelente discusión original, de la que se adoptó el código anterior, haz clic aquí.

Como nota final…

Vale la pena echar un vistazo a este artículo, que enumera 10 consejos para que tus gráficos en R se vean lo mejor posible.

Además, si quieres saber más sobre visualización de datos, considera revisar el curso interactivo de DataCamp sobre visualización de datos con ggvis, impartido por Garrett Grolemund, autor de "Hands on Programming with R" y "Data Science with R".

¡O quizás te interese nuestro curso sobre informes con R Markdown!

Temas
R
Ciencia de datos
Visualización de datos

Más sobre R

Curso

Introducción a la visualización de datos con ggplot2

4 h
188.5K
Aprende a producir visualizaciones de datos significativas y llamativas con ggplot2 y comprende la gramática de los gráficos.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado
R Project

blog

Las 8 mejores ideas de proyectos R para 2026

Descubre qué es R y todas las ventajas de utilizarlo, con ejemplos e ideas nuevas para un proyecto.
Elena Kosourova's photo

Elena Kosourova

14 min

Tutorial

Tipos de gráficos de datos y cómo crearlos en Python

Explore varios tipos de gráficos de datos, desde los más comunes hasta los más avanzados y poco convencionales, qué muestran, cuándo utilizarlos, cuándo evitarlos y cómo crearlos y personalizarlos en Python.
Elena Kosourova's photo

Elena Kosourova

15 min

Tutorial

Cómo hacer un histograma ggplot2 en R

Aprenda a hacer un histograma ggplot2 en R. Haga histogramas en R basándose en la gramática de los gráficos.

Kevin Babitz

15 min

Tutorial

Cómo hacer un histograma en R básico: 6 pasos con ejemplos

Aprende a crear un histograma con R básico utilizando la función hist(). En 6 sencillos pasos (con ejemplos) puedes hacer un histograma básico en R para un análisis exploratorio.

Kevin Babitz

10 min

Tutorial

Paquetes R: Tutorial para principiantes

Una introducción a los paquetes de R basada en 11 de las preguntas más frecuentes de los usuarios.
DataCamp Team's photo

DataCamp Team

15 min

Tutorial

Tutorial sobre el uso de funciones en R

Descubra qué son las funciones R, los diferentes tipos de funciones en R y cómo crear sus propias funciones en R.
Javier Canales Luna's photo

Javier Canales Luna

11 min

Ver MásVer Más