본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
ggplot2

범례(legend) 꾸미기 in R : Part II

by 아참형인간 2021. 10. 11.
legend2.knit

범례(Legned) in R - Part II

학급당 학생수, 교원당 학생수, 비정규 교원 비율을 하나의 Plot에..

앞선 포스트에 이어 ggplot2에서 범례를 설정하는 방법에 대해 알아보자. 이번 포스트에서는 theme()를 사용하여 범례의 위치, 배경, 테두리 등을 설정하는 방법을 설명한다.

기본 Plot

본 포스트에서 사용하는 기본 Plot은 다음과 같이 생성하였다.

범례 위치 변경

범례의 위치는 기본적으로 좌측에 위치한다. 이를 바꾸기 위해서는 theme()legend.position 매개변수에 범례 위치를 설정하는 키워드를 통하여 바꿀수 있다.

범례 위치를 설정하는 키워드는 다음과 같다.

키워드 위치
right 오른쪽
left 왼쪽
top 위쪽
bottom 아래쪽
basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.position = 'bottom')

범례 제거

범례를 없애기를 원할 경우에는 앞선 위치 설정 방법과 동일한데 theme()legend.position 키워드에 ’none’을 설정하면 범례가 없어진다.

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.position = 'none')

범례 정렬

범례의 위치는 theme()legend.position으로 설정할 수 있는데 기본적으로 각각 사이드의 중간에 정렬된다. 설정된 사이드내에서 위쪽이나 아래쪽, 혹은 오른쪽이나 왼쪽에 위치하게 설정하기 위해서는 legend.justification 매개변수에 아래의 키워드를 설정함으로써 위치를 설정 할 수 있다.

키워드 정렬
right 오른쪽정렬
left 왼쪽정렬
top 위쪽정렬
bottom 아래쪽정렬
basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.position = 'left', legend.justification = 'bottom') 

범례 방향

위의 범례를 보면 왼쪽과 오른쪽에 위치한 범례는 모두 세로 방향으로 범례가 표현되고 위쪽과 아래쪽에 위치한 범례는 모두 가로 방향으로 범례가 표현된다. 만약 왼쪽과 오른쪽에 위치한 범례를 가로방향으로 설정하거나 위쪽과 아래쪽에 위치한 범례를 세로방향으로 설정하기 위해서는 theme()legend.direction 매개변수에 ‘horizontal’(가로방향) 혹은 ‘vertical’(세로방향)을 설정하여 범례 방향을 바꿀 수 있다.

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.position = 'bottom', legend.direction = 'vertical')

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.position = 'left', legend.direction = 'horizontal')

범례 배경

범례의 배경을 설정하기 위해서는 theme()legend.background에 색 이름을 설정함으로써 바꾸어줄 수 있다. 다만 앞의 설정과는 다른 것이 범례 배경을 설정할 때는 element_rect()fill 매개변수에 색 이름을 설정해야 한다는 것이다.

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.background = element_rect(fill = 'red'))

범례 테두리

범례의 테두리를 설정하기 위해서는 theme()legend.background에 색 이름을 설정함으로써 바꾸어줄 수 있다. 이 설정도 앞의 범례 배경과 같이 element_rect()를 사용하는데 color로 색을 지정하고 size로 두께를 지정하여 설정한다.

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.background = element_rect(color = 'blue', size = 2, fill = 'red')) 

범례 여백

위의 범례 테두리를 그려보면 범례 안에서의 여백이 없음이 명확히 보인다. 여백을 만들기 위해서는 theme()legend.margin을 사용하는데 앞선 범례 배경이나 범례 테두리와 유사하게 margin()을 사용하여 네개의 수치를 전달하는데 12시 방향에서부터 시계방향인 3시, 6시, 9시의 여백을 지정하게 할 수 있다.

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
                         breaks = c(3, 5, 7), 
                         labels = c('3%', '5%', '7%'), 
                         guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
                        breaks = c(11, 12, 13, 14, 15), 
                        labels = c('11명', '12명', '13명', '14명', '15명'), 
                        guide = guide_legend(order = 0)) +
  theme(legend.background = element_rect(color = 'blue'), 
        legend.margin = margin(0, 10, 10, 0))

범례 제목 꾸미기

범례의 제목에 대한 강조나 기울임을 하기 위해서는 theme()legend.title을 설정하는데 앞선 범례 배경이나 범례 테두리와 유사하게 element_text()의 여러 매개변수를 사용하여 설정할 수 있다. 아래의 코드에서 face는 범례 제목의 타입을 다음과 같이 나타낸다.

1 : 일반 형태 2 : 굵은 형태(Bold) 3 : 기울임 형태(Italic) 4 : 굵은 기울임 형태(Bold Italic)

basic_plot + 
  scale_color_continuous(name = '비정규교원비율', 
    breaks = c(3, 5, 7), 
    labels = c('3%', '5%', '7%'), 
    guide = guide_colorbar(reverse = TRUE, order = 1)) + 
  scale_size_continuous(name = '교원당 학생수', 
    breaks = c(11, 12, 13, 14, 15), 
    labels = c('11명', '12명', '13명', '14명', '15명'), 
    guide = guide_legend(order = 0)) +
  theme(legend.title = element_text(color = 'blue', size = 20, face = 2))

댓글