The seaborn.objects interface(seaborn객체 인터페이스)
seaborn객체의 네임스페이스는 seaborn플롯을 만들기 위한 완전한 새로운 인터페이스로서 0.12버전에 도입되었다. seaborn객체 네임스페이스는 데이터 변환 및 시각화를 위해 구성가능한 클래스의 모음으로 이뤄진 더 일관되고 유연한 API를 제공한다. 기존 seaborn함수와는 다르게, 새로운 인터페이스는 처음부터 끝까지 플롯의 지정과 커스터마이징을 matplotlib없이 지원하는 것을 목표로 한다!(필요하다면 matplotlib을 사용할 수 있음)
Note!
객체 인터페이스는 현재 실험적이며 불완전하다. 신중한 사용에는 안정적일 수 있지만, 다듬어지지 못한 점과 누락된 기능이 분명 있다!
Specifying a plot and mapping data(플롯 지정 데이터 매핑)
먼저 seaborn객체는 0.12 버전에서 도입되었으므로...
낮은 버전이면 업그레이드 해야한다!
pip install seaborn --upgrade
업그레이드 했으면 커널을 다시시작하고...
seaborn.objects를 import해애보자!
seaborn객체는 다음 컨벤션을 따라 import되어야 한다!
import seaborn.objects as so
seaborn객체 네임스페이스는 모든 관련 클래스에 대한 접근을 제공한다. 가장 중요한것은 Plot()이다! Plot객체를 인스턴스화 하고 Plot의 메서드를 호출함으로서 플롯을 지정할 수 있다!
직접그려보자!
seaborn내장 데이터 penguins를 사용하자!
import seaborn as sns
penguins = sns.load_dataset("penguins")
penguins
이전에도 사용해봤던 펭귄데이터이다!
so.Plot을 이용해 산점도를 그려보자!
(
so.Plot(penguins, x="bill_length_mm", y="bill_depth_mm")
.add(so.Dot())
)
이렇게 그려진다...
scatterplot을 사용해서 그릴때와 같이 깔끔한 data와 x에는 부리길이, y에는 부리깊이를 넣어줬다!
scatterplot에서는 차트타입을 먼저 정하고 데이터를 넣어줬다면...
여기서는 데이터를 먼저 넣어주고 .add(so.Dot())와 같이 그래프 요소를 추가해서 그렸다!
Setting properties(속성 설정)
위에서 쓴 Dot클래스는 Mark(데이터 값을 그래프적으로 표시하는 객체)의 예시이다. 각각의 mark는 그래프의 모습을 바꾸기 위해 설정될수 있는 많은 속성을 가진다.
위에서 사용한 코드에 아래와 같이 color='g', pontsize=4로 설정하면...
점들이 초록색으로 바뀌고 크기가 작아진다!
(
so.Plot(penguins, x="bill_length_mm", y="bill_depth_mm")
.add(so.Dot(color='g', pointsize=4))
)
Mapping properties(매핑 속성)
seaborn함수와 같이 데이터값을 다양한 그래프 속성에 매핑하는 것도 가능하다!
기본 기능은 새롭지 않은데 기존 함수 API와의 중요한 차이는 바로 전 그림에서와 같이 속성을 직접 설정할 때와 같은 파라미터 이름을 사용하여 속성이 매핑된다는 것이다!(예를 들면 hue, color 대신 둘 다 color를 사용!) 중요한 것은 속성이 정의되는 곳이다. Dot에서 값을 전달해주는 것은 속성을 직접 설정하는 반면 Plot에서 값을 전달할때는 해당데이터를 매핑한다!
바로 전 그림을 그릴 때 Dot에서 color='g', pointsize=4 이런 식으로 직접 값을 전달해 줬는데
이렇게 Plot에서 color='species', pointsize='body_mass_g'로 설정(해당 데이터를 매핑)하면...
(
so.Plot(
penguins, x="bill_length_mm", y="bill_depth_mm",
color='species', pointsize='body_mass_g',
)
.add(so.Dot())
)
이렇게 그려진다...
이 차이를 넘어, 객체 인터페이스는 더 넓은 범위의 mark속성을 매핑되게 한다!
Plot에서 edgecolor(가장자리색)='sex', edgewidth(가장자리두께)='body_mass_g'로 설정하고
Dot에서 color='.8'(0에 가까울 수록 검정색, 1에 가까울 수록 흰색)로 설정하면
(
so.Plot(
penguins, x="bill_length_mm", y="bill_depth_mm",
edgecolor="sex", edgewidth="body_mass_g",
)
.add(so.Dot(color=".8"))
)
이렇게 그림이 그려진다!
Defining groups(그룹 정의)
Dot mark는 각 데이터 점을 독립적으로 나타낸다. 그래서 속성에 변수를 할당하면 각 점의 모습을 바꾸는 효과만 가진다. Line 같이 관찰값을 그룹짓거나 연결하는 마크의 경우 다른 그래픽 요소의 수를 결정한다.
데이터는 seaborn내장 데이터인 healthexp로 하자!
healthexp = sns.load_dataset("healthexp")
healthexp
연도별 국가별 기대 수명 데이터 같다!
x='Year', y='Life_Expectancy', color='Country로 해서...
.add(so.Line())으로 라인그래프를 그리면...
(
so.Plot(healthexp, x="Year", y="Life_Expectancy", color="Country")
.add(so.Line())
)
연도별 기대수명이 그려지는데 국가별로 다른색으로 그려졌다!
group속성을 사용해서 어느 시각적 속성도 바꾸지 않고 그루핑을 정의하는 것도 가능한데...
color='Country'대신 group='Country'으로 하면...
(
so.Plot(healthexp, x="Year", y="Life_Expectancy", group="Country")
.add(so.Line())
)
나라들이 색별로 그려지지 않고 한가지 색으로 그려진다!
참고 사이트
댓글