본문 바로가기
데이터 분석/시각화

[Seaborn] 1. 선 그래프(라인 차트, Line Chart) 그리기 (feat. lineplot)

by 부자 꽁냥이 2022. 8. 4.

안녕하세요~ 꽁냥이에요. Seaborn은 파이썬 시각화 라이브러리인데요. 기존 Matplotlib을 그대로 계승하면서 사용을 더 편리하게 만들어준 고마운 라이브러리예요. 그래서 Seaborn에 대한 사용법을 알려드리려고 합니다.

 

오늘은 그 첫번째 시간으로 선 그래프(라인 차트, Line Chart, lineplot) 그리는 방법에 대해서 알아보려고 합니다.

 

- 목차 -

1. Seaborn lineplot 기본

2. Seaborn lineplot 다양한 기능

3. 범주를 지정하지 않은 경우

 

 

혹시 Matplotlib으로 선 그래프(라인 차트, Line Chart) 그리는 방법이 궁금하신 분들은 아래 포스팅을 참고해주세요.

 

[선 그래프(Line graph)] 1. Matplotlib을 이용하여 선 그래프 그리기

[선 그래프(Line graph)] 2. Matplotlib을 이용하여 선 그래프 꾸미기

[선 그래프(Line graph)] 3. Matplotlib을 이용하여 여러 개 선 그래프 겹쳐 그리기


   1. Seaborn lineplot 기본

1) 선 그래프 하나 그리기

Seaborn에서는 lineplot을 이용하여 선 그래프를 그릴 수 있어요. lineplot은 matplotlib의 plot 인자를 모두 쓸 수 있습니다.

 

import seaborn as sns
import matplotlib.pyplot as plt
import random

random.seed(100)
x = range(10)
y = [random.randint(1,10) for _ in range(10)]
fig = plt.figure()
fig.set_facecolor('white')
# 선 그래프 한개 그리기
sns.lineplot(x=x, y=y, 
             color='r', # 색상
             linestyle='--', # 라인 스타일
             marker='o') # 마커

주의

혹시 linestyle 인자가 적용이 안 되는(점선이 적용 안 되는) 분들은 seaborn 버전을 확인해주세요. 꽁냥이가 확인해보니 0.10.2에서는 안되고 0.11.1 이상에서는 제대로 작동합니다. 꽁냥이는 0.11.2를 쓰고 있어요


2) 선 그래프 여러 개 그리기

이번에는 선 그래프 여러개 그려볼 거예요. Matplotlib에서와 같이 반복 적용해주면 됩니다. 선 구분을 위해 범례도 추가해보았어요.

 

# 선 그래프 여러개 그리기
random.seed(100)
labels = ['A', 'B', 'C']
fig = plt.figure()
fig.set_facecolor('white')
for _, label in enumerate(labels):
    x = range(10)
    y = [random.randint(1,10) for _ in range(10)]
    sns.lineplot(x=x, y=y, label=label) # label 범례 라벨
    plt.legend()

 


   2. Seaborn lineplot 다양한 기능

Seaborn은 Matplotlib과 다르게 1) Pandas 데이터프레임을 이용한 시각화가 매우 잘되어 있고 2) 범주형 구분을 위한 여러 가지 기능을 제공하고 있습니다.

 

lineplot에는 data라는 인자가 있는데 Pandas 데이터프레임을 받게 되어 있습니다. 그리고 범주형 구분을 위한 엄청난 기능을 제공하는데 하나씩 확인해보겠습니다.

 

1) 범주를 색상으로 표현(hue, hue_order)

lineplot의 hue 인자를 설정하면 색상으로 범주를 표현할 수 있습니다. 여기에서는 seaborn에서 제공하는 비행기 탑승객 데이터를 이용하여 시각화해보겠습니다.

 

df = sns.load_dataset('flights')
df.head()

 

 

꽁냥이는 연도에 따른 월별 탑승객 수를 시각화해볼 거예요. 따라서 범주는 month로 지정해야 하고 x, y, hue 인자 모두 데이터프레임 칼럼 이름을 받습니다.

 

temp_months = ['Jan', 'Feb', 'Mar']
df = df[df['month'].isin(temp_months)]

fig = plt.figure(figsize=(10, 6))
fig.set_facecolor('white')
sns.lineplot(data=df, x='year', y='passengers', 
             hue='month',
             hue_order=temp_months) ## '월'을 나타내는 경우 특정 월만 표시해야 할때에는 반드시 hue_order를 지정해야한다.
plt.show()

 

위 코드에서 주의할 점은 month와 같이 어느 정도 예상가능한 범주는 seaborn이 알아서 12개월에 대한 범주를 잡아준다는 것입니다. 즉, 꽁냥이는 1월~3월까지의 데이터를 이용했다 하더라도 범례에는 12개의 범주가 생성된다는 거예요(왼쪽 그림). 이때 hue_order인자에 표시하고자 할 범주를 제한시켜줘야 범례에 불필요한 범주가 빠지게 됩니다(오른쪽 그림). hue_order는 또한 리스트의 포함된 원소의 순서대로 범례를 표시합니다.

hue_order 인자를 사용하지 않는 경우(왼쪽)과 hue_order를 이용하여 범례에 불필요한 범주를 삭제한 경우(오른쪽)

2) 범주를 선 두께로 표현(size, size_order)

linplot의 size인자를 이용하면 선 두께를 이용하여 범주를 구분할 수 있습니다. 사용법은 hue, hue_order와 동일하므로 설명은 생략하겠습니다.

 

fig = plt.figure(figsize=(10, 6))
fig.set_facecolor('white')
sns.lineplot(data=df, x='year', y='passengers', 
             size='month', size_order=temp_months
             )
plt.show()

 

혹시나 범례 속에 선 색상을 그래프 색상과 맞추고 싶다면 아래와 같이 해주세요.

 

## 범례 색상 변경
fig = plt.figure(figsize=(10, 6))
fig.set_facecolor('white')

## ax 변수에 저장
ax = sns.lineplot(data=df, x='year', y='passengers', 
             size='month', size_order=temp_months
             )

line_color = ax.lines[0].get_color() ## 선 그래프 색상(세개 모두 색상이 같아서 첫번째꺼만 가져옴)

## 범례에 표시된 선 색상 변경
handles, labels = ax.get_legend_handles_labels()
new_handles = []
for hd in handles:
    hd.set_color(line_color)
    new_handles.append(hd)

ax.legend(new_handles, labels, title='month')

plt.show()

 

3) 범주를 선 스타일로 표현

lineplot에서 style 인자를 사용하면 선 스타일로 범주를 구분할 수 있습니다. 사용법은 위와 동일합니다.

 

fig = plt.figure(figsize=(10, 6))
fig.set_facecolor('white')
sns.lineplot(data=df, x='year', y='passengers', 
             style='month', style_order=temp_months
             )
plt.show()

 

여기에서도 범례 선 색상이 그래프 색상과 일치하지 않는데요. 색상을 선 그래프와 일치시키고 싶으면 아래와 같이해주세요.

 

## 범례 색상 변경
fig = plt.figure(figsize=(10, 6))
fig.set_facecolor('white')

## ax 변수에 저장
ax = sns.lineplot(data=df, x='year', y='passengers', 
             style='month', style_order=temp_months
             )

line_color = ax.lines[0].get_color() ## 선 그래프 색상(세개 모두 색상이 같아서 첫번째꺼만 가져옴)

## 범례에 표시된 선 색상 변경
handles, labels = ax.get_legend_handles_labels()
new_handles = []
for hd in handles:
    hd.set_color(line_color)
    new_handles.append(hd)

ax.legend(new_handles, labels, title='month')

plt.show()

 

 

여기서 다룬 것들 외에도 lineplot에는 여러가지 기능들이 있는데요. 자세한 내용은 seaborn 문서(lineplot)를 참고해주세요.

 

반응형

   3. 범주를 지정하지 않은 경우

범주를 지정하지 않는 경우는 어떻게 될까요?

 

temp_months = ['Jan', 'Feb', 'Mar']
df = df[df['month'].isin(temp_months)]

fig = plt.figure(figsize=(10, 6))
fig.set_facecolor('white')
sns.lineplot(data=df, x='year', y='passengers')
             
plt.show()

 

위와 같이 밴드가 그려지게 됩니다. 각 연도마다 3개(1~3월)의 탑승객 데이터가 있으므로 이를 이용하여 밴드가 그려지는데 각 연도마다 최대 탑승객과 최소 탑승객이 상한과 하한으로 그려지게 됩니다. 그리고 가운데 진한 실선은 3개의 평균을 계산하게 되지요.

 

이때 평균이 아닌 중앙값 또는 내가 원하는 다른 값을 실선으로 표현하려면 어떻게 해야할까요? 이때에는 estimator 인자를 사용하면 됩니다. 아래 코드를 통해 사용법을 확인해보세요.

 

import numpy as np
temp_months = ['Jan', 'Feb', 'Mar']
df = df[df['month'].isin(temp_months)]

fig, ax = plt.subplots(2, 2)
fig.set_size_inches((10,10))
fig.set_facecolor('white')
estimators = [(np.mean, 'Mean'), ## 평균
              (np.median, 'Median'), ## 중앙값
              (np.max, 'Max'), ## 최대값
              (np.min, 'Min') ## 최소값
             ]
for i, e in enumerate(estimators):
    estimator = e[0]
    title = e[1]
    row = i//2
    col = i%2
    cur_ax = ax[row, col]
    sns.lineplot(data=df, x='year', y='passengers',
                 estimator=estimator, ## 실선을 그릴 통계 함수
                 ax=cur_ax)
    cur_ax.set_title(title)
             
plt.show()

 


Seaborn이 생각보다 좋은 기능을 많이 가지고 있어요. 알아두시면 유용하게 써먹을 수 있습니다. 부디 이번 포스팅이 도움이 되시길 바라며 이상 마치겠습니다. 감사합니다.

 


댓글


맨 위로