본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
Plotly in R - 그래프에 마우스를 올려봅시다

plotly 선 그래프의 끝에 범례 넣기

by 아참형인간 2022. 5. 28.
side_label.knit

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

다음과 같이 주요 나라의 코로나 19 사망자 추세 그래프를 그려보자.

total_deaths_5_nations_by_day <- df_covid19 |> 
  filter((iso_code %in% c('KOR', 'USA', 'JPN', 'GBR', 'FRA'))) |>
  filter(!is.na(total_deaths_per_million))

total_deaths_5_nations_by_day |>
  ## plotly 객체 생성
  plot_ly() |>
  add_trace(type = 'scatter', mode = 'lines', 
            x = ~date, y = ~total_deaths_per_million , linetype = ~location, connectgaps = T) |>
  layout(title = '코로나 19 사망자수 추세', 
         xaxis = list(title = ''), 
         yaxis = list(title = '10만명당 사망자수 누계'), 
         margin = margins)

위의 그래프를 보면 일반적으로 우리가 흔히 보는 선그래프이다. 각각의 국가는 색으로, 선타입으로 구분되고 있는데 이를 범례를 통해 구분이 가능하다. 하지만 선과 범례의 순서가 일이되지 않기 때문에 선에 따른 국가의 구분에 다소 어려움이 있다. 그렇다고 범례의 순서를 데이터의 순서에 맞춘다고 한다면 데이터들의 순서가 바뀔 때마다 범례의 순서가 바뀌기 때문에 사용자들이 혼둥을 느낄수 있다. 이런 경우에는 범례를 없애버리고 각각의 선에 해당하는 국가명을 선의 끝에 붙여준다면 그래프를 읽기가 훨씬 쉬워질 것이다.

이와같은 시각화를 plotly를 사용하여 만들려면 각각의 선 trace의 마지막 위치를 x, y에 설정해주어야 한다. 그리고 해당 위치에 add_annotations()를 사용하여 주석의 형태로 텍스트를 넣어 주었다.

이 방법외에도 add_trace()의 ‘scatter’ 타입의 ‘text’ 모드로도 설정이 가능할 것이다.

total_deaths_5_nations_by_day |>
  ## plotly 객체 생성
  plot_ly() |>
  add_trace(type = 'scatter', mode = 'lines+text', 
            x = ~date, y = ~total_deaths_per_million , linetype = ~location, connectgaps = T) |>
  add_annotations(text = '프랑스', 
                  ## 프랑스 trace의 마지막 위치에 주석 추가
                  x = total_deaths_5_nations_by_day |> filter(location == 'France', date == max(date)) |>
                      select(date) |> pull(), 
                  y = total_deaths_5_nations_by_day |> filter(location == 'France', date == max(date)) |>
                      select(total_deaths_per_million) |> pull(),
                  xanchor = 'left', showarrow = FALSE
                    ) |>
  add_annotations(text = '일본', 
                  ## 일본 trace의 마지막 위치에 주석 추가
                  x = total_deaths_5_nations_by_day |> filter(location == 'Japan', date == max(date)) |>
                      select(date) |> pull(), 
                  y = total_deaths_5_nations_by_day |> filter(location == 'Japan', date == max(date)) |>
                      select(total_deaths_per_million) |> pull(),
                  xanchor = 'left', yanchor = 'top', showarrow = FALSE
                    ) |>
  add_annotations(text = '영국', 
                  ## 영국 trace의 마지막 위치에 주석 추가
                  x = total_deaths_5_nations_by_day |> filter(location == 'United Kingdom', date == max(date)) |>
                      select(date) |> pull(), 
                  y = total_deaths_5_nations_by_day |> filter(location == 'United Kingdom', date == max(date)) |>
                      select(total_deaths_per_million) |> pull(),
                  xanchor = 'left', showarrow = FALSE
                    ) |>
  add_annotations(text = '미국', 
                  ## 미국 trace의 마지막 위치에 주석 추가
                  x = total_deaths_5_nations_by_day |> filter(location == 'United States', date == max(date)) |>
                      select(date) |> pull(), 
                  y = total_deaths_5_nations_by_day |> filter(location == 'United States', date == max(date)) |>
                      select(total_deaths_per_million) |> pull(),
                  xanchor = 'left', showarrow = FALSE
                    ) |>
  add_annotations(text = '한국', 
                  ## 한국 trace의 마지막 위치에 주석 추가
                  x = total_deaths_5_nations_by_day |> filter(location == 'South Korea', date == max(date)) |>
                      select(date) |> pull(), 
                  y = total_deaths_5_nations_by_day |> filter(location == 'South Korea', date == max(date)) |>
                      select(total_deaths_per_million) |> pull(),
                  xanchor = 'left', yanchor = 'bottom', showarrow = FALSE
                    ) |>
  layout(title = '코로나 19 사망자수 추세', 
         xaxis = list(title = ''), 
         yaxis = list(title = '10만명당 사망자수 누계'), 
         margin = margins,
         showlegend = FALSE)

댓글