Bagaimana cara menghapus spasi antara sumbu & area-plot di ggplot2?


113

Saya memiliki dataframe berikut:

uniq <- structure(list(year = c(1986L, 1987L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 1986L, 1987L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 1986L, 1987L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L), uniq.loc = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("u.1", "u.2", "u.3"), class = "factor"), uniq.n = c(1, 1, 1, 2, 5, 4, 2, 16, 16, 10, 15, 14, 8, 12, 20, 11, 17, 30, 17, 21, 22, 19, 34, 44, 56, 11, 0, 0, 3, 3, 7, 17, 12, 21, 18, 10, 12, 9, 7, 11, 25, 14, 11, 17, 12, 24, 59, 17, 36, 50, 59, 12, 0, 0, 0, 1, 4, 6, 3, 3, 9, 3, 4, 2, 5, 2, 12, 6, 8, 8, 3, 2, 9, 5, 20, 7, 10, 8), uniq.p = c(100, 100, 25, 33.3, 31.2, 14.8, 11.8, 40, 37.2, 43.5, 48.4, 56, 40, 48, 35.1, 35.5, 47.2, 54.5, 53.1, 44.7, 24.4, 46.3, 37.8, 43.6, 44.8, 35.5, 0, 0, 75, 50, 43.8, 63, 70.6, 52.5, 41.9, 43.5, 38.7, 36, 35, 44, 43.9, 45.2, 30.6, 30.9, 37.5, 51.1, 65.6, 41.5, 40, 49.5, 47.2, 38.7, 0, 0, 0, 16.7, 25, 22.2, 17.6, 7.5, 20.9, 13, 12.9, 8, 25, 8, 21.1, 19.4, 22.2, 14.5, 9.4, 4.3, 10, 12.2, 22.2, 6.9, 8, 25.8)), .Names = c("year", "uniq.loc", "uniq.n", "uniq.p"), class = "data.frame", row.names = c(NA, -78L))

Ketika saya membuat plot-area dengan:

ggplot(data = uniq) + 
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +
  scale_x_continuous(limits=c(1986,2014)) +
  scale_y_continuous(limits=c(0,101)) +
  theme_bw()

Saya mendapatkan hasil ini:

masukkan deskripsi gambar di sini

Namun, saya ingin menghapus ruang antara sumbu dan plot sebenarnya. Ketika saya menambahkan theme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))saya mendapatkan pesan kesalahan berikut:

Error in theme(panel.grid = element_blank(), panel.margin = unit(-0.8,  : 
  could not find function "unit"

Ada saran tentang cara mengatasi masalah ini?


3
Saya pikir Anda perlu memuat paket grid secara eksplisit untukunit
Tyler Rinker

@TylerRinker Thanx! Saya tidak mendapatkan pesan kesalahan lagi. Saya sudah memecahkan masalah dengan cara lain, tetapi ini adalah pengingat yang bagus untuk masa depan ketika saya ingin mengatur margin.
Jaap

3
Ini terkadang disebut sebagai tata letak yang ketat. Sebutkan ini di sini agar mesin pencari dapat mengambilnya.
anonim

Jawaban:


192

Pembaruan: Lihat jawaban @ divibisan untuk kemungkinan lebih lanjut di versi terbaru.


Dari ?scale_x_continuoustentang expand-argumen:

Vektor konstanta perluasan jangkauan digunakan untuk menambahkan beberapa padding di sekitar data, untuk memastikan bahwa mereka ditempatkan agak jauh dari sumbu. Defaultnya adalah memperluas skala sebesar 5% di setiap sisi untuk variabel kontinu, dan 0,6 unit di setiap sisi untuk variabel diskrit.

Masalahnya demikian dipecahkan dengan menambahkan expand = c(0,0)ke scale_x_continuousdan scale_y_continuous. Ini juga menghilangkan kebutuhan untuk menambahkan panel.marginparameter.

Kode:

ggplot(data = uniq) + 
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +
  scale_x_continuous(limits = c(1986,2014), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,101), expand = c(0, 0)) +
  theme_bw() +
  theme(panel.grid = element_blank(),
        panel.border = element_blank())

Hasil: bagan area plot tanpa celah


41

Dari ggplot2 version 3, ada expand_scale()fungsi yang bisa Anda berikan ke expand=argumen yang memungkinkan Anda menentukan nilai perluasan yang berbeda untuk setiap sisi skala.

Sejak ggplot2 version 3.3.0, expand_scale()telah ditinggalkan dalam mendukung expansionyang sebaliknya berfungsi identik.

Ini juga memungkinkan Anda memilih apakah Anda ingin perluasan menjadi ukuran absolut (gunakan add=parameter) atau persentase dari ukuran plot (gunakan mult=parameter):

ggplot(data = uniq) + 
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +
  scale_x_continuous(limits = c(1986,2014), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,101), expand = expansion(mult = c(0, .1))) +
  theme_bw()

masukkan deskripsi gambar di sini


Catatan cepat: expand_scale()telah berubah menjadi expansion()tetapi berfungsi sama dalam kasus ini.
Molx

1
@Molx Terima kasih, saya telah memperbarui jawabannya!
divibisan

14

Pilihan lain yang menghasilkan hasil yang identik, menggunakan coord_cartesianalih-alih skala posisi kontinu (x & y):

ggplot(data = uniq) +  
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +  
  coord_cartesian(xlim = c(1986,2014), ylim = c(0,101))+
  theme_bw() + theme(panel.grid=element_blank(), panel.border=element_blank())

2
Alternatif yang bagus, +1. Namun, Anda masih memerlukan scales_x/y_continuousbagian - bagian tersebut jika Anda ingin menentukan jeda, dll.
Jaap

atau, bahkan lebih mudah, mengatur expand = FALSEdi coord_cartesianseperti yang disarankan di @Marcus komentar di pertanyaan ini
Tjebo

@Tjebo Keluarannya sedikit berbeda tetapi pada kenyataannya mungkin lebih dekat dengan hasil yang diharapkan oleh OP. Saya akan menambahkannya nanti ke jawaban saya. Terima kasih.
mpalanco
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.