Como definir limites para eixos nas plotagens ggplot2 R?

358

Traço o seguinte:

library(ggplot2)    

carrots <- data.frame(length = rnorm(500000, 10000, 10000))
cukes <- data.frame(length = rnorm(50000, 10000, 20000))
carrots$veg <- 'carrot'
cukes$veg <- 'cuke'
vegLengths <- rbind(carrots, cukes)

ggplot(vegLengths, aes(length, fill = veg)) +
 geom_density(alpha = 0.2)

Agora diga que só quero plotar a região entre x=-5000para 5000, em vez de todo o intervalo.

Como eu posso fazer isso?

David B
fonte

Respostas:

585

Basicamente, você tem duas opções

scale_x_continuous(limits = c(-5000, 5000))

ou

coord_cartesian(xlim = c(-5000, 5000)) 

Onde o primeiro remove todos os pontos de dados fora do intervalo especificado e o segundo apenas ajusta a área visível. Na maioria dos casos, você não veria a diferença, mas se você ajustasse algo aos dados, provavelmente alteraria os valores ajustados.

Você também pode usar a função abreviada xlim(ou ylim), que, como a primeira opção, remove os pontos de dados fora do intervalo especificado:

+ xlim(-5000, 5000)

Para mais informações, verifique a descrição de coord_cartesian.

A folha de dicas do RStudio para ggplot2torna isso bem claro visualmente. Aqui está uma pequena seção dessa folha de dicas:

insira a descrição da imagem aqui

Distribuído sob CC BY .

midtiby
fonte
16
há também agora library(scales); ... + scale_x_continuous(limits = c(-5000, 5000), oob=squish)(o padrão é oob=censor); ver ?squish, ?censor: groups.google.com/forum/#!topic/ggplot2/AsJ6xpmR9tU
Ben Bolker
5
NB isso pode ser problemático se você está lidando com linhas / polígonos onde alguns vértices estão fora dos limites, como todo o objeto é removido da trama
geotheory
11
@geotheory: isso também vale para a coord_cartesianabordagem?
Nick Stauner
11
Não, eu deveria ter sido mais específico, apenas o primeiro método
geotheory
Na prática, para fins de 'impressão', coord_cartesian(xlim = é provável que você também precise redefinir ylime redefinir as quebras de etiqueta e grade.
PatrickT
44

Nota rápida: se você também estiver usando coord_flip()para girar os eixos xe y, não poderá definir limites de alcance usando coord_cartesian()porque essas duas funções são exclusivas (veja aqui ).

Felizmente, essa é uma solução fácil; defina seus limites da seguinte coord_flip()maneira:

p + coord_flip(ylim = c(3,5), xlim = c(100, 400))

Isso apenas altera o intervalo visível (ou seja, não remove os pontos de dados).

Conta
fonte
Eu pergunta semelhante, mas mais difícil postada aqui stackoverflow.com/questions/61531149/… sobre como limitar apenas um lado
IVIM