Batasi sumbu ggplot2 tanpa menghapus data (batas luar): zoom

106

Jika Anda menentukan batas sumbu di ggplot, titik-titik terluar akan dihapus. Ini bagus untuk titik, tetapi Anda mungkin ingin memplot garis yang berpotongan dengan rentang yang ditentukan, tetapi ggplot rangeatau xlim/ylimmetode menghilangkan ini. Apakah ada cara lain untuk menentukan rentang sumbu plot tanpa menghapus data luar?

misalnya

require(ggplot2)
d = data.frame(x=c(1,4,7,2,9,7), y=c(2,5,4,10,5,3), grp=c('a','a','b','b','c','c'))
ggplot(d, aes(x, y, group=grp)) + geom_line()
ggplot(d, aes(x, y, group=grp)) + geom_line() + scale_y_continuous(limits=c(0,7))
ggplot(d, aes(x, y, group=grp)) + geom_line() + ylim(0,7)
geotheory
sumber

Jawaban:

168

Hadley menjelaskan hal ini pada hlm. 99; 133 dari buku ggplot2- nya (edisi pertama) , atau hlm. 160 - 161 jika Anda memiliki edisi kedua .

Masalahnya adalah, seperti yang Anda katakan, limitsdi dalam skala atau pengaturan ylim()menyebabkan data dibuang, karena membatasi data. Untuk zoom sejati (simpan semua data), Anda perlu menyetel batas di dalam sistem koordinat Cartesian (atau sistem koordinat lain https://ggplot2.tidyverse.org/reference/#section-coordinate-systems ). Untuk lebih lanjut lihat: http://docs.ggplot2.org/current/coord_cartesian.html

ggplot(d, aes(x, y, group=grp)) + 
    geom_line() + 
    coord_cartesian(ylim=c(0, 7))

masukkan deskripsi gambar di sini

Tyler Rinker
sumber
2
Bagaimana jika coord_cartesian bukan merupakan pilihan karena saya gunakan geom_boxplot?
Everettss
3
coord_cartesianmasih merupakan pilihan dengan geom_boxplotatau geom lainnya.
eipi10
Ya, tetapi tidak tahu bagaimana membuat plot kotak horizontal karena itu membutuhkan coord_flipdan Anda tidak dapat memiliki dua koord.
jtr13
2
Tidak apa-apa, Anda dapat menyetel ylim coord_flipalih-alih coord_cartesiandalam kasus itu.
jtr13