13.2 버블 그래프

이전 절에서 x축과 y축의 값에 따라 산포도를 그리는 방법을 알아보았습니다.

이번 절에서는 z라는 제 3의 변수(보통 요인형 변수)에 비례해서 점의 크기를 변화시켜 시각화한 버블 그래프 (Bubble Chart) 에 대하여 학습하겠습니다.

산포도가 2차원의 그래프(단, 색깔이나 모양 조건을 추가하면 3차원 정보 제공 가능)라면, 버블 그래프 (Bubble Chart)는 3차원의 그래프가 되어 지면에 보다 많은 정보량을 제공할 수 있는 장점이 있습니다.

ggplot2에서는 산포도를 작성하는 geom_point() 함수와 함께 scale_size_area() 함수를 같이 사용하면 버블 그래프 (Bubble Chart)를 그릴 수가 있습니다. 따라서, 버블 그래프도 산포도의 일종인 것입니다.

13.2.1 데이터 세트

MASS 패키지의 Cars93 데이터 프레임 내에 차 모델명(Model), 차종(Type), 무게(Weight), 고속도로연비(MPG.highway), 가격(Price)의 5개 변수를 사용하여 버블 그래프를 그려보겠습니다.

데이터가 너무 많으면 버블 그래프를 그릴 때 겹쳐 보여서 보기 싫으므로 차종(Type)에서 “compact”와 “large”의 두 종만 선별해서 예를 들어보겠습니다.

# 버블 그래프 : 데이터 세트
library(ggplot2) 
library(MASS)
str(Cars93)
levels(Cars93$Type)
## [1] "Compact" "Large"   "Midsize" "Small"   "Sporty"  "Van"
table(Cars93$Type)
## 
## Compact   Large Midsize   Small  Sporty     Van 
##      16      11      22      21      14       9
# 5개의 변수 선택과 
# Type 변수 중 Compact와 Large만 선택
Cars93_sample <- subset(Cars93, 
                         select = c("Model", "Type", "Weight", "MPG.highway", "Price"), 
                         subset = (Type %in% c("Compact", "Large")))
Cars93_sample
##             Model    Type Weight MPG.highway Price
## 3              90 Compact   3375          26    29
## 7         LeSabre   Large   3470          28    21
## 8      Roadmaster   Large   4105          25    24
## 10        DeVille   Large   3620          25    35
## 12       Cavalier Compact   2490          36    13
## 13        Corsica Compact   2785          34    11
## 18        Caprice   Large   3910          26    19
## 20       Concorde   Large   3515          28    18
## 21        LeBaron Compact   3085          28    16
## 22       Imperial   Large   3570          26    30
## 25         Spirit Compact   2970          27    13
## 30         Vision   Large   3490          28    19
## 33          Tempo Compact   2690          27    11
## 38 Crown_Victoria   Large   3950          26    21
## 43         Accord Compact   3040          31    18
## 52       Town_Car   Large   4055          26    36
## 55            626 Compact   2970          34    16
## 58           190E Compact   2920          29    32
## 65         Altima Compact   3050          30    16
## 68        Achieva Compact   2910          31    14
## 71   Eighty-Eight   Large   3470          28    21
## 74        Sunbird Compact   2575          31    11
## 77     Bonneville   Large   3495          28    24
## 78            900 Compact   2775          26    29
## 82         Legacy Compact   3085          30    20
## 90         Passat Compact   2985          30    20
## 92            240 Compact   2985          28    23

Go Top

13.2.2 기본 버블 그래프

ggplot2geom_point()scale_size_area() 함수를 사용하여 버블 그래프 (bubble chart)를 그려보겠습니다.

이때 geom_point() 함수에도 aes() 함수를 추가하고 있으며, size 모수에 Price 변수를 설정하고 있음에 주목하기 바랍니다.

버블 그래프의 구성 요소별로 정리를 해 보면 다음과 같습니다.

  • ggplot() : x무게(Weight)를, y에는 고속도로연비(MPG.highway) 이터를 표시하고,

  • geom_point() : 점의 크기(size)Price 변수 값에 따라 정하고(aes(size = Price), 점의 모양(shpae)을 원(21번)으로 표시하고,14 점의 테두리 색(colour)은 “blue”, 점의 채우기 색(fill)은 “green”, 그리고 채우기 색의 투명도(alpha)는 50%로 설정하겠습니다.

  • scale_size_area() : 점의 최대 크기(max_size)를 15로 설정하겠습니다.15

이제 이러한 사항을 반영하여 버블 그래프를 그리면 다음과 같습니다.

# 기본 버블 그래프
ggplot(Cars93_sample,                          # 데이터 세트를 지정합니다.
       aes(x = Weight,                         # x축을 Weight 변수로 지정합니다.
           y = MPG.highway)) +                 # y축을 MPG.highway 변수로 지정합니다.
       geom_point(aes(size = Price),           # 점의 크기를 Price 변수로 지정합닏.
                  shape=21,                    # 점의 모양 ; 21
                  colour="blue",               # 점의 테두리 색
                  fill="green",                # 점의 채우기 색
                  alpha=0.5) +                 # 점의 투명도 : 50%
   scale_size_area(max_size = 15) +            # 최대 점의 크기 : 15
   ggtitle("기본 버블 그래프")
기본 버블 그래프

Figure 13.15: 기본 버블 그래프

Go Top

참고로 R 에서의 선의 모양은 그림 13.16 과 같으며, 점의 모양은 그림 13.17 과 같습니다.

R에서의 선의 모양

Figure 13.16: R에서의 선의 모양

R에서의 점의 모양

Figure 13.17: R에서의 점의 모양

13.2.3 텍스트 레이블 추가

이 버블 그래프에서 geom_text() 함수를 활용해서 각 점이 나타내는 자동차 모델 명(Model)이 무엇인지를 레이블로 표시해 보겠습니다.

geom_text() 함수의 사용을 위해 고려해야 할 사항 중 중요한 부분만 설정하겠습니다.

  • 먼저 aes() 함수의 모수를 설정합니다.

    • 레이블이 출력될 Y축의 위치를 지정합니다. 여기서는 Y축이 MPG.highway 변수이므로 aes() 함수에 y = MPG.highway 모수를 추가해 줍니다.16
    • 먼저 레이블로 표시할 변수 Model을 지정합니다. 즉, aes() 함수의 모수로label = Model을 추가합니다.
  • 기타 모수들을 설정합니다.

    • 우선 기준이 되는 축을 설정합니다. vjust = 1 모수를 설정하여 x축을 기준 축으로 정하겠습니다.
    • 레이블의 색을 지정합니다. colour = “blue”으로 해서 검정색으로 설정하겠습니다.
    • 레이블 글자의 크기를 지정합니다. size = 3으로 설정하겠습니다.

이러한 고려 사항들을 반영하여 버블 그래프에 텍스트 레이브을 추가해 보겠습니다.

# 버블 그래프에 모델명을 레이블로 추가하기
ggplot(Cars93_sample,                        
       aes(x = Weight,                       
           y = MPG.highway)) +               
  geom_point(aes(size = Price),           
             shape=21,                    
             colour="blue",               
             fill="green",                
             alpha=0.5) +                 
  scale_size_area(max_size = 15,
                  guide = FALSE) +         # 범례를 없앨 수도 있습니다.

  # 모델명을 레이블로 추가하기  
  geom_text(aes(y = MPG.highway + 0.2,     # 레이블이 출력될 Y축의 위치
                label = Model),            # 출력될 레이블 변수
            vjust = 1,                     # 기준 축 : 1은 X축
            colour = "blue",               # 레이블의 색
            size = 3) +                    # 레이블 글자 크기
  ggtitle("버블 그래프 : 모델 레이블 추가")
버블 그래프 : 모델 레이블 추가

Figure 13.18: 버블 그래프 : 모델 레이블 추가

Go Top

13.2.4 그룹별 버블 그래프 그리기

13.2.4.1 aes() 함수의 모수 이용

aes() 함수의 모수 중 colour =fill = 등의 두 개의 모수를 자동차 유형(Type)으로 설정하면 버블 그래프가 자동차 유형별(Type)로 그룹화 됨을 볼 수 있습니다.

이때, geom_point() 함수 안의 colour = 또는 fill = 은 제거해 줍니다.

# 그룹별 버블 그래프 : aes() 함수의 이용
ggplot(Cars93,                          # 데이터 세트를 지정합니다.
       aes(x = Weight,                         # x축을 Weight 변수로 지정.
           y = MPG.highway,                    # y축을 MPG.highway 변수로 지정.
           colour = Type,
           fill = Type)) +                 
       geom_point(aes(size = Price),           # 점의 크기를 Price 변수로 지정.
                  shape=21,                    # 점의 모양
                  alpha=0.5) +                 # 점의 투명도 : 50%
   scale_size_area(max_size = 15) +            # 최대 점의 크기 : 15
   ggtitle("자동차 유형별 버블 그래프 : aes() 함수의 이용")
자동차 유형별 버블 그래프 : aes() 함수의 이용

Figure 13.19: 자동차 유형별 버블 그래프 : aes() 함수의 이용

Go Top

13.2.4.2 facet_grid() 함수의 이용

다음은 facet_grid() 함수를 이용하여 자동차 유형별(Type)로 버블 그래프를 그룹화한 것입니다.

# 그룹별 버블 그래프 : facet_grid() 함수의 이용
ggplot(Cars93,                          # 데이터 세트를 지정합니다.
       aes(x = Weight,                     # x축을 Weight 변수로 지정합니다.
           y = MPG.highway,                # y축을 MPG.highway 변수로 지정합니다.
           colour = Type,                  # Type 변수를 그룹의 색으로 지정
           fill = Type)) +                 
       geom_point(aes(size = Price),       # 점의 크기를 Price 변수로 지정.
                  shape=21,                # 점의 모양
                  alpha=0.5) +             # 점의 투명도 : 50%
   scale_size_area(max_size = 15) +        # 최대 점의 크기 : 15
   facet_grid( Type ~ .) +
   ggtitle("자동차 유형별 버블 그래프 : facet_grid() 함수의 이용")
자동차 유형별 버블 그래프 : facet_grid() 함수의 이용

Figure 13.20: 자동차 유형별 버블 그래프 : facet_grid() 함수의 이용

Go Top

13.2.4.3 facet_wrap() 함수의 이용

다음은 facet_wrap() 함수를 이용하여 자동차 유형별(Type)로 버블 그래프를 그룹화한 것입니다.

# 그룹별 버블 그래프 : facet_wrap() 함수의 이용
ggplot(Cars93,                          # 데이터 세트를 지정합니다.
       aes(x = Weight,                     # x축을 Weight 변수로 지정합니다.
           y = MPG.highway,                # y축을 MPG.highway 변수로 지정합니다.
           colour = Type,                  # Type 변수를 그룹의 색으로 지정
           fill = Type)) +                 
        geom_point(aes(size = Price),         # 점의 크기를 Price 변수로 지정.
                  shape=21,         
                  alpha=0.5) +                # 점의 투명도 : 50%
   scale_size_area(max_size = 15) +           # 최대 점의 크기 : 15
   facet_wrap( ~ Type, ncol = 3) +
   ggtitle("자동차 유형별 버블 그래프 : facet_wrap() 함수의 이용")
자동차 유형별 버블 그래프 : facet_wrap() 함수의 이용

Figure 13.21: 자동차 유형별 버블 그래프 : facet_wrap() 함수의 이용

Go Top

13.2.5 Theme의 사용

히스토그램에서 Theme을 사용하였듯이, 버블 그래프에서도 Theme을 사용할 수 있습니다.

다음의 예는 앞서 작성한 자동차 유형별 버블 그래프히스토그램에서 Theme으로 사용ggplot2::theme_classic() + 이하 부분을 복사해서 붙여넣기한 것입니다.

# 버블 그래프 : Theme의 사용
ggplot(Cars93,                          # 데이터 세트를 지정합니다.
       aes(x = Weight,                     # x축을 Weight 변수로 지정합니다.
           y = MPG.highway,                # y축을 MPG.highway 변수로 지정합니다.
           colour = Type,                  # Type 변수를 그룹의 색으로 지정
           fill = Type)) +                 
        geom_point(aes(size = Price),         # 점의 크기를 Price 변수로 지정.
                  shape=21,         
                  alpha=0.5) +                # 점의 투명도 : 50%
   scale_size_area(max_size = 15) +           # 최대 점의 크기 : 15
   facet_wrap( ~ Type, ncol = 3) +
   ggtitle("버블 그래프 : Theme의 사용") +
  ggplot2::theme_classic() +                     # 그래프 테마 지정
  ggplot2::theme(axis.title.x = element_text(size  = 10, 
                                             face  = "italic", 
                                             color = "gray", 
                                             angle = 0, 
                                             vjust = 0.5),
                 axis.title.y = element_text(size  = 10, 
                                             face  = "bold.italic", 
                                             color = "gray", 
                                             angle = 0, 
                                             vjust = 0.5)) +       
  ggplot2::scale_y_continuous(labels = scales::comma)     

Go Top

연습문제

1. Cars93 데이터 세트에 있는 엔진 크기(EngineSize)와 고속도로 연비(MPG.highway) 등의 2개의 연속형 변수들을 버블 그래프로 시각화하시오.

단,

  • 점의 크기(size)는 Max.Price 변수 값에 따른다(aes(size = MAX.Price))
  • 점의 모양(shpae)은 원(21번)으로 표시하고,
  • 점의 테두리 색(colour)은 “blue,”
  • 점의 채우기 색(fill)은 “green,”
  • 그리고 채우기 색의 투명도(alpha)는 50%로 설정하겠습니다.
  • scale_size_area() : 점의 최대 크기(max_size)를 15로 설정하시오.
ggplot(Cars93, 
       aes(x = EngineSize,  
           y = MPG.highway)) +         
       geom_point(aes(size = Max.Price),    
                  shape=21,                    # 점의 모양 ; 21
                  colour="blue",               # 점의 테두리 색
                  fill="green",                # 점의 채우기 색
                  alpha=0.5) +                 # 점의 투명도 : 50%
   scale_size_area(max_size = 15) +            # 최대 점의 크기 : 15
   ggtitle("기본 버블 그래프")

Go Top


  1. 자세한 사항은 ?shape으로 확인할 수 있습니다.↩︎

  2. 범례는 guide = FALSE 모수를 추가해서 제거할 수 있습니다. 그림 13.15을 참고하기 바랍니다.↩︎

  3. 레이블을 그래프에 표시해 보고 위치를 조정해 줍니다. 이 예에서는 y = MPG.highway + 0.2로 조정했습니다.↩︎