Corrección del eje Y máximo y mínimo
Me gustaría mostrar un gráfico en el que los datos de remolque de plancton se muestren en el rango de 0 a 40 m BSL (por debajo del nivel del mar) y los datos de la parte superior del núcleo en una profundidad de 50 a 80 m. Por supuesto, 0 m BSL debería estar en la parte superior del eje Y, pero el código:
plankton_tow <- data.frame(DO <- c(-1.2, -0.8, -0.5, -1.5), depth = c(-10, -20, -30, -40))
core_tops <- data.frame(DO <- c(-2.0, -1.6, -1.3, -2.5), depth = c(-50, -60, -70, -80))
plankton_tow$depth <- min(plankton_tow$depth) - plankton_tow$depth
core_tops$depth <- min(core_tops$depth) - core_tops$depth
par(pty = "s")
plot(plankton_tow$DO, plankton_tow$depth, xlim = range(c(plankton_tow$DO, core_tops$DO)), ylim = c(0, min (core_tops$depth)),
xlab = expression(delta^18*O ~ "[‰] vs. PDB"), ylab = "Depth [m BSL]",
pch = 16, col = "black", xaxt = "n", yaxt = "n")
points(core_tops$DO, core_tops$depth, pch = 21, col = "black")
axis(side = 1, at = seq(min(plankton_tow$DO, core_tops$DO), max(plankton_tow$DO, core_tops$DO), by = 0.5))
axis(side = 2, at = seq(0, max(plankton_tow$depth, core_tops$depth), by = 10), labels = rev(seq(0, max(plankton_tow$depth, core_tops$depth), by = 10)))
Como pueden ver, los datos de la parte superior del núcleo, por ejemplo, están a 0 m BSL y no a 50 m bsl <... No sé por qué la resolución de profundidad no existe en este gráfico. Debí cometer algún error que no veo y lamentablemente R no me muestra mensaje de error.
Si uso: ylim = c( min(core_tops$profundidad),0. Entiendo esto: sin embargo, las muestras no están en la misma profundidad. Entonces, ¿qué estoy haciendo mal?
Creo que tu pregunta es que el eje y no muestra lo que necesitas. Hay algunos lugares donde trabajas con seq
and range
and min
/ max
, y sospecho que actualizaste todos menos uno.
Sugiero que para evitar perder accidentalmente uno (o más) de estos límites/rangos, los calcule previamente en variables.
(Fijo) Datos de muestra:
plankton_tow <- data.frame(DO = c(-1.2, -0.8, -0.5, -1.5), depth = c(-10, -20, -30, -40))
core_tops <- data.frame(DO = c(-2.0, -1.6, -1.3, -2.5), depth = c(-50, -60, -70, -80))
plankton_tow$depth <- min(plankton_tow$depth) - plankton_tow$depth
core_tops$depth <- min(core_tops$depth) - core_tops$depth
Código de trama. Estoy infiriendo que desea que los números del eje y sean números positivos que indiquen elevación negativa (profundidad positiva). Si lo desea, -30
en lugar de lo que 30
se muestra aquí, simplemente elimine la labels=
parte de axis(2, ..)
.
xlims <- range(c(plankton_tow$DO, core_tops$DO))
ylims <- c(min(core_tops$depth), 0)
par(pty = "s")
plot(plankton_tow$DO, plankton_tow$depth,
xlim = xlims, ylim = ylims,
xlab = expression(delta^18*O ~ "[‰] vs. PDB"), ylab = "Depth [m BSL]",
pch = 16, col = "black", xaxt = "n", yaxt = "n")
points(core_tops$DO, core_tops$depth, pch = 21, col = "black")
axis(side = 1, at = seq(xlims[1], xlims[2], by = 0.5))
axis(side = 2, at = seq(ylims[1], ylims[2], by = 10),
labels = abs(seq(ylims[1], ylims[2], by = 10)))
Como sugerencia, es posible ggplot2
que también le parezca una trama digna. Para usarlo, sería útil combinar los datos en un marco (con una variable "fuente" agregada).
Estoy usando dplyr
(y tibble
) con esto ya que a menudo también se instalan, pero si no quieres (o no puedes) usarlos, esto se puede modificar para que sea ggplot2
solo (con funciones base R).
library(dplyr)
library(ggplot2)
xlims <- range(c(plankton_tow$DO, core_tops$DO))
ylims <- c(min(core_tops$depth), 0)
bind_rows(tibble::lst(plankton_tow, core_tops), .id="source") |>
ggplot(aes(DO, depth, shape = source)) +
geom_point() +
scale_shape_manual(
name = NULL,
values = c(plankton_tow = 16, core_tops = 21)) +
scale_x_continuous(
name = expression(delta^18*O ~ "[‰] vs. PDB"),
limits = xlims, breaks = seq(xlims[1], xlims[2], by = 0.5)) +
scale_y_continuous(
name = "Depth [m BSL]",
limits = ylims, breaks = seq(ylims[1], ylims[2], by = 10),
labels = ~ abs(.)) +
theme_minimal() +
theme(legend.position = "bottom")
Notas:
lst
automáticamente nombra los objetos como sus nombres de objeto; de lo contrario, es sololist
, por lo que si desea controlar los nombres de las leyendas en lugar de"plankton_tow"
, simplemente configure los nombres con (por ejemplo)bind_rows(Plankton = plankton_tow, ..., .id="source")
- Yo solía
shape=source
, podrías usarcolor=source
diferentes colores con la misma facilidad (y luego reemplazarlosscale_shape_manual
conscale_color_manual
)... o puedes usar ambos si realmente quieres separarlos. - Solía
theme_minimal()
aproximarme mejor a la austeridad en blanco y negro de los gráficos básicos; siéntete libre de explorar sin esta línea para ver quéggplot2
se hace de forma predeterminada. - De manera similar a la trama de gráficos base, muestro profundidades positivas; Si lo desea
-30
, elimine el archivolabels=~abs(.)
.