จะลบช่องว่างระหว่างแกนและพล็อตพื้นที่ใน ggplot2 ได้อย่างไร


113

ฉันมี dataframe ต่อไปนี้:

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

เมื่อฉันสร้างพล็อตพื้นที่ด้วย:

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

ฉันได้รับผลลัพธ์นี้:

ใส่คำอธิบายภาพที่นี่

อย่างไรก็ตามฉันต้องการลบช่องว่างระหว่างแกนกับพล็อตจริง เมื่อฉันเพิ่มtheme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

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

ข้อเสนอแนะเกี่ยวกับวิธีแก้ปัญหานี้หรือไม่?


3
ฉันคิดว่าคุณต้องโหลดแพ็คเกจกริดอย่างชัดเจนสำหรับunit
Tyler Rinker

@TylerRinker Thanx! ฉันไม่ได้รับข้อความแสดงข้อผิดพลาดอีกต่อไป ฉันแก้ปัญหาด้วยวิธีอื่นแล้ว แต่นี่เป็นการเตือนความจำที่ดีสำหรับอนาคตเมื่อฉันต้องการกำหนดระยะขอบ
Jaap

3
บางครั้งเรียกว่าเค้าโครงที่แน่นหนา พูดถึงสิ่งนี้ที่นี่เพื่อให้เครื่องมือค้นหาสามารถเลือกได้
ไม่ระบุชื่อ

คำตอบ:


192

อัปเดต:ดูคำตอบของ @ divibisanสำหรับความเป็นไปได้เพิ่มเติมในเวอร์ชันล่าสุดของ.


จาก?scale_x_continuousเกี่ยวกับ - expandอาร์กิวเมนต์:

เวกเตอร์ของค่าคงที่การขยายช่วงที่ใช้เพื่อเพิ่มช่องว่างรอบ ๆ ข้อมูลเพื่อให้แน่ใจว่ามีการวางระยะห่างจากแกน ค่าเริ่มต้นคือการขยายขนาด 5% ในแต่ละด้านสำหรับตัวแปรต่อเนื่องและ 0.6 หน่วยในแต่ละด้านสำหรับตัวแปรที่ไม่ต่อเนื่อง

ปัญหาจะแก้ไขโดยการเพิ่มจึงexpand = c(0,0)ไปและscale_x_continuous scale_y_continuousนอกจากนี้ยังขจัดความจำเป็นในการเพิ่มpanel.marginพารามิเตอร์

รหัส:

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

ผลลัพธ์: พล็อตแผนภูมิพื้นที่ที่ไม่มีช่องว่าง


41

ณ ขณะggplot2 version 3นี้มีexpand_scale()ฟังก์ชันที่คุณสามารถส่งผ่านไปยังexpand=อาร์กิวเมนต์ที่ช่วยให้คุณระบุค่าขยายที่แตกต่างกันสำหรับแต่ละด้านของมาตราส่วน

ณ วันggplot2 version 3.3.0นี้เราexpand_scale()ได้เลิกใช้งานแล้วในลักษณะexpansionที่ทำหน้าที่เหมือนกัน

นอกจากนี้ยังให้คุณเลือกได้ว่าคุณต้องการให้ส่วนขยายเป็นขนาดที่แน่นอน (ใช้add=พารามิเตอร์) หรือเปอร์เซ็นต์ของขนาดของพล็อต (ใช้mult=พารามิเตอร์):

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

ใส่คำอธิบายภาพที่นี่


หมายเหตุด่วน: expand_scale()เปลี่ยนเป็นexpansion()แต่ใช้งานได้เหมือนกันในกรณีนี้
Molx

1
@Molx ขอบคุณฉันได้อัปเดตคำตอบแล้ว!
divibisan

14

อีกทางเลือกหนึ่งที่ให้ผลลัพธ์ที่เหมือนกันคือใช้coord_cartesianแทนสเกลตำแหน่งต่อเนื่อง (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
ทางเลือกที่ดี +1 อย่างไรก็ตามคุณยังคงต้องใช้scales_x/y_continuousชิ้นส่วนหากคุณต้องการระบุช่วงพัก ฯลฯ
Jaap

หรือง่ายยิ่งขึ้นตั้งexpand = FALSEในcoord_cartesianขณะที่ข้อเสนอแนะใน @Marcus ความคิดเห็นในคำถามนี้
Tjebo

@Tjebo ผลลัพธ์แตกต่างกันเล็กน้อย แต่ในความเป็นจริงมันอาจจะใกล้เคียงกับผลลัพธ์ที่คาดหวังโดย OP ฉันจะเพิ่มคำตอบในภายหลัง ขอบคุณ.
mpalanco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.