Snoopy [Python] Seaborn 3 - scatterplot
Python/Seaborn

[Python] Seaborn 3 - scatterplot

Sooyoon Jeong 2022. 10. 27.

갤러리: Scatterplot with multiple semantics — seaborn 0.12.0 documentation (pydata.org)

 

Scatterplot with multiple semantics — seaborn 0.12.0 documentation

Scatterplot with multiple semantics seaborn components used: set_theme(), load_dataset(), despine(), scatterplot() import seaborn as sns import matplotlib.pyplot as plt sns.set_theme(style="whitegrid") # Load the example diamonds dataset diamonds = sns.loa

seaborn.pydata.org

도큐먼트: seaborn.scatterplot — seaborn 0.12.0 documentation (pydata.org)

 

seaborn.scatterplot — seaborn 0.12.0 documentation

seaborn.scatterplot seaborn.scatterplot(data=None, *, x=None, y=None, hue=None, size=None, style=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=True, style_order=None, legend='auto', ax=None, **kwarg

seaborn.pydata.org


Scatterplot?

산점도 그래프(점으로 데이터의 분포를 나타내는 그래프)

x와 y의 관계를 hue, size, style 파라미터 등을 활용하여 보여주는 그래프이다.

수치형 컬럼만 지정할 수 있을까????

 

데이터셋 로드

tips = sns.load_dataset("tips")
tips.head()

기본 scatterplot

sns.scatterplot(data=tips, x="total_bill", y="tip")

 

수치형 변수와 수치형 변수 간의 관계를 그려보았다.

그럼 x, y에 각각 범주형 변수와 수치형 변수를 넣으면 어떻게 될까?

sns.scatterplot(data=tips, x="day", y="tip")

오류가 나지않고 그래프가 그려진다. 그러나, 산점도 그래프로서의 의미가 있나 싶다.

추측이지만, 산점도 그래프는 수치형 변수와 수치형 변수 간의 관계를 볼 때 의미가 있을 것 같다.

(수치형 변수와 - 범주형 변수의 관계는 다른 그래프가 더 적당하지 않을까?)

 

hue로 색상 구분하기(수치형변수, 범주형변수 모두 가능)

범주형 변수로 구분을 해주었다.

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time")

 

수치형 변수로도 구분할 수 있을까?

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="size")

가능은 하지만, 범례 수가 많아서 보기 힘들다.

hue로 지정하는 변수는 3개 내외의 값을 가진 것으로 지정하는 것이 좋을 것 같다.

(그럼 범주형 변수가 적절할 것 같다.)

 

만약 hue에 고윳값이 많은 수치형 변수를 입력하는 경우엔 균일한 간격을 가진 대표적인 수치들이 범례로 사용된다.

tip_rate = tips.eval("tip / total_bill").rename("tip_rate")
sns.scatterplot(data=tips, x="total_bill", y="tip", hue=tip_rate)

palette

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="size", palette="deep")

style로 점의 스타일을 지정

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", style="time")

style은 ppt의 템플릿과 같은 느낌이다.

 

style을 사용할 때에는 리스트나 딕셔너리 형태로도 지정할 수 있다.

※ lunch는 네모로(s), dinner는 X로 표시해보자.

markers = {"Lunch": "s", "Dinner": "X"}
sns.scatterplot(data=tips, x="total_bill", y="tip", style="time", markers=markers)

 

style - markers에 additional keyword arguments 지정하기

sns.scatterplot(data=tips, x="total_bill", y="tip", s=100, color=".2", marker="+")

hue와 style 함께 사용하기

함께 사용하면 두가지 기준으로 나누어서 자료를 확인할 수 있다.
ex) 토요일 점심, 토요일 저녁 등

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="day", style="time")

size로 점(marker)의 크기를 지정하기

size의 변수로 수치형 변수를 할당하여 점의 크기에 의미를 부여할 수도 있다.

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="size", size="size")

legenth= "full"

size를 사용해서 점(marker)의 크기를 조절하고 

legeth = "full"을 함께 사용하면, 범례에 모든 고유값을 강제로 표시할 수 있다. 

sns.scatterplot(
    data=tips, x="total_bill", y="tip", hue="size", size="size",
    sizes=(20, 200), legend="full"
)

여기서는 원래 size 범례의 모든 항목이 표시되었기 때문에 별 의미가 없지만,

hue와 마찬가지로 size에 고유값이 많은 수치형 데이터를 입력하는 경우에 사용하면 의미가 있지 않을까 싶다.

hue_norm

hue_norm에 튜플 값이나 matplotlib.colors.Normalize 를 전달하면,
정규화하여 정량적 색상 매핑을 할 수 있다.

sns.scatterplot(
    data=tips, x="total_bill", y="tip", hue="size", size="size",
    sizes=(20, 200), hue_norm=(0, 7), legend="full"
)

wide-form data의 scatterplot

지금까지 long-form data의 산점도 그래프를 살펴보았다.
wide-form data의 산점도도 알아보자.

import pandas as pd
import numpy as np

index = pd.date_range("1 1 2000", periods=100, freq="m", name="date")
data = np.random.randn(100, 4).cumsum(axis=0)
wide_df = pd.DataFrame(data, index, ["a", "b", "c", "d"])
sns.scatterplot(data=wide_df)

relplot 맛보기

relplot은 scatterplot과 Facetgrid를 결합한 형태이다.
범주형 변수도 부가적인 그룹화도 가능하고, 다수의 subplot도 지정이 가능하다.

relplot을 사용하는 것이 패싯 간의 의미 매핑을 보다 잘 나타내기 때문에 

facetgrid를 직접 사용하는 것보다 더 좋다.

sns.relplot(
    data=tips, x="total_bill", y="tip",
    col="time", hue="day", style="day",
    kind="scatter"
)

 

'Python > Seaborn' 카테고리의 다른 글

[python] Seaborn 4 - lineplot  (1) 2022.11.15
[Python] seaborn 2 - lmplot  (0) 2022.10.27
[Python] seaborn 1 - 기본개념  (0) 2022.10.27

댓글