Aumenta il numero di tick dell'asse


191

Sto generando grafici per alcuni dati, ma il numero di tick è troppo piccolo, ho bisogno di più precisione sulla lettura.

C'è un modo per aumentare il numero di tick dell'asse in ggplot2?

So di poter dire a ggplot di usare un vettore come tick dell'asse, ma quello che voglio è aumentare il numero di tick, per tutti i dati. In altre parole, voglio che il numero di tick sia calcolato dai dati.

Forse ggplot lo fa internamente con qualche algoritmo, ma non sono riuscito a trovare come lo fa, per cambiare in base a ciò che voglio.

Risposte:


188

Puoi sovrascrivere le scale predefinite di ggplots modificando scale_x_continuouse / o scale_y_continuous. Per esempio:

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

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

Ti dà questo:

inserisci qui la descrizione dell'immagine

E scavalcare le scale può darti qualcosa del genere:

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

inserisci qui la descrizione dell'immagine

Se vuoi semplicemente "ingrandire" una parte specifica di un grafico, guarda xlim()e ylim()rispettivamente. Una buona intuizione può essere trovata anche qui per comprendere anche gli altri argomenti.


4
In realtà il punto sarebbe quello di "generalizzare" l' byargomento, a diverse scale di numeri, cioè 0,5 è un buon valore per questi dati che intervallo è c (-3,3), ma non è un buon intervallo per un dato che intervallo è c (0,5000). C'è qualche funzione che lo calcola?
João Daniel,

3
@ JoãoDaniel - Intendo ggplot fa un lavoro decente in questo automaticamente. Se non sta producendo un insieme soddisfacente di risultati, non sono sicuro che ci sia una funzione integrata per fornire qualcosa di diverso. Il livello di dettaglio che desideri sarà specifico per la tua trama, ma forse pensa ad alcuni casi di test e al tuo livello di dettaglio specificato per identificare uno schema ... se questo fosse un diagramma a scatole, qualcosa di simile max-min/30è un "secchio" piuttosto comune dimensioni ... ma questo potrebbe essere o meno un buon punto di partenza per te.
Chase

4
Che dire di valori categorici sull'asse x come i mesi dell'anno per le serie temporali?
Scott Davis,

3
@ScottDavis dai un'occhiata al link . Puoi usarescale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel l'

Per lo zoom coord_cartesiandovrebbe essere usato invece di xlim. stackoverflow.com/questions/25685185/...
QWR

167

Sulla base del commento di Daniel Krizian , puoi anche utilizzare la pretty_breaksfunzione dalla scaleslibreria, che viene importata automaticamente:

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

Tutto quello che devi fare è inserire il numero di tick desiderato n.


Una soluzione leggermente meno utile (poiché è necessario specificare nuovamente la variabile di dati), è possibile utilizzare la prettyfunzione integrata:

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

16
Questa è chiaramente la risposta migliore! Tra l'altro ggplot importa già scalesma non aggiunge le funzioni al tuo spazio dei nomi. È quindi possibile chiamarli senza l'importazione come scales::pretty_breaks(n = 10).
mentre il

63

Puoi fornire un argomento di funzione a scale, e ggplot userà quella funzione per calcolare le posizioni dei tick.

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

81
Non è necessario creare la propria funzione number_ticks. Questo è già stato implementato in pretty_breaks {scales}. Quindi: 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) ha bisogno di require(scales)2) questo sembra impedire che le mie interruzioni compaiano in notazione scientifica, quindi 1e6 è cambiato in 1000000 ??
smci,

6
Puoi usare le R di base prettysenza il scalespacchetto, basta fornire i valori come argomento. Ad esempio:(breaks=pretty(dat$x, n=10))
Molx,

@smci Se ggplot2 funziona, sono disponibili le scale. ggplot2 non funzionerà senza scale.
Claus Wilke,

7

La prossima versione v3.3.0 di ggplot2avrà un'opzione n.breaksper generare automaticamente interruzioni per scale_x_continuousescale_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)

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine


4

Inoltre,

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

Funziona con dati dell'asse x in scala separati o discreti (ovvero non è necessario arrotondare).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.