본문 바로가기
AI 공부/파이썬

파이썬 (Matplotlib)

by AI Sonny 2022. 8. 31.
728x90

colab 한글 깨짐 방지

  • 실행 후 런타임 다시 시작할 것
!apt -qq -y install fonts-nanum > /dev/null

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font_name = fm.FontProperties(fname=fontpath).get_name()
fm._rebuild()

%config InlineBackend.figure_format = 'retina' 

plt.rc('font', family=font_name)
plt.rcParams['axes.unicode_minus'] = False

 

글씨 폰트가 깨지므로 폰트를 설정해주고, "-" 기호도 깨지지 않게 해준다.

 

import pandas as pd
import numpy as np

 


matplotlib

  • 파이썬의 대표적인 과학 계산용 그래프 라이브러리
  • plt.figure: 축과 그래프, 그래프의 제목 같은 것들을 표시할 수 있는 컨테이너
  • plt.axes: 눈금과 레이블, 그래프가 있는 테두리 박스로 시각화를 형성하는 좌표평면

 

예시

 

plt.figure() # 그래프를 그리기 위한 틀을 만든다.
plt.axes() # 그 안에 그래프들을 그린다.
plt.show() # 실제 화면에 표시한다.

 

출력

 


단일 그래프

  • plot 함수
    • line plot을 그려주는 함수
    • figure, axes 객체가 없다면 이를 만들어서 그려준다.

 

예시

 

plt.plot(np.arange(2,7)) # 1개만 들어갈 경우 y값 (x값은 인덱스 번호)
plt.show()

 

plt.plot() 안에 값을 넣으면 그래프 그리는 것이 가능하다.

 


다중 그래프

  • 1개의 axes 안에 여러개의 그래프를 그린다.
plt.figure(figsize=[15,5]) # [넓이, 높이]
plt.plot(np.arange(5)) # x 축
plt.plot(np.arange(2,7))    # y 축
plt.show()

 

 


subplots 함수를 이용하여 axes 여러개 그리기

  • 함수를 실행하면 ,figure, axes 객체가 반환된다.
fig, ax = plt.subplots(2,2,figsize=[15,5])
print(ax.shape)
ax[0,0].plot(np.arange(5)) # 인덱스 접근하듯이

ax[0,1].plot(np.arange(2,6))
ax[0,1].plot(np.arange(5)) # 0~4

ax[1,0].plot(np.arange(5))

ax[1,1].plot(np.arange(5))
plt.show()

 

인덱스를 접근하는 방식으로 각 위치의 값에 plot하여 값을 넣어주면 4개의 그래프가 생성된다.

 

 


 

타이틀 설정하기

  • figure 객체의 제목은 subtitle 메소드
  • axes 객체의 제목은 set_title 메소드
fig,ax = plt.subplots(1,2,figsize = (15,5))
fig.suptitle("figure title")

x = range(0,10) # x 축
y = np.exp(x) # y 축
ax[0].plot(x,np.exp(x))
ax[0].set_title("exp")

x = range(1,1000) # x 축
y = np.log(x) # y 축
ax[1].plot(x,y)
ax[1].set_title("log")

plt.show()

 

x 축과 y축을 선언하여, plot안에 넣으면 x축과 y축에 관련된 그래프를 볼 수 있다.

 

예시

 

 


x와 y 축에 이름 넣기

  • axis 객체의 set_xlabel, set_ylabel 메소드를 사용하면 된다.

 

예시

 

x = range(1,1000)
y = np.log(x)
fig, ax = plt.subplots()
ax.plot(x,y)
ax.set_xlabel("X축 이름", rotation = 90)# rotation => 각도
ax.set_ylabel("Y축 이름", rotation = 0, labelpad = 30) # labelpad => 축값과 간격
plt.show()

 

위 코드에서 처음에 fig, ax = plt.subplots( )은 여러개의 그래프를 나타낼 때 쓰는 것인데 왜 쓰였는지 이해가 안되었다.

 

강사님에게 여쭤보니 fig와 ax가 객체를 받는 것을 나타내기 위해 넣어 둔 것이라 하였다.

 

굳이 필요한 것은 아니라 없어도 되는데 없애면 ax자리에 plt를 넣어야 한다.

 

 


눈금 회전하기

  • axes 객체의 tick_params 메소드
fig,ax = plt.subplots()
ax.plot(x,y)
ax.tick_params(axis="x", labelrotation = 90) # x축의 값들을 90도로 회전!

 

labelrotation을 이용하여 x축의 값들을 90도 회전하였다.

 


x와 y축 눈금 지정하기

  • axes 객체의 set_xticks, set_yticks 메소드
fig, ax = plt.subplots(figsize=[10,10])
ax.plot(range(50))
ax.set_xticks(range(50))
ax.set_yticks(range(50))
ax.tick_params(axis="x", labelrotation = 90)
plt.show()

 

set_xticks를 이용하여 x축의 눈금을 표시할 수 있다.

 

range()이기 때문에 step도 가능한 것을 알 수 있다.

 


Marker,line style, color 변경하기

  • plot 함수에 아규먼트를 지정해주면 된다.
y = np.exp(range(0,10))
fig, ax = plt.subplots(2,2,figsize=[15,10])
ax[0,0].plot(y, marker = "o") # 원
ax[0,1].plot(y, marker = "v",linestyle = "--",color="y") # 역삼각형, 점선, 노란색
ax[1,0].plot(y, marker = "x",linestyle = "",color="r")
ax[1,1].plot(y, marker = "^",linestyle = "-.",color="g")
plt.show()

 

 

mark를 활용하면 여러 그래프를 구별할 때 유용할 것 같다.

 


범례 표시

  • axes 객체의 legend 메소드
fig, ax = plt.subplots()
x = np.arange(10)
ax.plot(x)
ax.plot(x**2,alpha = 0.3) # alpha = 투명도 0~1 사이값을  넣어주면 된다.
ax.legend(["X","X^2"],loc = [0,1]) # 그린 순서대로 넣기!, 범례 loc = 시작 지점
plt.show()

 

범례는 그래프의 선이 어떠한 정보인지를 알려준다.

 

범례의 위치를 조절하면서 그래프를 만들 수 있다.

 

 


데이터 불러오기

데이터를 볼 때 정답을 찾으려 하지 말고, 질문을 해라!

 

질문을 통해 가설을 세우고, 왜 맞고, 안맞는지에 대해 분석!

 

import seaborn as sns # 원격으로 서버에 교육용 데이터를 가져올 수 있다.
df = sns.load_dataset("tips")
df.columns = ["지불금액","팁금액","성별","흡연자여부","요일","식사타임","인원수"]
df.info()

 

seaborn을 이용하여 데이터를 가져오고,  컬럼명들을 변경하였다.

 


Line Plot

  • 일반적으로 시간을 x축에 두고 y축 데이터에 추이를 볼 때 사용

- 요일별 매출에 대한 추이 확인하기

 

tmp = df.groupby("요일").agg({"지불금액":"sum"}).reset_index()
fig,ax = plt.subplots()
ax.plot(tmp["요일"], tmp["지불금액"])
plt.show()

 

 


Scatter Plot

  • 산점도 그래프
  • 두 변수 사이의 관계를 파악할 때 사용
fig,ax = plt.subplots() # 양의 상관관계
ax.scatter(df["지불금액"],df["팁금액"])
plt.show()

 


Barplot, Barhplot

  • 범주형 변수에 대한 집계를 시각화
  • 개수 비교할 때 사용
fig,ax = plt.subplots() # 세로
ax.bar(df["요일"].value_counts().index,df["요일"].value_counts())
plt.show()

 

 

fig,ax = plt.subplots() # 가로
ax.barh(df["요일"].value_counts().index,df["요일"].value_counts())
plt.show()

 


Pie charts

  • 원그래프
  • 전체에서 각 부분의 비율을 부채꼴 모양으로 나타낸 그래프
fig,ax = plt.subplots(figsize = (7,5)) # 자주 쓰이지 않는다.

ax.pie(
    tmp["식사타임"],
    labels = tmp["요일"],
    startangle = 90,
    colors = ["r","g","y","b"], # 시계 반대방향
    explode = [0.1,0,0,0], # 벌어지는 정도
    autopct = '%.2f%%' # 수치값
)
plt.show()

 

요일에 따른 식사타임에 대한 원차트이다.

 

이건 잘 안쓰인다고 하니 그냥 이런거구나하고 넘어가자

 


Histogram

  • 수치형 데이터 구간의 빈도수를 볼 때 사용
  • 데이터 분포를 볼 때 사용한다.
np.random.seed(42)
arr = np.random.randn(1000)
fig, ax = plt.subplots()
ax.hist(arr)
plt.show()

 

다음의 히스토그램을 보면 종모양으로 정규분포를 따르는 것을 볼 수 있다.

 

 

 

대부분의 히스토그램은  다음과 같은 형식이 많다.

 

 


Box Plot

  • 4분위수를 기준으로 데이터의 최대, 최소, Q1(25%지점), Q2(50%지점),Q3(75%지점) 등 통계적인 부분들을 통계적인 부분들을 손쉽게 시각화
  • 이상치도 쉽게 파악할 수 있다.
  • IQR(Inter Quatitle Range)
    • Q3 - Q1
    • 3사분위수와 1사분위수의 차이
  • Box Plot 최대값: Q3 + IQR * 1.5
  • Box Plot 최소값: Q1 - IQR * 1.5
  • Box Plot 에서는 최소값과 최대값을 벗어나면 이상치로 판단한다.

팁 금액에 따른 4분위수

 

q_arr = df["팁금액"].quantile(np.arange(0,1.1,0.25)).to_numpy()
q_arr

 

공식을 적용시키면 다음과 같이 box의 min,max와 iqr을 구할 수 있다.

 

iqr = q_arr[3] - q_arr[1]
iqr
box_min = q_arr[1] - iqr * 1.5 # 박스플롯의 최소값
box_max = q_arr[3] - iqr * 1.5  # 박스플롯의 최대값
iqr,  box_min, box_max

=> (1.5625, -0.34375, 1.21875)

 

박스 플롯 그래프

 

fig, ax = plt.subplots(figsize = (15,10))
ax.boxplot(df["팁금액"])
ax.set_yticks(yticks)
plt.show() # 데이터의 최소값이 1이라 -0.34에 표시된게 아니라 1에 표시됨!

 


오늘은 나의 데이터에 따라 시각화하는 방법을 배웠다.

 

시각화하면 생각하지 못한 곳에서 새로운 가치를 찾을 수 있다.

728x90

'AI 공부 > 파이썬' 카테고리의 다른 글

파이썬 (seaborn)  (0) 2022.08.31
파이썬 (Pandas를 이용한 전처리 - 1)  (0) 2022.08.30
파이썬 (Pandas를 이용한 EDA)  (0) 2022.08.30
파이썬 (Pandas 기초)  (0) 2022.08.30
파이썬 (Numpy)  (0) 2022.08.24

댓글