이번 포스팅에서는 시간의 흐름에 따른 관측값의 변화, 추세를 시각화하는데 유용한 선 그래프 (Line Graph)를 matplotlib, seaborn, pandas 라이브러리로 그리는 방법을 차례대로 소개하겠습니다.
선 그래프를 그리려면 X좌표와 Y좌표별 값을 순서대로 선으로 이어주면 되는데요, X좌표, Y좌표, 값의 데이터 형태는 리스트, Series, 데이터프레임 등 여러가지가 가능합니다. 이번 포스팅에서는 이중에서도 (1) 옆으로 긴 데이터프레임(Wide-form DataFrame)과, (2) 아래로 긴 데이터프레임(Long-form DataFrame)을 사용하여 선 그래프 (Line Graph) 그리는 방법을 소개하겠습니다.
[ 선 그래프를 그리는 두 가지 형태의 DataFrame: Wide-form, Long-form DataFrame ]
먼저 난수를 사용하여 4개의 연속형 변수를 가지는 시계열(time-series) 데이터셋을 (1) Wide-form DataFrame 과 (2) Long-form DataFrame을 만들어보겠습니다.
(Data form 1) Wide-form DataFrame |
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.rcParams['figure.figsize'] = [12, 8]
|
np.random.seed(123) # for reproducibility index = pd.date_range("1 1 2010", 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']) wide_df.shape (100, 4)
wide_df.head()
|
(Data form 2) Long-form DataFrame |
# stack to reshape from wide to long long = wide_df.stack()
long_df = pd.DataFrame(long).reset_index() long_df.head()
# change column nane long_df.columns = ['Date', 'Group', 'CumVal'] long_df.head()
long_df.shape (400, 3) # adding a 'Size' column based on 'Group' long_df['Size'] = np.where(long_df['Group'] == 'a', 1, np.where(long_df['Group'] == 'b', 2, np.where(long_df['Group'] == 'c', 3, 4))) long_df.head(n=12)
|
1. matplotlib으로 선 그래프 그리기 (Line Graph by matplotlib) |
1-1. Wide-form DataFrame
matplotlib 으로 선 그래프를 그릴 때 점의 모양(marker)와 색깔을 4개 변수별로 다르게 설정해보았습니다.
# Line Graph by matplotlib with wide-form DataFrame plt.plot(wide_df.index, wide_df.a, marker='s', color='r') plt.plot(wide_df.index, wide_df.b, marker='o', color='g') plt.plot(wide_df.index, wide_df.c, marker='*', color='b') plt.plot(wide_df.index, wide_df.d, marker='+', color='y') plt.title('Line Graph w/ different markers and colors', fontsize=20) plt.ylabel('Cummulative Num', fontsize=14) plt.xlabel('Date', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show()
|
아래는 선 모양(line style)과 선 두께(line width)을 4개 변수별로 다르게 설정해보았습니다.
# Line Graph by matplotlib with different line style and line width plt.plot(wide_df.index, wide_df.a, linestyle='--', linewidth=1) # 'dashed' plt.plot(wide_df.index, wide_df.b, linestyle='-', linewidth=2) # solid plt.plot(wide_df.index, wide_df.c, linestyle=':', linewidth=3) # dotted plt.plot(wide_df.index, wide_df.d, linestyle='-.', linewidth=4) # dashdotted plt.title('Line Graph w/ different linestyles and linewidths', fontsize=20) plt.ylabel('Cummulative Num', fontsize=14) plt.xlabel('Date', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show() |
1-2. Long-form DataFrame
Long-form DataFrame으로 선 그래프를 그릴 때는 for loop 문을 사용해서 변수 별로 subsetting 을 해서 차례대로 선 그래프를 겹쳐서 그려줍니다. (matplotlib이 for loop 문으로 복잡하다면 다음의 seaborn은 상대적으로 매우 깔끔함)
long_df.head(n=8)
# Line graph with long-form DataFrame groups = ['a', 'b', 'c', 'd'] linewidths = [1, 2, 3, 4] for group_name, size in zip(groups, linewidths): # subsetting long_df_sub = long_df[long_df['Group'] == group_name] # plotting plt.plot(long_df_sub.Date, long_df_sub.CumVal, linewidth=size) plt.legend(['a', 'b', 'c', 'd'], fontsize=12, loc='best') plt.show() |
2. seaborn으로 선 그래프 그리기 (Line Graph by seaborn) |
2-1. Wide-form DataFrame
데이터셋이 Wide-form DataFrame 형태이면 sns.lineplot(data=df_name) 딱 한줄이면 디폴트 세팅 만으로도 매우 보기에 좋은 선 그래프가 그려집니다.
# Line graph by seaborn ax = sns.lineplot(data=wide_df) plt.title('Line Graph w/ Wide-form DataFrame by seaborn', fontsize=20) plt.ylabel('Cummulative Num', fontsize=14) plt.xlabel('Date', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show() |
2-2. Long-form DataFrame
seaborn 라이브러리의 묘미는 hue argument를 사용할 때입니다. ^^ hue='Group'변수별로 색깔을 다르게 하고, size='Size' 변수값에 따라 선 굵기(size)를 다르게 해보겠습니다.
# Line graph with long-form DataFrame long_df.head(n=8)
ax = sns.lineplot(x='Date', y='CumVal', hue='Group', size='Size', data=long_df) plt.title('Line Graph of different size w/ Long-form df by seaborn', fontsize=20) plt.ylabel('Cummulative Num', fontsize=14) plt.xlabel('Date', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show()
|
style argument를 사용하여 선의 형태(line style)을 다르게 설정해보겠습니다. 참고로 style에 설정하는1, 2, 3, 4 숫자별로 선의 형태가 solid, dashed, dotted, dash-dotted 입니다.
ax = sns.lineplot(x='Date', y='CumVal', #hue='Group', style='Size', data=long_df) plt.title('Line Graph of different style w/ Long-form df by seaborn', fontsize=20) plt.ylabel('Cummulative Num', fontsize=14) plt.xlabel('Date', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show()
|
3. pandas로 선 그래프 그리기 (Line Graph by pandas) |
3-1. Wide-form DataFrame
pandas 의 DataFrame에 대해서 df.plot.line() 혹은 df.plot(kind='line') 의 format으로 선 그래프를 그릴 수 있습니다.
wide_df.head()
# Line Graph by pandas wide_df.plot.line() plt.title('Line Graph with Wide-form df by pandas', fontsize=20) plt.xlabel('Date', fontsize=14) plt.ylabel('Cummulative Value', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show() |
# accessed by calling the accessor as a method with the ``kind`` argument wide_df.plot(kind='line') plt.show() |
3-2. Long-form DataFrame
세로로 긴 형태의 DataFrame은 plt.subplots() 에 groupby() operator 와 함께 for loop 문을 사용해서 df.plot(ax=ax, kind='line') syntax 로 선 그래프를 그립니다. 좀 복잡하지요?
long_df.head(n=8)
# Line plot w/ Long-form df by pandas fig, ax = plt.subplots() for key, grp in long_df.groupby('Group'): ax = grp.plot(ax=ax, kind='line', x='Date', y='CumVal', label=key) plt.title('Line Graph with Long-form df by pandas', fontsize=20) plt.xlabel('Date', fontsize=14) plt.ylabel('Cummulative Value', fontsize=14) plt.legend(fontsize=12, loc='best') plt.show() |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. ^^
'Python 분석과 프로그래밍 > Python 그래프_시각화' 카테고리의 다른 글
[Python] 히트맵 그리기 (Heatmap by python matplotlib, seaborn, pandas) (1) | 2019.01.19 |
---|---|
[Python] 모자이크 그래프 (Mosaic Chart) (0) | 2019.01.18 |
[Python] 산점도 행렬 (Scatterplot Matrix) (4/4) (0) | 2019.01.15 |
[Python] 4개 변수로 점의 크기와 색깔을 다르게 산점도 그리기 (Scatter plot with 4 variables, different size & color) (3/4) (2) | 2019.01.13 |
[Python] 그룹별 산점도 점 색깔과 모양 다르게 하기 (Scatter Plot by Groups) (2/4) (3) | 2019.01.13 |