Bagaimana cara menetapkan batas untuk sumbu di plot ggplot2 R?

358

Saya merencanakan yang berikut ini:

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)

Sekarang katakan saya hanya ingin memplot wilayah antara x=-5000ke 5000, bukan seluruh rentang.

Bagaimana saya bisa melakukan itu?

David B
sumber

Jawaban:

585

Pada dasarnya Anda memiliki dua opsi

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

atau

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

Di mana yang pertama menghapus semua titik data di luar rentang yang diberikan dan yang kedua hanya menyesuaikan area yang terlihat. Dalam kebanyakan kasus Anda tidak akan melihat perbedaannya, tetapi jika Anda memasukkan sesuatu ke dalam data, itu mungkin akan mengubah nilai yang dipasang.

Anda juga dapat menggunakan fungsi steno xlim(atau ylim), yang seperti opsi pertama menghapus titik data di luar rentang yang diberikan:

+ xlim(-5000, 5000)

Untuk informasi lebih lanjut, periksa deskripsi coord_cartesian.

The RStudio cheatsheet untuk ggplot2merek ini cukup jelas secara visual. Ini adalah bagian kecil dari lembar contekan itu:

masukkan deskripsi gambar di sini

Didistribusikan di bawah CC BY .

midtiby
sumber
16
ada juga sekarang library(scales); ... + scale_x_continuous(limits = c(-5000, 5000), oob=squish)(standarnya adalah oob=censor); lihat ?squish, ?censor: groups.google.com/forum/#!topic/ggplot2/AsJ6xpmR9tU
Ben Bolker
5
NB. ini mungkin bermasalah jika Anda berurusan dengan garis / poligon di mana beberapa simpul berada di luar batas, karena seluruh objek dihapus dari plot
geotheory
1
@geotheory: apakah itu benar untuk coord_cartesianpendekatan ini?
Nick Stauner
1
Tidak, saya seharusnya lebih spesifik, hanya metode pertama
geotheory
Dalam praktiknya, untuk keperluan 'mencetak', coord_cartesian(xlim = Anda mungkin perlu mengatur ulang ylimjuga, dan mengatur ulang label dan kisi-kisi.
PatrickT
44

Catatan cepat: jika Anda juga menggunakan coord_flip()untuk membalik x dan sumbu y, Anda tidak akan dapat menetapkan batas batas menggunakan coord_cartesian()karena kedua fungsi tersebut eksklusif (lihat di sini ).

Untungnya, ini adalah perbaikan yang mudah; atur batas Anda menjadi coord_flip()seperti ini:

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

Ini hanya mengubah rentang yang terlihat (yaitu tidak menghapus titik data).

Tagihan
sumber
Saya serupa tetapi pertanyaan yang lebih sulit diposting di sini stackoverflow.com/questions/61531149/… tentang cara membatasi satu SISI SAJA
IVIM