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

plotly 점의 투명도 조절(alpha, opacity) in R

by 아참형인간 2022. 5. 10.
alpha.knit

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

점의 투명도(alpha) 조절

산점도는 x, y 두개의 변수에 따른 데이터의 위치를 점으로 표현한 시각화 방법이다. 산점도를 통해 데이터의 전반적 분포와 X축의 독립변수에 따른 Y축의 종속변수가 어떻게 분포하는지를 한눈에 확인할 수 있고 그 분포 모양에 따라 상관관계와 상관강도를 알아볼 수 있다.

산점도는 add_markers()add_trace()를 사용하여 쉽게 만들 수 있다.

df_취업률_2000 |> 
  plot_ly() |>
  add_trace(type = 'scatter', type = 'markers', x = ~졸업자수, y = ~취업자수) |>
  layout(title = list(text = '기본산점도 - plotly'), 
         xaxis = list(title = '졸업자수'), 
         yaxis = list(title = '취업자수'), 
         margin = margins)

산점도를 만들때 주의해야 할 것이 산점도에 너무 많은 점이 한곳에 표현되는 오버플로팅(Over-Ploting)이 일어나지 않도록 해야한다는 점이다. 위의 산점도를 보면 다행이 선형 상관관계가 눈에 보이지만 좌측 하단 구간은 데이터가 집중되다보니 검정색 지역만 눈에 보인다. 그 지역에서도 데이터가 특히 밀집된 지역이 존재하겠지만 데이터가 오버플로팅되어 이러한 데이터의 밀집을 전혀 확인할 수 없다. 이런 오버플로팅을 해결하기 위해 사용하는 방법 중 투명도 조절 방법을 잘 사용하면 효과적으로 오버플로팅을 제거할 수 있다.

plotly를 사용하여 점의 투명도 조절를 통한 오버플로팅 제거는 다음과 같다.

df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, alpha = 1) |> 
  layout(title = '산점도(alpha = 1)',
         margin = margins
  )
df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, alpha = 0.75) |> 
  layout(title = '산점도(alpha = 0.75)',
         margin = margins
  )
df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, alpha = 0.5) |> 
  layout(title = '산점도(alpha = 0.5)',
         margin = margins
  )
df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, alpha = 0.25) |> 
  layout(title = '산점도(alpha = 0.25)',
         margin = margins
  )

plotly에서는 alpha 속성과 함께 opacity를 사용하여 오버플로팅을 제거할 수 있다. opacity는 점들이 겹쳐질 때 겹쳐지는 부분의 투명도를 계속해서 유지하는 투명도 설정이다. 이 속성은 서로 겹치는 부분이 얼마나 겹쳐있는지를 알 수 없기 때문에 분포의 집중도를 알 수 없다는 단점이 있다.

df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, opacity = 1) |> 
  layout(title = '산점도(opacity = 1)',
         xaxis = list(title = '졸업자수'), 
         xaxis = list(title = '취업자수'), 
         margin = margins
  )
df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, opacity = 0.75) |> 
  layout(title = '산점도(opacity = 0.75)',
         xaxis = list(title = '졸업자수'), 
         xaxis = list(title = '취업자수'), 
         margin = margins
  )
df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, opacity = 0.5) |> 
  layout(title = '산점도(opacity = 0.5)',
         xaxis = list(title = '졸업자수'), 
         xaxis = list(title = '취업자수'), 
         margin = margins
  )
df_취업률_2000 |> 
  plot_ly() |>
  add_markers(x = ~졸업자수, y = ~취업자수, opacity = 0.25) |> 
  layout(title = '산점도(opacity = 0.25)',
         xaxis = list(title = '졸업자수'), 
         xaxis = list(title = '취업자수'), 
         margin = margins
  )

댓글