Aumentar el número de ticks del eje

191

Estoy generando gráficos para algunos datos, pero el número de ticks es demasiado pequeño, necesito más precisión en la lectura.

¿Hay alguna forma de aumentar el número de ticks de eje en ggplot2?

Sé que puedo decirle a ggplot que use un vector como ticks de eje, pero lo que quiero es aumentar el número de ticks, para todos los datos. En otras palabras, quiero que el número de marca se calcule a partir de los datos.

Posiblemente ggplot haga esto internamente con algún algoritmo, pero no pude encontrar cómo lo hace, para cambiar de acuerdo a lo que quiero.

João Daniel
fuente

Respuestas:

188

Puede anular las escalas predeterminadas de ggplots modificando scale_x_continuousy / o scale_y_continuous. Por ejemplo:

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))

ggplot(dat, aes(x,y)) +
  geom_point()

Te da esto:

ingrese la descripción de la imagen aquí

Y anular las escalas puede darte algo como esto:

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks = round(seq(min(dat$x), max(dat$x), by = 0.5),1)) +
  scale_y_continuous(breaks = round(seq(min(dat$y), max(dat$y), by = 0.5),1))

ingrese la descripción de la imagen aquí

Si desea simplemente "acercar" una parte específica de un gráfico, mire xlim()y ylim()respectivamente. Aquí también se puede encontrar una buena idea para comprender los otros argumentos.

Persecución
fuente
44
En realidad, el punto sería "generalizar" el byargumento, a diferentes escalas de números, es decir, 0.5 es un buen valor para este dato cuyo rango es c (-3,3), pero no es un buen rango para un dato cuyo rango es c (0,5000). ¿Hay alguna función que lo calcule?
João Daniel
3
@ JoãoDaniel - Quiero decir que ggplot hace un trabajo decente en esto automáticamente. Si no está produciendo un conjunto satisfactorio de resultados, no estoy seguro de que haya una función integrada para proporcionar algo diferente. El nivel de detalle que deseará será específico para su trama, pero tal vez piense en algunos casos de prueba y su nivel de detalle específico para identificar un patrón ... si esto fuera un diagrama de caja, algo así como max-min/30un "cubo" bastante común tamaño ... pero eso puede o no ser un buen punto de partida para usted.
Chase
44
¿Qué pasa con los valores categóricos en el eje x como los meses del año para las series temporales?
Scott Davis
3
@ScottDavis echa un vistazo al enlace . Puedes usarscale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel
Para el zoom se coord_cartesiandebe utilizar en lugar de xlim. stackoverflow.com/questions/25685185/…
qwr
167

Según el comentario de Daniel Krizian , también puede usar la pretty_breaksfunción de la scalesbiblioteca, que se importa automáticamente:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))

Todo lo que tiene que hacer es insertar la cantidad de ticks que desea n.


Una solución un poco menos útil (ya que debe especificar la variable de datos nuevamente), puede usar la prettyfunción integrada:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = pretty(dat$x, n = 10)) +
scale_y_continuous(breaks = pretty(dat$y, n = 10))
slhck
fuente
16
¡Esta es claramente la mejor respuesta! Por cierto, ggplot ya importa scalespero no agrega las funciones a su espacio de nombres. Por lo tanto, puede llamarlos sin importar como scales::pretty_breaks(n = 10).
mientras que el
63

Puede proporcionar un argumento de función a scale, y ggplot usará esa función para calcular las ubicaciones de los ticks.

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))
number_ticks <- function(n) {function(limits) pretty(limits, n)}

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks=number_ticks(10)) +
  scale_y_continuous(breaks=number_ticks(10))
apiñamiento
fuente
81
No es necesario crear una función propia number_ticks. Esto ya se ha implementado en pretty_breaks {scales}. Por lo tanto: ggplot(dat, aes(x,y)) + geom_point() + scale_x_continuous(breaks=pretty_breaks(n=10)) + scale_y_continuous(breaks=pretty_breaks(n=10))
Daniel Krizian
11
@Daniel Krizian: 1) necesita require(scales)2) esto parece evitar que mis descansos aparezcan en notación científica, por lo tanto, 1e6 se cambia a 1000000 ??
smci
66
Puede usar R base prettysin el scalespaquete, solo proporcione los valores como argumento. Por ejemplo:(breaks=pretty(dat$x, n=10))
Molx
@smci Si ggplot2 está funcionando, entonces las escalas están disponibles. ggplot2 no funcionará sin escalas.
Claus Wilke
7

La próxima versión v3.3.0 de ggplot2tendrá una opción n.breakspara generar automáticamente descansos para scale_x_continuousyscale_y_continuous

    devtools::install_github("tidyverse/ggplot2")

    library(ggplot2)

    plt <- ggplot(mtcars, aes(x = mpg, y = disp)) +
      geom_point()

    plt + 
      scale_x_continuous(n.breaks = 5)

ingrese la descripción de la imagen aquí

    plt + 
      scale_x_continuous(n.breaks = 10) +
      scale_y_continuous(n.breaks = 10)

ingrese la descripción de la imagen aquí

Tung
fuente
4

Adicionalmente,

ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks = seq(min(dat$x), max(dat$x), by = 0.05))

Funciona para datos de eje x escalados en binarios o discretos (es decir, no es necesario redondear).

bmc
fuente