Python/Plot

[Pandas] Line, Scatter, Box, Histogram, Density, Bar, Pie Plot :: add Hline, Vline, Plot Customizing, by Group

슈퍼짱짱 2021. 6. 21. 13:55
반응형

판다스 데이터 프레임으로 여러가지 그래프를 그리고, Customizing 하는 방법에 대해 알아보겠다.

 

1. Import Library

matplotlib 와 seaborn을 활용한다.

 

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
import random

 

2. Create Sample Data Set

50개의 random 한 데이터를 만들어 준다.

group별로 그래프를 customizing 하기 위해 A, B, C로 이루어진 'group' 컬럼도 생성한다.

 

data = pd.DataFrame({"x":np.random.rand(50),
                    "y":np.random.rand(50),
                    "z":np.random.rand(50),
                    'group': np.random.choice(['A','B','C'],50)})

 


3. Line Plot

가장 기본적인 Line Plot은 다음과 같이 그릴 수 있다.

x축은 data의 index, y축은 지정해 준 'x' 로 그려진다.

 

data['x'].plot()

 

 

'x' 뿐 아니라, 'y' 까지 함께 그려주고 싶으면 다음과 같이 해주면 된다.

같은 방법으로 'z' 까지도 그릴 수 있다.

 

data[['x','y']].plot(figsize = (10,5))

 

 

subplots = True 를 지정해주면 하나의 plot 이 아니라 컬럼별로 각각 그려진다.

단, figsize는 각각 하나의 size가 아니라, 전체 plot의 사이즈임을 주의한다.

 

data[['x','y']].plot(figsize = (10,10), # 전체 figure size
                    subplots = True)

 

 

선 색상을 바꾸거나, 그래프의 제목을 지정하는 등 Cutomizing 하는 방법은 다음과 같다.

 

figsize 로 그래프 전체 사이즈를 지정하고,

color 로 선 색상을 지정하며,

xlabel, ylabel 로 x축과 y축의 이름을 지정한다.

xlim, ylim으로 x축, y축의 범위를 지정하고,

title로 그래프의 제목을 지정한다.

 

data['x'].plot(figsize = (10,5), # figure size(width, height)
               color='r', # color
               xlabel="index", # label of x 
               ylabel = 'X', # label of y 
               xlim=(-5,55), # x축 범위
               title = "Plot of X") # title

 


수평선axhline()으로 그린다.

 

수평선을 추가할 y값을 넣어주고, 

color로 색상을 지정하고,

linestyle, linewidth 등으로 Customizing 해준다.

 

fig, ax = plt.subplots()
data['x'].plot(ax = ax,
               figsize = (10,5), # figure size(width, height)
               color='gray', # color
               xlabel="index", # label of x 
               ylabel = 'X', # label of y 
               xlim=(-5,55), # x축 범위
               title = "Plot of X") # title

plt.axhline(data.x.mean(), # y축 위치
            color='r', # 색상
            linestyle='--', # dashed lind
            linewidth='2') # size

 

 

x축 전체가 아닌, 원하는 만큼만도 그릴 수 있다.

axhline()이 아닌 hlines()를 활용하며,  xmin, xmax로 원하는 x 축의 범위를 넣어준다.

(axhline() 도 xmin, xmax로 입력 가능하나, 실제값이 아니라 0~1 사이의 상대값으로 넣어야 한다.)

 

fig, ax = plt.subplots()
data['x'].plot(ax = ax,
               figsize = (10,5), # figure size(width, height)
               color='gray', # color
               xlabel="index", # label of x 
               ylabel = 'X', # label of y 
               xlim=(-5,55), # x축 범위
               title = "Plot of X") # title

plt.hlines(data.x.mean(), # y축 위치
            xmin = 10, 
            xmax = 30, 
            color='r', # 색상
            linestyle='--') # size

 

 

자주 사용되는 라인스타일은 다음과 같다.

 

https://financedata.github.io/posts/matplotlib_hline_and_vline.html

 


수직선axvline() or vlines() 로 그릴 수 있다.

 

fig, ax = plt.subplots()
data['x'].plot(ax = ax,
               figsize = (10,5), # figure size(width, height)
               color='gray', # color
               xlabel="index", # label of x 
               ylabel = 'X', # label of y 
               xlim=(-5,55), # x축 범위
               title = "Plot of X") # title

plt.axvline(30, # x축 위치
            color='r', # 색상
            linestyle=':', # dashed lind
            linewidth='2') # size

 

 


4. Scatter Plot

scatter plot은 위 기본 line plot에 kind="scatter" 를 추가해주면 된다.

단, 꼭 x와 y를 지정해 주어야 한다.

 

data.plot(kind = "scatter", 
          x = 'x', 
          y = 'y', 
          figsize = (10,5))

 

 

이를 group별로 다른 색을 지정해서 그리는 방법은 다음과 같다.

 

먼저 plt.subplots() 로 도화지를 펴주고,

각 group별로 group.plot() 으로 도화지에 그림을 그려준다.

각각 colorlabel을 지정해주어 group별로 다른 색상으로 그려준다.

 

fig, ax = plt.subplots(figsize = (10,5)) # fig size
colors = ['r','g','b'] # group별 color 지정 
for i, (name,group) in enumerate(data.groupby('group')): 
    group.plot(ax=ax,
               kind='scatter', 
               x="x", y="y", 
               s=50, # size of point
               color=colors[i], 
               label = name)

 

 

참고로 Figure, Axes, Axis의 개념은 다음과 같다.

Figure는 그래프 전체, Axes는 실제 그림이 그려지는 부분, Axis는 축이다.

왼쪽의 Axes는 하나이고, 오른쪽의 Axes는 두 개이다.

 

https://wikidocs.net/14604

 


5. Box Plot

box plot은 kind = "box" 로 그려준다.

 

data[['x']].plot(kind="box",
                figsize = (7,5))

 

box plot은 다음과 같이 customizing 해준다.

 

fig, ax = plt.subplots(figsize = (7,5)) # size
bp = ax.boxplot(data.x, patch_artist=True) # boxplot

for box in bp['boxes']: # box colors
    box.set(color='#F8766D', # box line color
            facecolor='Pink') 

for whisker in bp['whiskers']:
    whisker.set(color="DarkOrange")

for cap in bp['caps']:
    cap.set(color="Gray")

for median in bp['medians']:
    median.set(color="white")

 

 

각각의 색상이 의미하는 것은 다음과 같다.

 

 

Group별로 Customizing하는 방법은 다음과 같다.

group별로 box plot을 그려주고, for문을 통해 각각 customizing한다.

 

fig,ax = plt.subplots(figsize=(10,5)) # size
colors = ['#F8766D',"#00BFC4","#7CAE00"] # color

bp_dict = data[['x','group']].boxplot( # drawing boxplot by group
    ax = ax,
    by="group",
    return_type='both',
    patch_artist = True,
)

plt.suptitle("")

for row_key, (ax_,row) in bp_dict.iteritems(): # set colors
    ax_.set_xlabel('')
    for i,box in enumerate(row['boxes']):
        box.set_facecolor(colors[i])

 


6. Histogram

histogram은 hist() 로 그려준다.

 

data[['x']].hist(figsize = (10,5))

 

 

bins는 몇 개의 영역으로 쪼갤 지를 의미하고, density = True는 y 축을 밀도함수로 바꿔주어, 전체 면적 합이 1이되도록 한다.

histtype을 step으로 해주면 아래 색상이 채워지지 않는다.

 

data[['x']].hist(figsize = (10,5), # size
                bins = 20, # 몇 개의 영역으로 쪼갤지
                color = '#F8766D', # color
#                 density = True, 밀도함수 : 면적 합이 1
                histtype = "step")

 

 

수치형 컬럼이 여러개로 이루어진 data에 바로 hist()를 그리면, 각각의 histogram이 그려진다.

layout을 통해 원하는 row 개수와 col 개수를 지정할 수 있다. 

 

data.hist(figsize = (10,10), # size
          bins = 20,
          layout = (3,1),
          color = "#F8766D")

 


7. Density Plot

density plot은 seaborn 기반으로 그려보겠다.

hist 는 histogram을 그릴 것인지, kde는 density line을 그릴 것인지이다.

density plot만 그리고 싶다면 hist는 False로, kde는 True로 그린다.

 

plt.figure(figsize = (18,5))
sns.distplot(data['x'], 
             hist = False, # histogram
             kde = True, # density line
             kde_kws = {'shade': True, 'linewidth': 3})

 

 

Group별로 그리는 방법은 다음과 같다.

 

plt.figure(figsize = (18,5))
for a in set(data.group):
    subset = data[data['group'] == a]
    
    # Draw the density plot
    sns.distplot(subset['x'], hist = False, kde = True,
                 kde_kws = {'shade': True, 'linewidth': 3}, 
                  label = a)

plt.legend(prop={'size': 16}, title = 'label')

 

 


8. Bar Plot

group별 데이터 개수를 bar plot으로 그리면 다음과 같다.

 

data.value_counts('group').plot(kind="bar", figsize = (10,5))

 

 

참고로 data.value_counts('group') 의 type은 pandas Series 이다.

 


9. Pie Chart

역시 group별 데이터 개수로 Pie 차트를 그리면 다음과 같다.

 

data.value_counts('group').plot.pie(figsize = (5,5))

 

 

label과 색상 등은 다음과 같이 바꿀 수 있다. 

autopct로 값을 text로 넣어줄 수도 있다. (합을 100으로 만들어준다.)

 

data.value_counts('group').plot.pie(
                                    labels=["AA", "BB", "CC"], # label
                                    colors=['#F8766D',"#00BFC4","#7CAE00"], # color
                                    autopct="%.2f", # 소수점 
                                    fontsize=20,
                                    figsize=(6, 6))

 

반응형