ggplot2에서 축과 영역 플롯 사이의 공간을 제거하는 방법은 무엇입니까?


113

다음 데이터 프레임이 있습니다.

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 2014

@TylerRinker 고맙습니다! 더 이상 오류 메시지가 표시되지 않습니다. 나는 이미 다른 방법으로 문제를 해결했지만 이것은 내가 여백을 설정하고 싶을 때 미래에 대한 좋은 알림입니다.
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

또는 더 쉽게이 질문 에 @Marcus 댓글에 제안 expand = FALSEcoord_cartesian대로 설정
Tjebo

@Tjebo 출력은 약간 다르지만 실제로 OP에 의해 예상되는 결과에 더 가깝습니다. 나중에 내 대답에 추가하겠습니다. 감사합니다.
mpalanco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.