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

ggplot2 축 눈금 간격과 눈금 레벨 설정 in R

by 아참형인간 2022. 5. 5.
axislabel.knit

사용데이터 : https://2stndard.tistory.com/68

축 눈금 간격 설정

ggplot2에서 축의 눈금 간격 설정은 scale_*_*()breaks 속성을 사용하여 설정이 가능하다.

축의 눈금 설정은 주로 연속형 변수를 축에 매핑할 때 사용한다. 이산형 변수는 각각의 카테고리 이름을 다 붙여주기 때문에 보통 breaks를 설정하지 않는것이 일반적이다.

breaks를 사용해 눈금 간격을 설정하기 위해서는 간격으로 사용할 문자형 벡터 설정하면 설정된 벡터로 간격이 표시된다. 이를 설정하기 위해서는 사용자가 c()를 사용하여 하나 하나 설정할 수도 있고 seq()를 사용하여 시작점, 끝점, 간격을 설정할 수도 있다.

df_취업률_2000 |>
  ggplot(aes(x = 졸업자수, y = 취업자수)) + 
  geom_point() +
  scale_x_continuous(breaks = seq(0, 500, 75)) +
  scale_y_continuous(breaks = c(50, 100, 200, 400))

또 연속형 변수 타입으로 매핑될 수 있는 데이터 타입이 날짜형(Date) 타입이다. 날짜형 데이터 타입은 scale_*_date()scale_*_datetime()으로 설정할 수 있다. 날짜형 타입도 breaks로 설정이 가능하지만 date_breaks를 사용하여 날짜나 시간 간격을 설정하 수도 있다. 예를 들어 date_breaks를 ‘1 year’, ‘2 months’, ‘3 weeks’, ‘5 days’ 등으로 설정하면 그 간격만큼의 눈금이 설정된다.

df_covid19_100 |>
  ggplot(aes(x= date, y = total_cases)) +
  geom_line(aes(group = location, color = location)) +
  scale_x_date(breaks = '2 weeks')

축 눈금 라벨 설정

위의 선 그래프에서 Y축이 지수형태의 라벨로 표현되기 때문에 축을 읽기가 어렵다. ggplot는 십만(100,000) 이상의 수치는 위와 같이 지수형으로 표현한다. 이와 같이 축에 표시되는 눈금의 라벨을 사용자가 원하는 형태로 설정하기 위해서는 앞서 사용했던 scale_*_*()을 사용한다. 눈금 라벨을 설정하는 방법은 눈금 라벨에 표시되는 문자열을 벡터로 설정하는 방법과 표시 포맷을 설정하는 방법이 있다.

눈금 라벨 벡터 설정

축 눈금에 사용하고자 하는 라벨을 벡터로 설정하여 labels 매개변수에 설정하면 앞서 설정한 breaks에 1:1로 매핑하여 축에 표기된다. 따라서 breaks의 벡터 길이와 labels 벡터 길이가 동일해야한다.

df_취업률_2000 |>
  ggplot(aes(x = 졸업자수, y = 취업자수)) + 
  geom_point() +
  scale_x_continuous(breaks = seq(0, 500, 75), labels = paste0(seq(0, 500, 75), '명')) +
  scale_y_continuous(breaks = c(50, 100, 200, 400), labels = c('50명', '100명', '200명', '400명'))

눈금 라벨 포맷 설정

눈금이 몇개 되지 않은 경우는 이를 하나 하나 벡터로 설정하여 사용할 수 있지만 눈금이 많은 경우는 하나 하나 벡터를 설정하기가 어렵다. 이렇게 벡터로 설정하는 경우의 가장 큰 문제는 나중에 새로운 데이터를 사용할 때 그 라벨이 적절치 않을 수 있다는 점이다. 또 라벨은 일반적으로 일정한 포맷을 가지는 경우가 많다. 이렇게 눈금에 표기되는 형태를 자동화하고 일정한 포맷으로 설정하기 위해서는 앞서 설명한 labels에 문자열 벡터를 설정하지 않고 라벨 표기용 함수를 설정함으로써 해당 라벨을 특정 포맷으로 표기할 수 있다.

이 예로 가장 많이 사용되는 것이 앞서 표기되었던 지수 형태의 라벨이다. ggplot2는 십만(100,000) 이상의 수치는 위와 같이 지수형으로 표현한다. 위의 선 그래프에서 Y축이 지수형태로 표현되기 때문에 축을 읽기가 어렵다. 또 수치가 잘 인식되려면 천단위 구분자도 필요할 것이다. 이런 경우 라벨을 하나 하나 벡터로 천 단위 구분 기호를 넣어 벡터로 설정하기는 어렵다. 또 비율을 백분률로 표현하기 위해서는 뒤에 ’%’를 붙여야 한다.

앞서 지수형태로 표기된 라벨을 천 단위 표시를 ’,’로 표기한 자연수 형태로 표기하는 코드는 다음과 같다.

df_covid19_100 |>
  ggplot(aes(x= date, y = total_cases)) +
  geom_line(aes(group = location, color = location)) +
  scale_x_date(breaks = '2 weeks') +
  scale_y_continuous(labels = scales::comma)

여기서 포맷 설정을 위해 사용한 함수는 scales 패키지의 label_comma() 함수이다. 이 함수는 label_comma()로 사용할 수 있지만 특별한 매개변수 설정이 없다면 단순히 comma로만 설정하여 천 단위 구분자를 ’,’로 설정한 자연수 포맷으로 설정할 수 있다.

df_취업률_2000 |>
  ggplot(aes(x = 졸업자수, y = 취업자수)) + 
  geom_point() +
  scale_x_continuous(breaks = seq(0, 500, 75), labels = paste0(seq(0, 500, 75), '명')) +
  scale_y_continuous(breaks = c(50, 100, 200, 400), labels = c('50명', '100명', '200명', '400명'))

백분률 포맷을 사용하는 예는 다음과 같다. 앞서 설명한 scales 패키지의 label_percent()를 사용하거나 percent를 사용하면 백분률 포맷으로 설정이 가능한데 하나 주의해야 할 것이 label_percent()를 사용하기 위해서는 매핑되는 변수가 0부터 1사이의 비율로 표현되어야 한다는 점이다.

df_취업률_2000 |>
  ggplot() +
  geom_bar(aes(x = 대계열, y = 취업률/100), stat = "summary", fun.y = "mean") +
  scale_y_continuous(labels = scales::percent)

앞에서 본 것과 같이 축에 표시되는 라벨은 그 데이터에 따라 표시 포맷을 설정해야한다. scales 패키지에서 제공하는 함수들을 사용하여 표시 포맷을 설정할 수 있는데 다음과 같은 함수들로 포맷을 설정할 수 있다.

  • scales::number : 숫자 포맷으로 표현되나 천단위 구분에 빈칸을 사용하는 포맷

  • scales::comma : 숫자 포맷으로 천단위 구분 기호로 콤마(,)를 사용하는 포맷

  • scales::percent : 백분률 포맷으로 원값에 100을 곱한 값이 표시되며 접미어에 ’%’가 붙음

  • scales::dollar : 달러 통화 포맷으로 접두사에 ’$’가 붙음

  • scales::scientific : 과학적 포맷으로 지수형태의 표기

위의 함수를 사용할 때 함수의 기본값을 사용한다면 함수의 뒤에 괄호(())없이 함수명만 지정함으로써 사용이 가능하다. 하지만 포맷의 세부 특성을 설정하기 위해서는 함수의 괄호 안에 세부 특성값을 설정할 수 있다. 이 함수들의 사용법과 주요 매개변수는 다음과 같다.

number(accuracy = NULL, scale = 1, prefix = ““, suffix =”“, big.mark =” “, decimal.mark =”.”, trim = TRUE, …)

comma(x, accuracy = NULL, scale = 1, prefix = ““, suffix =”“, big.mark =”,“, decimal.mark =”.”, trim = TRUE, digits, …)

percent(x, accuracy = NULL, scale = 100, prefix = ““, suffix =”%“, big.mark =” “, decimal.mark =”.”, trim = TRUE, …)

dollar(x, accuracy = NULL, scale = 1, prefix = “$”, suffix = ““, big.mark =”,“, decimal.mark =”.”, trim = TRUE, largest_with_cents = 1e+05, negative_parens = FALSE, …)

scientific(x, digits = 3, scale = 1, prefix = ““, suffix =”“, decimal.mark =”.”, trim = TRUE, …)
- accuracy : 반올림 되어 표기될 숫자의 유효숫자 범위를 지정. 예를 들어 0.01로 설정하면 소수점 세째자리에서 반올림하여 소수점 두쨰자리까지 표시됨.
- scale : 스케일 팩터를 지정. 표기될 숫자는 포맷팅 되기 전에 스케일 팩터가 곱해짐. 수치값이 매우 작거나 매우 클때 유용함.
- prefix : 숫자의 앞 에 표시될 문자 지정
- sufix : 숫자의 뒤에 표시될 문자 지정
- big.mark : 매 3자리(천단위)마다 표시될 문자 지정
- decimal.mark : 소수점으로 표시될 문자 지정

시계열 데이터에 대한 포맷을 설정하기 위해서는 scale_*_date()date_labels 매개 변수에 Date형이나 Time형의 포맷 설정 문자열을 설정함으로써 라벨 표시를 결정할 수 있다.

df_covid19_100 |>
  ggplot(aes(x= date, y = new_cases)) +
  geom_line(aes(group = location, color = location)) +
  scale_x_date(breaks = '2 weeks', date_labels = '%y년 %B') +
  scale_y_continuous(labels = scales::number)

댓글