본문 바로가기
Data Visualization/Seaborn

[Seaborn] 7. jointplot

by 베짱이28호 2024. 11. 15.

[Seaborn] 7. jointplot

seaborn jointplot

joint plot의 각 차트별로 특성이 뚜렷해서 구분!


사용할 데이터

import numpy as np
import pandas as pd

n = 1000

# 기본 능력치 생성 (학생들의 전반적인 학습 능력)
base_ability = np.random.normal(0, 1, size=n)
physical_ability = np.random.normal(0, 1, size=n)  # 체육 능력 추가

# 과목별 점수 생성
국어 = 75 + 10 * (0.7 * base_ability + 0.3 * np.random.normal(0, 1, size=n))
영어 = 72 + 12 * (0.6 * base_ability + 0.4 * np.random.normal(0, 1, size=n))
수학 = 70 + 15 * (0.8 * base_ability + 0.2 * np.random.normal(0, 1, size=n))
# 체육은 수학과 반비례하도록 -base_ability 사용
체육 = 80 + 8 * (-0.6 * base_ability + 0.8 * physical_ability + 0.2 * np.random.normal(0, 1, size=n))

# 점수 범위 조정 및 반올림
data = {
    '국어': np.round(np.clip(국어, 50, 100), 1),
    '영어': np.round(np.clip(영어, 50, 100), 1),
    '수학': np.round(np.clip(수학, 50, 100), 1),
    '체육': np.round(np.clip(체육, 50, 100), 1),
    '성별': np.random.choice(['남', '여'], size=n),
    '반': np.random.choice([f'{i}반' for i in range(1,10)], size=n)
}

df = pd.DataFrame(data)

1. joint : 기본

plt.figure(figsize=(10, 10))

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='국어', y='수학',
)

plt.suptitle('국어와 수학의 상관관계', y=1.02)
  • 기본적으로 각 축에 대해서 히스토그램을 표시하고, 메인 차트에서 산점도를 보여준다.


2. joint : scatter

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='국어', y='수학',
    
    # 산점도 설정: 종류 / 색상 / 투명도 / 점크기 / 마커종류
    kind='scatter', color='darkblue', alpha=0.5, s=50, marker='o',
    
    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간
    height=8, ratio=8, space=0.2,
    
    # 주변 분포 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리
    marginal_ticks=True,
    marginal_kws={'bins':50, 'color':'darkblue', 'alpha':0.6,
                 'edgecolor':'white', 'linewidth':1}
)

 


3. joint : KDE

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='국어', y='수학',
    
    # KDE 설정: 종류 / 색상맵 / 투명도
    kind='kde', cmap='Blues', alpha=0.8,
    
    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간
    height=8, ratio=8, space=0.2,
    
    # kde 설정: 등고선 수 / 채우기 / 최소밀도
    joint_kws={'levels':6, 'fill':True, 'thresh':0.0},
    
    # 주변 분포 설정: 눈금표시 / 채우기 / 색상 / 투명도 / 선두께 / 선스타일
    marginal_ticks=True,
    marginal_kws={'fill':True, 'color':'darkblue', 'alpha':0.6,
                 'linewidth':1, 'linestyle':'-'}
)
  • 등고선 레벨 / 등고선 사이 채우기 / 영역 색칠하기 위한 밀도


4. joint : hex

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='국어', y='수학',
    
    # 육각형 설정: 종류 / 색상맵 / 투명도
    kind='hex', cmap='viridis', alpha=0.75,
    
    # 크기 설정: 전체크기 / 비율 / 공간
    height=8, ratio=8, space=0.2,
    
    # hex 설정: 그리드크기 / 최소카운트 / 러그표시
    joint_kws={'gridsize':25, 'mincnt':None, 'marginals':False},
    
    # 히스토그램 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리색상 / 테두리두께 / 통계량
    marginal_ticks=True,
    marginal_kws={'bins':50, 'color':'darkblue', 'alpha':0.6,
                 'edgecolor':'white', 'linewidth':1, 'stat':'density'}
)

plt.suptitle('국어-수학 점수 분포 (Hex)', y=1.02, size=15)
    • mincnt에 True를 넣어주면 데이터가 있는 부분에만 색칠된다. 아닌 경우 아래 차트처럼 전체에 칠해진다.
    • marginal 부분은 위에 히스토그램 설정이다.


5. joint : reg

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='국어', y='수학',
    
    # 산점도 설정: 종류 / 색상
    kind='reg', color='darkblue',
    
    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간
    height=8, ratio=8, space=0.2,
    
    # 회귀선 설정: 산점도 설정 / 회귀선 설정
    joint_kws={'scatter_kws':{'alpha':0.5, 's':50, 'marker':'o'},  # 산점도 스타일
               'line_kws':{'color':'red', 'linewidth':2}},         # 회귀선 스타일
    
    # 주변 분포 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리
    marginal_ticks=True,
    marginal_kws={'bins':50, 'color':'darkblue', 'alpha':0.6,
                 'edgecolor':'white', 'linewidth':1}
)
  • 회귀선이 메인이라 scatter이랑 회귀선 line은 joint_kws에서 전달해야한다.


정리

1. scatter

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='국어', y='수학',
    
    # 산점도 설정: 종류 / 색상 / 투명도 / 점크기 / 마커종류
    kind='scatter', color='darkblue', alpha=0.5, s=50, marker='o',
    
    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간
    height=8, ratio=8, space=0.2,
    
    # 주변 분포 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리
    marginal_ticks=True,
    marginal_kws={'bins':50, 'color':'darkblue', 'alpha':0.6,
                 'edgecolor':'white', 'linewidth':1}
)

2. KDE

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='col1', y='col2',
    
    # KDE 설정: 종류 / 색상맵 / 투명도
    kind='kde', cmap='Blues', alpha=0.8,
    
    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간
    height=8, ratio=8, space=0.2,
    
    # kde 설정: 등고선 수 / 채우기 / 최소밀도
    joint_kws={'levels':6, 'fill':True, 'thresh':0.0},
    
    # 주변 분포 설정: 눈금표시 / 채우기 / 색상 / 투명도 / 선두께 / 선스타일
    marginal_ticks=True,
    marginal_kws={'fill':True, 'color':'darkblue', 'alpha':0.6,
                 'linewidth':1, 'linestyle':'-'}
)

3. Hex

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='col1', y='col2',
    
    # 육각형 설정: 종류 / 색상맵 / 투명도
    kind='hex', cmap='viridis', alpha=0.75,
    
    # 크기 설정: 전체크기 / 비율 / 공간
    height=8, ratio=8, space=0.2,
    
    # hex 설정: 그리드크기 / 최소카운트 / 러그표시
    joint_kws={'gridsize':25, 'mincnt':None, 'marginals':False},
    
    # 히스토그램 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리색상 / 테두리두께 / 통계량
    marginal_ticks=True,
    marginal_kws={'bins':50, 'color':'darkblue', 'alpha':0.6,
                 'edgecolor':'white', 'linewidth':1, 'stat':'density'}
)

4. reg

sns.jointplot(
    # 기본 데이터 설정: 데이터프레임 / X축 / Y축
    data=df, x='col1', y='col2',
    
    # 산점도 설정: 종류 / 색상
    kind='reg', color='darkblue',
    
    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간
    height=8, ratio=8, space=0.2,
    
    # 회귀선 설정: 산점도 설정 / 회귀선 설정
    joint_kws={'scatter_kws':{'alpha':0.5, 's':50, 'marker':'o'},  # 산점도 스타일
               'line_kws':{'color':'red', 'linewidth':2}},         # 회귀선 스타일
    
    # 주변 분포 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리
    marginal_ticks=True,
    marginal_kws={'bins':50, 'color':'darkblue', 'alpha':0.6,
                 'edgecolor':'white', 'linewidth':1}
)

 

 

스니펫

{	
	# scatter
    "Seaborn Jointplot Scatter Template": {
        "prefix": "sns_jointscatter",
        "body": [
            "sns.jointplot(",
            "    # 기본 데이터 설정: 데이터프레임 / X축 / Y축",
            "    data=${1:df}, x='${2:col1}', y='${3:col2}',",
            "",
            "    # 산점도 설정: 종류 / 색상 / 투명도 / 점크기 / 마커종류",
            "    kind='scatter', color='${4:darkblue}', alpha=${5:0.5}, s=${6:50}, marker='${7:o}',",
            "",
            "    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간",
            "    height=${8:8}, ratio=${9:8}, space=${10:0.2},",
            "",
            "    # 주변 분포 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리",
            "    marginal_ticks=True,",
            "    marginal_kws={'bins':${11:50}, 'color':'${12:darkblue}', 'alpha':${13:0.6},",
            "                 'edgecolor':'white', 'linewidth':1}",
            ")"
        ],
        "description": "Create a Seaborn scatter jointplot with common parameters"
    },
    
	# kde
        "Seaborn Jointplot KDE Template": {
        "prefix": "sns_jointkde",
        "body": [
            "sns.jointplot(",
            "    # 기본 데이터 설정: 데이터프레임 / X축 / Y축",
            "    data=${1:df}, x='${2:col1}', y='${3:col2}',",
            "",
            "    # KDE 설정: 종류 / 색상맵 / 투명도",
            "    kind='kde', cmap='${4:Blues}', alpha=${5:0.8},",
            "",
            "    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간",
            "    height=${6:8}, ratio=${7:8}, space=${8:0.2},",
            "",
            "    # kde 설정: 등고선 수 / 채우기 / 최소밀도",
            "    joint_kws={'levels':${9:6}, 'fill':${10:True}, 'thresh':${11:0.0}},",
            "",
            "    # 주변 분포 설정: 눈금표시 / 채우기 / 색상 / 투명도 / 선두께 / 선스타일",
            "    marginal_ticks=True,",
            "    marginal_kws={'fill':${12:True}, 'color':'${13:darkblue}', 'alpha':${14:0.6},",
            "                 'linewidth':1, 'linestyle':'-'}",
            ")"
        ],
        "description": "Create a Seaborn KDE jointplot with common parameters"
    },
    
    # hex
    "Seaborn Jointplot Hex Template": {
        "prefix": "sns_jointhex",
        "body": [
            "sns.jointplot(",
            "    # 기본 데이터 설정: 데이터프레임 / X축 / Y축",
            "    data=${1:df}, x='${2:col1}', y='${3:col2}',",
            "",
            "    # 육각형 설정: 종류 / 색상맵 / 투명도",
            "    kind='hex', cmap='${4:viridis}', alpha=${5:0.75},",
            "",
            "    # 크기 설정: 전체크기 / 비율 / 공간",
            "    height=${6:8}, ratio=${7:8}, space=${8:0.2},",
            "",
            "    # hex 설정: 그리드크기 / 최소카운트 / 러그표시",
            "    joint_kws={'gridsize':${9:25}, 'mincnt':${10:None}, 'marginals':${11:False}},",
            "",
            "    # 히스토그램 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리색상 / 테두리두께 / 통계량",
            "    marginal_ticks=True,",
            "    marginal_kws={'bins':${12:50}, 'color':'${13:darkblue}', 'alpha':${14:0.6},",
            "                 'edgecolor':'white', 'linewidth':1, 'stat':'density'}",
            ")"
        ],
        "description": "Create a Seaborn hex jointplot with common parameters"
    },
    
    # reg
        "Seaborn Jointplot Regression Template": {
        "prefix": "sns_jointreg",
        "body": [
            "sns.jointplot(",
            "    # 기본 데이터 설정: 데이터프레임 / X축 / Y축",
            "    data=${1:df}, x='${2:col1}', y='${3:col2}',",
            "",
            "    # 산점도 설정: 종류 / 색상",
            "    kind='reg', color='${4:darkblue}',",
            "",
            "    # 크기 설정: 차트 변 / 중앙vs주변 비율 / 중앙 주변 공간",
            "    height=${5:8}, ratio=${6:8}, space=${7:0.2},",
            "",
            "    # 회귀선 설정: 산점도 설정 / 회귀선 설정",
            "    joint_kws={'scatter_kws':{'alpha':${8:0.5}, 's':${9:50}, 'marker':'${10:o}'},",
            "               'line_kws':{'color':'${11:red}', 'linewidth':${12:2}}},",
            "",
            "    # 주변 분포 설정: 눈금표시 / 구간개수 / 색상 / 투명도 / 테두리",
            "    marginal_ticks=True,",
            "    marginal_kws={'bins':${13:50}, 'color':'${14:darkblue}', 'alpha':${15:0.6},",
            "                 'edgecolor':'white', 'linewidth':1}",
            ")"
        ],
        "description": "Create a Seaborn regression jointplot with common parameters"
    }
}

'Data Visualization > Seaborn' 카테고리의 다른 글

[Seaborn] 10. stripplot  (0) 2024.11.15
[Seaborn] 9. countplot  (0) 2024.11.15
[Seaborn] 8. pairplot  (0) 2024.11.15
[Seaborn] 6. heatmap  (0) 2024.11.15
[Seaborn] 5. barplot  (0) 2024.11.15
[Seaborn] 4. violin plot  (0) 2024.11.15
[Seaborn] 3. boxplot  (0) 2024.11.15

댓글