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만 선택
<- subset(Cars93,
Cars93_sample 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
13.2.2 기본 버블 그래프
ggplot2
의 geom_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("기본 버블 그래프")
참고로 R 에서의 선의 모양은 그림 13.16 과 같으며, 점의 모양은 그림 13.17 과 같습니다.
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("버블 그래프 : 모델 레이블 추가")
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() 함수의 이용")
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() 함수의 이용")
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() 함수의 이용")
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의 사용") +
::theme_classic() + # 그래프 테마 지정
ggplot2::theme(axis.title.x = element_text(size = 10,
ggplot2face = "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)) +
::scale_y_continuous(labels = scales::comma) ggplot2
연습문제
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("기본 버블 그래프")