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

sparkline in R

by 아참형인간 2022. 11. 25.
sparkline.knit

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

스파크라인

스파크라인 그래프는 X, Y축이 생략되고 데이터 흐름이 표현된 선만으로 표시되는 선 그래프를 말한다. 이 그래프는 그 시각화 자체로 사용되기 보다는 다른 정보, 특히 표의 컬럼에 표현되거나 다른 시각화의 보조적 정보의 제공 형태로 사용된다. 특히 많은 선 그래프를 표현하지만 서브 플롯도 다소 많다고 느끼는 경우 사용할 수 있다.

다음은 아시아 국가들의 최근 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, name = ~location) |>
      ## layout으로 X, Y축을 설정
      layout(title = list(title = NULL),
             xaxis = list(tickfont = list(size = 10), 
                          showgrid = FALSE),  
             yaxis = list(title = list(text = ~location), 
                          showticklabels = F, 
                          showgrid = FALSE, 
                          rangemode = 'tozero'))
  ) |>
  ## 생성된 plotly 객체들을 subplot 생성
  subplot(nrows = 7, shareX = TRUE, shareY = TRUE) |>
  ## 생성된 subplot의 layout 설정
  layout(showlegend = FALSE, 
         title = '최근 100일간 코로나19 확진자수',
         margin = margins)

스파크라인 차트는 선형 차트를 아래쪽으로 붙여서 그린다. 이를 위해서 데이터가 담긴 데이터프레임을 group_by()를 사용하여 대륙별로 그풉화한다. 이후 do()를사용하여 각각의 그룹에 대해 add_trace(type = 'scatter', mode = 'lines')를 사용하여 라인 차트를 그리는데 스파크라인의 형태로 그리기 위해 Y축의 타이틀은 대륙명으로 설정하고, ‘showticklabels’, ‘showgrid’ 속성을 ’FALSE’로 설정하여 Y축 눈금라벨, 그리드를 제거하고 X축도 ’showgrid’를 ’FALSE’로 설정하여 그리드를 제거한다. 또 하나 설정한 속성인 ’rangemode’는 Y축의 범위를 어디서부터 할건지를 결정하는데 여거서 설정한 ’tozero’는 Y축을 0부터 시작하도록 강제하는 속성이다. X축은 눈금 라벨이 반복되지 않도록 전체 서브 플롯의 ’shareX’을 ’TRUE’로 설정하여 맨 아래의 X축에만 라벨이 표시되게 하였다. 이를 제거하려면 Y축과 마찬가지로 ’showticklabels’를 ’FALSE’로 설정하면 된다.

여기서 하나 살펴보아야할 특성이 각각의 스파크라인에 대한 Y축의 범위가 각각의 스파크라인에 맞추어져 보인다는 것이다. 이는 사용자에게 전체 스케일이 동일하게 착각을 일으킬 수 있다. 예를 들자면 위의 스파크 라인에서 한국의 최고값은 180k이고 아프리카의 최고값은 6054이다. 이들 값이 baseline에서 거의 같은 폭으로 표현되기 떄문에 아프리카의 확진자수과 한국의 확진자수가 비슷하다고 생각할수 있다는 것이다. 하지만 스파크라인은 서로 비교의 목적이 아니고 해당 데이터에 대한 흐름을 파악하기 위해 사용하는 것이기 때문에 이러한 시각화가 목적에 맞을수 있다. 만약 이를 모두 동일한 Y축 스케일로 만들기 위해서는 먼저 전체 확진자의 최대값을 구하고 Y축 범위를 0부터 최대값까지 설정한다.

max_case <- max(df_covid19_100$new_cases) 

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, name = ~location) |>
      ## layout으로 X, Y축을 설정
      layout(title = list(title = NULL),
             xaxis = list(tickfont = list(size = 10), 
                          showgrid = FALSE),  
             yaxis = list(title = list(text = ~location), 
                          showticklabels = F, 
                          showgrid = FALSE, 
                          rangemode = 'tozero', 
                          range = c(0, max_case)))
  ) |>
  ## 생성된 plotly 객체들을 subplot 생성
  subplot(nrows = 7, shareX = TRUE, shareY = TRUE) |>
  ## 생성된 subplot의 layout 설정
  layout(showlegend = FALSE, 
         title = '최근 100일간 코로나19 확진자수',
         margin = margins)

댓글