사용데이터 : https://2stndard.tistory.com/68
서브 플롯 : subplot()
데이터를 시각화할 때 하나의 시각화에 여러 개의 데이터를 표시하는 경우
각각의 데이터 trace들이 너무 많아지거나 일부 구간에 중복되면 데이터의
정확한 확인이 어렵다. 이럴때는 각각의 데이터 trace들을 따로 떼서 작은
시각화를 여러개 그려줌으로써 해결할 수 있다. 이렇게 여러개의
plotlt
객체를 모아서 하나의 plotly
시각화로
만들어주는 함수가 subplot()
이다.
subplot()
의 주요 사용법은 다음과 같다.
subplot(…, nrows = 1, widths = NULL, heights = NULL, margin = 0.02,
shareX = FALSE, shareY = FALSE, titleX = shareX, titleY = shareY,
which_layout = “merge”)
- … : plotly나 ggplot2 객체의 이름, 리스트, tibble
- nrows : subplot의 행의 개수
- widths : 각각의 subplot의 0부터 1사이의 상대적 열 너비
- heights : 각각의 subplot의 0부터 1사이의 상대적 열 높이
- margin : 0부터 1사이의 단일 수치나 4개의 수치(왼쪽, 오른쪽, 위,
아래)의 여백
- shareX : X축을 공유할지에 대한 논리값
- shareY : Y축을 공유할지에 대한 논리값
- titleX : X축의 제목을 남길지에 대한 논리값
- titleY : Y축의 제목을 남길지에 대한 논리값
- which_layout : 어떤 플롯의 레이아웃에 적용할지 결정, 기본값은
“merge”로 뒤 플롯의 레이아웃 옵션이 앞 옵션보다 우선함을 의미
subplot()
은 subplot으로 그릴 각각의 plotly
객체나 ggplot2
를 먼저 생성하고 이들 객체들을
subplot()
을 사용하여 묶어 그려주는 형태로 사용된다. 이
과정에서 shareX
, shareY
를 사용하여 X, Y축의
공유를 설정하거나 nrows
를 사용하여 subplot()
의
행 개수를 설정할 수 있다. 또 각각의 서브 플롯이 겹쳐지지 않도록
margin
을 설정할 수 있다.
p_line_wide <- df_covid19_100_wide |> plot_ly()
p1 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_한국, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
p2 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_아시아, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
p3 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_유럽, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
p4 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_북미, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
p5 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_남미, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
p6 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_오세아니아, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
p7 <- p_line_wide |>
add_trace(type = 'scatter', mode = 'lines', x = ~date,
y = ~확진자_아프리카, color = I('#1f77b4')) |>
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')))
subplot(
p1 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "한국",
showarrow = F,
xref='paper', yref='paper',
xanchor = 'center')),
p2 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "아시아",
showarrow = F, xref='paper', yref='paper',
xanchor = 'center')),
p3 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "유럽",
showarrow = F, xref='paper', yref='paper',
xanchor = 'center')),
p4 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "북미",
showarrow = F, xref='paper', yref='paper',
xanchor = 'center')),
p5 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "남미",
showarrow = F, xref='paper', yref='paper',
xanchor = 'center')),
p6 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "오세아니아",
showarrow = F, xref='paper', yref='paper',
xanchor = 'center')),
p7 |>
layout(annotations = list(
x = 0.5 , y = 1.02, text = "아프리카",
showarrow = F, xref='paper', yref='paper',
xanchor = 'center')),
nrows = 3,
margin = 0.04) |>
layout(showlegend = FALSE,
title = '최근 100일간 코로나19 확진자수',
margin = margins)
앞의 subplot()
에서의 예는 각각의 plotly
객체를 각각 만든 후에 이들 plotly
객체들을
subplot()
으로 하나의 플롯으로 만들어 주었다. 서브 플롯이
몇개 되지 않을때는 이렇게 각각 만든 plotly
객체를 묶어주는
것이 가능하겠지만 서브 플롯이 많을 때는 이러한 작업이 매우 어려워진다.
특히 긴 형태의 데이터프레임의 경우 앞서와 같이 서브 플롯을 만들어 주기
위해서는 각각의 서브 플롯마다 데이터를 필터링하여 만들어야하기 때문에
매우 번거로운 작업이 수반된다. 이럴 경우는 group_by()
로
데이터프레임을 그룹화하고 .
을 사용하여 각각의 그룹화된
데이터 그룹별로 plotly
객체를 만드는 방식으로 간단히 서브
플롯을 만들어 줄 수 있다. 이 때 do
를 사용하여 각각의
그룹화된 데이터 그룹별 plotly
객체를 만드는 코드를
적용하여야 한다.
## 긴 형태의 100일 코로나19 데이터에서
df_covid19_100 |>
## 국가명으로 그룹화
group_by(location) |>
## 그룹화한 각각의 데이터 그룹들에 적용할 코드 설정
do(
## 각 그룹화한 데이터를 사용해 plotly 객체 생성
p = plot_ly(.) |>
## line 모드의 스캐터 trace 추가
add_trace(type = 'scatter', mode = 'lines',
## X, Y축에 변수 매핑, color를 설정
x = ~date, y = ~new_cases, color = I('#1f77b4')) |>
## layout으로 X, Y축을 설정
layout(title = list(title = NULL),
xaxis = list(tickfont = list(size = 10)),
yaxis = list(title = list(text = '확진자수')),
## 국가명을 주석으로 표시
annotations = list(x = 0.5 , y = 1.02, text = ~location,
showarrow = F, xref='paper',
yref='paper', xanchor = 'center'))
) |>
## 생성된 plotly 객체들을 subplot 생성
subplot(nrows = 3, shareX = TRUE, shareY = TRUE) |>
## 생성된 subplot의 layout 설정
layout(showlegend = FALSE,
title = '최근 100일간 코로나19 확진자수',
margin = margins)
'Plotly in R - 그래프에 마우스를 올려봅시다' 카테고리의 다른 글
plotly 점의 투명도 조절(alpha, opacity) in R (0) | 2022.05.10 |
---|---|
plotly 추세선 그리기 in R (0) | 2022.05.04 |
퍼넬(깔때기, Funnel) 차트 in R (3) | 2022.04.26 |
plotly 사용하기 (0) | 2022.04.26 |
반 반 바이올린 플롯 in R (6) | 2022.04.26 |
댓글