또르르's 개발 Story

[10] Python 시각화 모듈(matplotlib, seaborn) 본문

부스트캠프 AI 테크 U stage/이론

[10] Python 시각화 모듈(matplotlib, seaborn)

또르르21 2021. 1. 29. 19:23

Python에는 다양하게 시각화를 할 수 있는 모듈들이 있습니다.

대표적으로 matplotlib와 seaborn이 있는데요. 두 가지 시각화 모듈에 대해 알아보겠습니다.

 

1️⃣ Matplotlib

 

matplotlib는 python의 대표적인 시각화 도구입니다. 거의 표준 라이브러리로 사용되는데요.

matplotlib의 장점은 다양한 graph를 지원해주고, pandas와 연동이 가능합니다.

1) pyplot 객체

matplotlib는 pyplot 객체를 사용해서 데이터를 표시합니다.

pyplot 객체에 그래프들을 쌓은 다음 flush를 합니다.

import matplotlib.pyplot as plt


X = range(100)

Y = [value**2 for value in X]

plt.plot(X, Y)					# plot를 사용해서 X, Y data insert

plt.show()					# show를 통해 flush

pyplot 객체에 여러 개의 plot을 그릴 수 있습니다.

X_1 = range(100)

Y_1 = [np.cos(value) for value in X]


X_2 = range(100)

Y_2 = [np.sin(value) for value in X]


plt.plot(X_1, Y_1)

plt.plot(X_2, Y_2)

>>> plt.show()

pyplot의 최대 단점은 argument를 **kwargs로 사용합니다.

그래서 고정된 argument가 없어서 어떤 parameter가 존재하는지 알기 어렵다는 단점이 있습니다.

 

2) pyplot 구조

matplotlib는 Figure이라는 공간에 Axes라는 그래프 캔버스를 가질 수 있습니다.

Figure 안에는 여러 개의 Axes를 생성할 수 있습니다.

https://github.com/BoostcampAITech/lecture-note-python-basics-for-ai

따라서 Figure를 사용해서 하나의 화면에 여러 개의 그래프 캔버스를 띄울 수 있습니다.

https://github.com/BoostcampAITech/lecture-note-python-basics-for-ai

figure에서 아래와 같은 메서드를 사용해서 설정할 수 있습니다.

 

  • set_size_inches(10, 10) : figure의 사이즈를 설정
  • add_subplot(2, 3, i) : figure에 들어가는 axes의 위치를 나타냄
    ( 2 = row size, 3 = column size, i = current postition) => 위의 사진처럼 들어갑니다.
fig = plt.figure()

fig.set_size_inches(10, 10)  # 싸이즈 설정

# plt.style.use("ggplot")    # 스타일적용


ax = []

colors = ["b", "g", "r", "c", "m", "y", "k"]

for i in range(1, 7):

    ax.append(fig.add_subplot(2, 3, i))  		# 두개의 plot 생성
    
    X_1 = np.arange(50)
    
    Y_1 = np.random.rand(50)
    
    c = colors[np.random.randint(1, len(colors))]	# color을 random으로 뽑아줌

    ax[i - 1].plot(X_1, Y_1, c=c)

3) pyplot parameter

  • Color : 색깔 지정
ax_1.plot(X_1, Y_1, c="b")  # 첫번째 plot

ax_2.plot(X_2, Y_2, c="g")  # 두번째 plot

plt.show()  # show & flush

 

  • linestyle : line의 style 지정
plt.plot(X_1, Y_1, c="b", linestyle="dashed")

plt.plot(X_2, Y_2, c="r", ls="dotted")

plt.show()

4) pyplot method

  • title() : plot의 title을 정해줌
plt.title("$y = \\frac{ax + b}{test}$")

 

  • xlabel(), ylabel() : x label, y label의 이름을 정해줌
plt.xlabel("$x_line$")

plt.ylabel("y_line")

 

  • text(), annotate() : plot에서 텍스트나 주석을 추가
plt.text(50, 70, "Line_1")

plt.annotate(

    "line_2",
    
    xy=(50, 150),
    
    xytext=(20, 175),
    
    arrowprops=dict(facecolor="black", shrink=0.05),
    
)

 

  • legend() : label 설명 추가
plt.legend(shadow=True, fancybox=False, loc="upper right")

 

  • grid() : graph의 보조선을 긋는다.
plt.grid(True, lw=0.4, ls="--", c=".90")

 

  • xlim(), ylim() : x축과 y축의 범위 한계 지정
plt.xlim(-1000, 2000)

plt.ylim(-1000, 2000)

 

  • savefig() : 현재까지 plot에 올린 figure를 저장함 (주의할점은 show()를 사용하기 전에 사용)
plt.savefig("test.png", c="a")

 

5) pyplot graph 종류

 

  • Scatter (1)

    지정한 marker에 따라 흩뿌려진 모형

plt.scatter(data_1[:, 0], data_1[:, 1], c="b", marker="x")

plt.scatter(data_2[:, 0], data_2[:, 1], c="r", marker="o")


plt.show()

 

  • Scatter (2)

    데이터의 크기(area)를 지정하면 데이터 크기비교도 가능합니다.

area = np.pi * (15 * np.random.rand(N))**2

plt.scatter(x, y, s=area, c=colors, alpha=0.5)

plt.show()

 

  • bar chart (1)

    width를 사용해서 길이 조정, "X+0.50"와 같은 형태로 bar 간격을 정할 수 있습니다.

plt.bar(X + 0.00, data[0], color="b", width=0.50)

plt.bar(X + 0.50, data[1], color="g", width=0.50)

plt.bar(X + 1.0, data[2], color="r", width=0.50)

plt.xticks(X + 0.50, ("A", "B", "C", "D"))

plt.show()

 

  • bar chart (2)

    위로 쌓아올린 차트, bottom parameter을 사용하면 됩니다.

for i in range(3):

    plt.bar(
    
        X,
        
        data[i],
        
        bottom=np.sum(data[:i], axis=0),
        
        color=color_list[i],
        
        label=data_label[i],
        
    )

 

  • bar chart (3)

    왼쪽과 오른쪽 비교하는 bar chart, barh 함수를 사용합니다.

plt.barh(X, women_pop, color="r")

plt.barh(X, -men_pop, color="b")

plt.show()

 

  • histogram

X = np.arange(1000)

plt.hist(X, bins=100)

plt.show()

 

  • boxplot

    boxplot의 네모칸데이터가 밀집된 것, 직선데이터가 적다는 것(검은 막대기는 정규분포의 95%)을 나타내고, 동그라미예외 데이터를 나타냅니다.

Q1, Q3 값을 사용해서 boxplot를 설정이 가능합니다.

https://towardsdatascience.com/understanding-boxplots-5e2df7bcbd51

data = np.random.randn(100, 5)

plt.boxplot(data)

plt.show()

 

2️⃣ Seaborn

 

Seaborn은 matplotlib보다 더 쉬운 방법으로 사용이 가능합니다.

기존 matplotlib에 기본 설정을 가지고 복잡한 그래프를 간단하게 만들 수 있습니다.

 

또한, seaborn의 좋은 점은 모듈에서 예시 데이터를 제공합니다.

import seaborn as sns

tips = sns.load_dataset("tips")		# tips에 대한 데이터를 가져옴

fmri = sns.load_dataset("fmri")		# fmri에 대한 데이터를 가지고옴

 

1) lineplot

 

선으로 이어진 plot을 출력합니다.

여기서 연하게 blur 처리된 부분은 데이터의 밀집을 나타내며 데이터가 얼마나 분산되어있는지 알 수 있습니다.

sns.lineplot(x="timepoint", y="signal", data=fmri)

hue라는 parameter를 사용하면 해당 column을 기준으로 lineplot이 만들어집니다.

(hue의 값은 ['stim', 'cue']로 구성되어 있습니다. => unique 메서드로 알 수 있음)

sns.lineplot(x="timepoint", y="signal", hue="event", data=fmri)

 

2) scatterplot

 

흩뿌린 데이터 형태로 plot을 출력합니다.

데이터의 위치를 좀 더 명시적으로 알 수 있습니다.

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

 

3) regplot

 

scatter에서 regression함수를 추가해서 보여줍니다.

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

 

4) countplot

 

bar chart같이 보여줍니다.

sns.countplot(x="smoker", hue="time", data=tips)

 

5) barplot

 

barplot은 bar chart에서 검은 막대(정규분포의 95%)를 추가한 모형입니다.

sns.barplot(x="day", y="total_bill", data=tips)

 

6) distplot

 

histogram 모형을 나타냅니다.

sns.distplot(tips["total_bill"], bins=10, kde=False)

 

7) violinplot

 

violinplot은 boxplot에 데이터 밀집을 추가해서 보여줘 데이터 분포를 한눈에 보 수 있습니다.

sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted")

8) swarmplot

 

swarmplot은 violinplot과 비슷하지만 데이터 점 형태로 보여줍니다. 데이터가 적을 때 사용합니다.

sns.swarmplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted")

 

9) FaceGrid & map

 

facegrid는 특정 조건에 따른 다양한 plot을 grid로 볼 수 있습니다. map은 해당 plot으로 변경하는 역할을 합니다.

g = sns.FacetGrid(tips, col="time",  row="sex")

g.map(sns.scatterplot, "total_bill", "tip")

Comments