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

plotly trace의 공통 속성(Attribute) - X, Y, Z좌표 매핑과 범례 이름 매핑

by 아참형인간 2022. 4. 17.
xyz.knit

trace의 공통 속성(Attribute)

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

plotly 객체에서 가장 중요한 것은 trace의 종류이다. plot_ly()만을 사용하여 그래프를 완성할 때 trace의 종류를 생략하면 plotly에서 데이터를 파악하여 가장 좋은 trace를 설정해준다.

trace는 ggplot2에서 geom_*()을 사용하여 데이터를 표현하는 기하 요소를 결정하는 것과 유사한 개념으로 생각하면 쉬울 것이다.

ggplot2에서는 그리고자하는 시각화의 형태에 따라 사용하는 함수가 다르지만 plotly에서는 하나의 함수로 사용할 수도, 시각화의 종류에 따른 함수를 사용할 수도 있다. 따라서 plotly 사용하여 시각화를 만들때는 trace type부터 결정하고 해당 trace의 세부 속성들을 설정해 가면서 만들게 된다. 앞의 포스팅에서 본 것과 같이 plot_ly()를 사용하여도 시각화를 완성할 수 있지만 보다 상세하고 섬세한 시각화를 만들기 위해서는 plot_ly()plotly 객체를 위한 스키마를 초기화하고 이 객체에 add_trace()add_*()를 사용하여 trace를 추가함으로써 만든다.

plotly의 trace에 따라 매우 많은 속성들이 있다. 이 포스팅에서는 대부분의 trace 설정에 공통적으로 사용되는 주요 속성에 대해 설명한다.

x, y, z

trace 설정에서 가장 기본적으로 설정하 는 속성은 x, y, z이다. 이 세 개의 속성은 X축, Y축, Z축에 매핑하는 변수를 설정한다. 앞서 설명한 바와 같이 x, y, z에 매핑하는 변수는 ~를 사용하여 매핑하는데 변수를 매핑하지 않고 벡터를 설정하는 것도 가능하다.

## df_취업률_2000에서 
df_취업률_2000 |> 
  ## X축은 졸업자수, Y축은 취업자수로 매핑한 plotly 객체 생성
  plot_ly(x = ~졸업자수, y = ~취업자수) |>
  ## 제목과 여백 설정
  layout(title = '졸업자 대비 취업자수', margin = margins)

plotly는 3차원 그래픽을 지원하기 때문에 Z축을 설정할 수 있다. 동적 시각화는 사용자가 시각화를 자신이 원하는 방향으로 설정하여 관찰할 수 있기 때문에 3차원 효과가 효율적일 수 있다. 하지만 일반적으로 데이터 시각화에서는 3차원 을 사용하는 것은 크게 효과적이지 않다고 알려져 있기 때문에 3차원의 활용은 주의할 필요가 있다.

df_취업률_2000 |>
  ## X축은 졸업자수, Y축은 취업자수, Z축은 대계열로 매핑된 plotly 객체 생성
  plot_ly(x = ~졸업자수, y = ~취업자수, z = ~대계열)

name

nameplotly에서 추가되는 각각의 trace에 대한 이름을 설정한다. 이 이름은 범례 아이템과 마우스 포인터가 데이터 점에 위치할때 나타나는 호버(Hover)에 표기되는 이름이 된다.

다음은 name에 범례에 표기되어야 할 변수를 매핑하여 범례 아이템 이름을 설정하는 코드이다.

df_취업률_2000 |>
  ## X축은 졸업자수, Y축은 취업자수, name은 대계열로 매핑한 plotly 객체 생성
  plot_ly(x = ~졸업자수, y = ~취업자수, name = ~대계열) |>
  layout(title = '졸업자 대비 취업자수', margin = margins)

만약 범례를 사용자가 원하는 형태로 바꾸려면 범례 아이템을 바꾸는 방법으로 할 수 없고 각각의 개별 데이터에 매핑될 벡터나 열을 만들어 주어야 한다. ggplot2와 같은 정적 시각화는 시각화가 만들어지면 사용자의 활동에 따라 반응이 없지만 동적 시각화는 마우스 포인터를 데이터에 가져가면 해당 데이터에 대한 내용이 표기되어야 한다. 이 값이 범례값과 달라지면 안되기 때문에 범례만 수정할 수 없고 모든 데이터에 1:1로 매핑되는 범례 아이템 이름 벡터가 필요하다.

## 범례로 사용할 문자열 벡터 생성
legend_items <- df_covid19_100 |> 
  mutate(legend_name = case_when(
    iso_code == 'KOR' ~ '한국', 
    iso_code == 'OWID_ASI' ~ '아시아지역',
    iso_code == 'OWID_EUR' ~ '유럽지역',
    iso_code == 'OWID_NAM' ~ '북미지역',
    iso_code == 'OWID_OCE' ~ '오세아니아지역',
    iso_code == 'OWID_SAM' ~ '남미지역', 
    iso_code == 'OWID_AFR' ~ '아프리카지역')) |>
  select(legend_name) |>
  pull()

## 범례 순서 설정을 위한 팩터 설정
legend_items <- fct_relevel(legend_items, '한국', '아시아지역', '유럽지역', '북미지역', '남미지역', '오세아니아지역', '아프리카지역')

df_covid19_100 |>
  ## X축을 date, Y축을 new_cases, 범례 이름을 앞서 생성한 문자열 벡터로 매핑 
  plot_ly(x = ~date, y = ~new_cases, name = ~legend_items) |>
  layout(title = '최근 100일간 코로나19 확진자수', 
         ## X축 이름을 제거
         xaxis = list(title = list(text = '')),
         ## Y축 이름을 설정
         yaxis = list(title = list(text = '확진자수')),
         ## 여백 설정
         margin = margins)

댓글