Làm cách nào để loại bỏ khoảng cách giữa trục & area-plot trong ggplot2?


113

Tôi có khung dữ liệu sau:

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

Khi tôi thực hiện một khu vực-lô với:

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

Tôi nhận được kết quả này:

nhập mô tả hình ảnh ở đây

Tuy nhiên, tôi muốn loại bỏ khoảng trống giữa trục và cốt truyện thực tế. Khi tôi thêm, theme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))tôi nhận được thông báo lỗi sau:

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

Bất kỳ đề xuất về cách giải quyết vấn đề này?


3
Tôi nghĩ rằng bạn cần phải tải gói lưới một cách rõ ràng chounit
Tyler Rinker

@TylerRinker Thanx! Tôi không nhận được thông báo lỗi nữa. Tôi đã giải quyết vấn đề theo một cách khác, nhưng đây là một lời nhắc nhở tốt đẹp cho tương lai khi tôi muốn đặt lợi nhuận.
Jaap

3
Điều này đôi khi được coi là một bố cục chặt chẽ. Đề cập điều này ở đây để các công cụ tìm kiếm có thể chọn nó.
vô danh

Câu trả lời:


191

Cập nhật: Xem câu trả lời của @ divibisan để biết thêm khả năng trong các phiên bản mới nhất của.


Từ ?scale_x_continuousvề expand-argument:

Véc tơ của hằng số mở rộng phạm vi được sử dụng để thêm một số khoảng đệm xung quanh dữ liệu, để đảm bảo rằng chúng được đặt cách xa các trục một khoảng cách. Các giá trị mặc định là mở rộng quy mô thêm 5% mỗi bên đối với các biến liên tục và 0,6 đơn vị mỗi bên đối với các biến rời rạc.

Do đó, vấn đề được giải quyết bằng cách thêm expand = c(0,0)vào scale_x_continuousscale_y_continuous. Điều này cũng loại bỏ nhu cầu thêm panel.margintham số.

Mật mã:

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

Kết quả: biểu đồ diện tích không có khoảng trống


41

Như vậy ggplot2 version 3, có một expand_scale()hàm mà bạn có thể chuyển cho expand=đối số cho phép bạn chỉ định các giá trị mở rộng khác nhau cho mỗi cạnh của tỷ lệ.

Kể từ ggplot2 version 3.3.0, expand_scale()đã không được chấp nhận thay expansionvì có chức năng giống hệt nhau.

Nó cũng cho phép bạn chọn xem bạn muốn mở rộng thành kích thước tuyệt đối (sử dụng add=tham số) hay phần trăm kích thước của ô (sử dụng mult=tham số):

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

nhập mô tả hình ảnh ở đây


Lưu ý nhanh: expand_scale()đã thay đổi thành expansion()nhưng hoạt động giống nhau trong trường hợp này.
Molx

1
@Molx Cảm ơn, tôi đã cập nhật câu trả lời!
divibisan

14

Một tùy chọn khác tạo ra kết quả giống hệt nhau, đang sử dụng coord_cartesianthay vì thang vị trí liên tục (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
Thay thế tốt, +1. Tuy nhiên, bạn sẽ vẫn cần các scales_x/y_continuousphần nếu bạn muốn chỉ định ngắt, v.v.
Jaap,

hoặc, thậm chí dễ dàng hơn, thiết lập expand = FALSEtrong coord_cartesiannhư đề xuất trong @Marcus bình luận trong câu hỏi này
Tjebo

@Tjebo Kết quả hơi khác một chút nhưng trên thực tế, nó có lẽ gần với kết quả mong đợi hơn của OP. Tôi sẽ thêm nó sau vào câu trả lời của tôi. Cảm ơn bạn.
mpalanco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.