Aumentar o número de marcações do eixo

188

Estou gerando gráficos para alguns dados, mas o número de ticks é muito pequeno, preciso de mais precisão na leitura.

Existe alguma maneira de aumentar o número de marcações do eixo no ggplot2?

Eu sei que posso dizer ao ggplot para usar um vetor como marcações de eixo, mas o que eu quero é aumentar o número de marcações, para todos os dados. Em outras palavras, quero que o número do tick seja calculado a partir dos dados.

Possivelmente o ggplot faz isso internamente com algum algoritmo, mas não consegui encontrar como ele faz isso, para mudar de acordo com o que eu quero.

João Daniel
fonte

Respostas:

186

Você pode substituir as escalas padrão do ggplots modificando scale_x_continuouse / ou scale_y_continuous. Por exemplo:

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

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

Dá-lhe isto:

insira a descrição da imagem aqui

E substituir as balanças pode fornecer algo assim:

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

insira a descrição da imagem aqui

Se você quiser simplesmente "aumentar o zoom" em uma parte específica de um gráfico, observe xlim()e ylim()respectivamente. Uma boa visão também pode ser encontrada aqui para entender os outros argumentos também.

correr atrás
fonte
4
Na verdade, o objetivo seria "generalizar" o byargumento, para diferentes escalas de números, ou seja, 0,5 é um bom valor para esses dados, cujo intervalo é c (-3,3), mas não é um bom intervalo para dados que variam é c (0,5000). Existe alguma função que calcula isso?
João Daniel
3
@ JoãoDaniel - Quero dizer, o ggplot faz um trabalho decente nisso automaticamente. Se não estiver produzindo um conjunto satisfatório de resultados, não tenho certeza de que haja uma função integrada para fornecer algo diferente. O nível de detalhe que você deseja será específico para seu gráfico, mas talvez pense em alguns casos de teste e no nível de detalhe especificado para identificar um padrão ... se esse fosse um boxplot, algo como max-min/30um "balde" bastante comum tamanho ... mas isso pode ou não ser um bom ponto de partida para você.
Chase
4
E quanto aos valores categóricos no eixo x, como meses do ano para séries temporais?
Scott Davis
3
@ScottDavis dê uma olhada no link . Você pode usarscale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel 11/11/19
Para o zoom coord_cartesiandeve ser usado em vez de xlim. stackoverflow.com/questions/25685185/…
qwr
166

Com base no comentário de Daniel Krizian , você também pode usar a pretty_breaksfunção da scalesbiblioteca, que é importada 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))

Tudo o que você precisa fazer é inserir o número de ticks desejados n.


Uma solução um pouco menos útil (como você precisa especificar a variável de dados novamente), você pode usar a prettyfunção interna:

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
fonte
16
Esta é claramente a melhor resposta! O ggplot já importa, scalesmas não adiciona as funções ao seu espaço para nome. Portanto, você pode chamá-los sem a importação como scales::pretty_breaks(n = 10).
enquanto
63

Você pode fornecer um argumento de função scalee o ggplot usará essa função para calcular os locais dos 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))
aglomeração
fonte
81
Não há necessidade de criar função própria number_ticks. Isso já foi implementado no pretty_breaks {scales}. Portanto: 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) precisa require(scales)2) isso parece impedir que meus intervalos apareçam em notação científica, portanto 1e6 é alterado para 1000000 ??
smci 5/05
6
Você pode usar os R's básicos prettysem o scalespacote, apenas forneça os valores como argumento. Por exemplo:(breaks=pretty(dat$x, n=10))
Molx
@smci Se o ggplot2 estiver funcionando, a balança estará disponível. O ggplot2 não funcionará sem balanças.
Claus Wilke
6

A próxima versão v3.3.0 do ggplot2terá uma opção n.breakspara gerar automaticamente quebras parascale_x_continuous escale_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)

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Tung
fonte
4

Além disso,

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

Funciona para dados do eixo x em escala discreta ou em bin (ou seja, o arredondamento não é necessário).

bmc
fonte