(ggplot2) 벤다이어그램 그리기 - 교집합,합집합,차집합

sf 패키지는 공간데이터의 시각적 표현을 다루기에 최적의 패키지이다. 지도를 그릴뿐아니라, 영역간 겹치는 부분, 제외해야 하는 부분을 연산할 수 있도록 여러가지 함수들을 제공하고 있다. 지도를 가지고 예시를 들기보다는, 공간을 원 2개인 벤다이어그램 그려서, 합집합, 교집합 개념을 코드로 구현해보기로 한다. 관련 예시는 여기 문서를 참고하였다.

벤다이어그램 그리기

SF 패키지를 이용하여 (0,1) 위치와, (1,1) 위치에 점이 있다고 가정하고 거리가 1인 경계를 만든다. 특정 포인트에서 일정한 거리이 경계이기 때문에 원이 만들어진다.

x = st_point(c(0,1))
y = st_point(c(1,1))
b = st_sfc(x,y)
b = st_buffer(b, dist = 1)

아래 명령어를 실행해보면 2개의 원이 그려짐을 알 수 있다.

ggplot(b) +
  geom_sf(colour = "gray0", fill = NA)

st_intersection

두 영역간 교집합의 영역을 구하고 싶다면, st_intersection 함수를 사용하면 된다.

intersection = st_intersection(b[1], b[2])

ggplot() +
  geom_sf(data = intersection, fill = "gray") +
  geom_sf(data = b, colour = "gray0", fill = NA) 

st_union

st_union은 두 영역를 모두 합쳐서 하나의 영역으로 인식하게 하는 함수이다.

union = st_union(b[1], b[2])

ggplot() +
  geom_sf(data = union, fill = "gray") +
  geom_sf(data = b, colour = "gray0", fill = NA)

st_difference

두 영역사이의 차집합을 구할 때는 st_difference 으로 실행하면 된다.

difference = st_difference(b[1], b[2])

ggplot() +
  geom_sf(data = difference, fill = "gray") +
  geom_sf(data = b, colour = "gray0", fill = NA) 

st_sym_difference

2개 영역의 합집합에서 교집합을 제외한 나머지를 구하고 싶다면, st_sym_difference를 사용한다.

sym_difference = st_sym_difference(b[1], b[2])

ggplot() +
  geom_sf(data = sym_difference, fill = "gray") +
  geom_sf(data = b, colour = "gray0", fill = NA)


더 보면 좋을 글들