Corrección del eje Y máximo y mínimo

Resuelto Weiss asked hace 54 años • 0 respuestas

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)))


ingrese la descripción de la imagen aquí

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?

ingrese la descripción de la imagen aquí

Weiss avatar Jan 01 '70 08:01 Weiss
Aceptado

Creo que tu pregunta es que el eje y no muestra lo que necesitas. Hay algunos lugares donde trabajas con seqand rangeand 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, -30en lugar de lo que 30se 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)))

graficos base

Como sugerencia, es posible ggplot2que 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 ggplot2solo (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")

ggplot de los mismos datos

Notas:

  • lstautomáticamente nombra los objetos como sus nombres de objeto; de lo contrario, es solo list, 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 usar color=sourcediferentes colores con la misma facilidad (y luego reemplazarlos scale_shape_manualcon scale_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é ggplot2se hace de forma predeterminada.
  • De manera similar a la trama de gráficos base, muestro profundidades positivas; Si lo desea -30, elimine el archivo labels=~abs(.).
r2evans avatar Feb 16 '2024 14:02 r2evans