Python_matplotlib_01(한글 설정, matplotlib 개요)
한글 설정
matplotlib에 설정되있는 폰트가 한글을 지원하지 않기 때문에 그래프의 한글이 깨져서 나온다.
-> 그래서 한글을 사용하기 위해 설정을 변경해야 한다.
# cache 파일 조회
# 다음 실행 결과로 나온 디렉토리 안의 파일을 삭제한다.
print(mpl.get_cachedir())
아래 코드와 같이 입력하고 실행한 뒤 설정파일 경로를 찾아 matplotlib 관련 전역 설정들을 찾아 바꿔준다.
import matplotlib as mpl
print(mpl.matplotlib_fname())
경로의 matplotlibrc 파일에서 아래의 설정으로 바꿔준다.
- font.family:Malgun Gothic
- axes.unicode_minus:False
matplotlib 개요
데이터 시각화
- 데이터의 분석 결과를 쉽게 이해하고 판단할 수 있도록 데이터를 시각적으로 표현하여 전달하기 위한 과정을 말한다.
사용자가 편리하게 이해하도록 하는 데이터 시각화를 위해 파이썬 시각화 라이브러리를 활용한다.
- 대표적 파이썬 시각화 라이브러리
- matplotlib
- seaborn
- pandas
- plotly
- folium
Matplotlib
- 데이터의 시각화를 위한 파이썬 패키지
- 2차원 그래프를 위한 패키지이나 확장 API들을 이용해 3D 그래프등 다양한 형식의 시각화를 지원
- 파이썬 기반의 다른 시각화 패키지의 기본이 된다.
- Seaborn, Pandas 등이 Matplotlib를 기반으로 사용한다.
장점
- 동작하는 OS를 가리지 않는다.
- MATLAB과 유사한 사용자 인터페이스를 가진다.
- 그래프에 대한 상세한 설정을 할 수 있다.
- 다양한 출력 형식으로 저장할 수 있다.
- figure
- 전체 그래프가 위치할 기본 틀
- 하나의 figure에 여러개의 그래프를 그릴 수 있다.
- https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html
- axes(subplot)
- figure내에 한개의 그래프를 그리기 위한 공간
- figure에 한개 이상의 axes(subplot)로 구성해서 각 axes에 그래프를 그린다.
- https://matplotlib.org/stable/api/axes_api.html
- figure내에 한개의 그래프를 그리기 위한 공간
- axis
- 축 (x축, y축)은 값들을 위치시키는 선을 말한다.
- axis label (x, y) : 축의 레이블(설명)
- ticks : 축의 값을 알려주는 눈금
- Major tick
- Minor tick
- title : 플롯 제목
- legend (범례)
- 하나의 axes내에 여러 그래프를 그린 경우 그것에 대한 설명
%matplotlib inline
# %matplotlib qt # qt -> GUI 프로그램 화면을 만드는 라이브러리
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(15,7), facecolor='gray') #facecolor: figure의 배경색
axes1 = fig.add_subplot(1,2,1)
axes2 = fig.add_subplot(1,2,2)
axes1.plot([1,2,3,4,5], [10,20,30,40,50], label='line1')
axes1.plot([1,2,3,4,5], [50,40,30,20,10], label='line2')
axes2.scatter(np.random.randint(100, size=50), np.random.randint(100, 200, size=50), color='r')
fig.suptitle('Example of Plot', size=25, color='blue') #size: 폰트크기, color: 글자색
axes1.set_title("PLOT 1", size=20)
axes2.set_title("Plot 2", size=20)
axes1.set_xlabel("X축", size=15)
axes1.set_ylabel("Y축", size=15)
axes2.set_xlabel("가격1", size=15)
axes2.set_ylabel('가격2', size=15)
axes1.legend()
axes1.grid(True)
plt.show()
그래프 그리기
1. matplotlib.pyplot 모듈을 import
- 2차원 그래프(axis가 두개인 그래프)를 그리기위한 함수를 제공하는 모듈
- 별칭(alias) 로 plt를 관례적으로 사용한다.
- import matplotlib.pyplot as plt
2. 그래프를 그린다.
3. 그래프에 필요한 설정을 한다.
4. 화면에 그린다.
- 지연 랜더링(Deferred rendering) 메카니즘
- 마지막에 pyplot.show() 호출 시 그래프를 그린다.
- 주피터 노트북 맨 마지막 코드에 ;를 붙이는 것으로 대체할 수 있다.
- 그래프를 그리는 두가지 방식
- pyplot 모듈의 함수들을 사용한다.
- Figure와 Axes 객체의 메소드들을 사용한다.
pyplot 모듈을 이용해 그리기
1. pyplot 모듈이 그래프 그리는 함수와 Axes(Subplot) 설정 관련 함수를 제공
# 그래프에 사용할 데이터
x = [1, 2, 3, 4, 5] # x축
y = [10, 20, 30, 40, 50] # y축
# import -> alias : plt
import matplotlib.pyplot as plt
# 그래프 그리기. plt모듈의 함수이용.
plt.plot(x, y) # line plot(선그래프)
# 그래프에 대한 설정
plt.title('Lineplot 예제') # 제목
# x, y값의 label
plt.xlabel('X값')
plt.ylabel('Y값')
# grid가 나오도록 처리
plt.grid(True)
# 눈금(ticks) 설정
# x축 눈금
plt.xticks(ticks=range(0,10), # 눈금의 위치
labels=list('ABCDEFGHIJ') # 각 눈금의 label 지정. ticks와 labels의 개수가 같아야 한다.
)
# y축 눈금
plt.yticks(ticks=range(10,51,5))
# 그래프를 출력
plt.show()
2. 하나의 figure에 여러 그래프 그리기
- plt.subplot(row,columns,num)
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5)) # figure의 크기를 설정. (10 -> 가로길이, 5 -> 세로길이, 단위 : inch)
# axes == subplot (그래프를 그리는 영역). figure에 포함된다.
# 위치 지정
plt.subplot(1, 2, 1) # 위치지정 -> figure를 1행 2열로 나눈다. 그 중 1번(첫번째) subplot에 그린다.
# 그래프 그리기 + 설정
plt.plot(x, y)
plt.title('1번 subplot')
plt.grid(True)
# 위치 지정
plt.subplot(1, 2, 2)
# 그래프 그리기 + 설정
plt.scatter(x, y) # scatter() -> 산점도
plt.title('2번 subplot')
plt.tight_layout() # axes 간의 간격을 알아서 조정.
plt.show()
# 하나의 axes에 여러 그래프를 그리기.
plt.figure(figsize=(8, 5))
plt.plot(x, y, label='비례')
plt.plot(x, y[::-1], label='반비례')
plt.legend(loc='center right') # 범례 (그래프에 대한 설명을 붙여준다.), (loc = '~') 위치결정 "상하,좌우"
plt.show()
Figure 와 Axes 객체를 이용해 그리기
- AxesSubplot 객체(Axes를 표현하는 객체)의 메소드들을 이용해 그래프를 그린다.
- axes 생성 방법
- plt.gca(): AxesSubplot
- 하나의 figure에 하나의 Axes 만 사용할 경우 사용.
- 하나의 figure에 여러개의 Axes들을 사용할 경우
- figure.add_subplot() 메소드 이용
- figure를 먼저 생성후 axes 들을 추가
- pyplot.subplots() 함수를 이용
- figure와 axes배열을 동시에 생성
- figure.add_subplot() 메소드 이용
- plt.gca(): AxesSubplot
Figure에 하나의 axes 그리기
- plt.gca() 사용
axes = plt.gca()
print(type(axes))
axes.plot(x,y)
# 설정 -> set을 앞에 붙인다.
axes.set_title('제목') # plt.title('제목')
axes.set_xticks(ticks=[1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5,5]) # plt.xticks()
axes.set_xlabel('X축 라벨') # plt.xlabel('X라벨')
axes.set_ylabel('Y축 라벨')
axes.grid(True)
plt.show()
하나의 Figure에 여러개의 axes 그리기
1. figure.add_subplot() 메소드 이용
- figure객체에 axes를 추가하는 형태
- nrows(총행수), ncols(총열수), index(axes위치) 지정
# figure 객체 생성
fig = plt.figure()
print(type(fig))
axes1 = fig.add_subplot(2, 2, 1) # 2 X 2 의 첫번째 위치. 추가한 axes객체를 반환
axes1.plot(x, y)
axes1.set_title('1번 axes')
axes2 = fig.add_subplot(2, 2, 3)
axes2.plot(y, x)
axes2.set_title('2번 axes')
axes3 = fig.add_subplot(1, 2, 2)
axes3.bar(['a', 'b'], [10, 20])
axes3.set_title('3번 axes')
plt.tight_layout()
plt.show()
2. pyplot.subplots()
- nrows, ncols 로 axes개수와 위치 지정
- 반환: figure와 axes(subplot)들을 담은 ndarray
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
print(type(fig))
print(type(axes), axes.shape)
axes[0, 0].plot(x, y)
axes[0, 1].plot(y, x)
axes[1, 0].plot(x, y[::-1])
axes[1, 1].plot(x, x)
plt.show()
그래프의 색상과 스타일을 변경할 수 있다.
- 색 지정
- color 또는 c 매개변수를 이용해 지정
- 색상이름으로 지정.
- 색이름 또는 약자로 지정 가능
- ex) 'red', 'r'
- color 값 검색
- https://matplotlib.org/examples/color/named_colors.html
- https://htmlcolorcodes.com/
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
print(type(fig))
print(type(axes), axes.shape)
axes[0, 0].plot(x, y, color='k')
axes[0, 1].plot(y, x, c='#713B30')
axes[1, 0].plot(x, y[::-1], c='0.5')
axes[1, 1].plot(x, x)
plt.show()
- Style
- Style: 그래프의 여러 시각효과들을 미리 설정해 놓은 것
- matplotlib는 다양한 스타일들을 미리 정의해 놓고 있다.
- 스타일목록
- plt.style.use() 함수 이용해 지정
- plt.style.available
- 사용할 수 있는 스타일 이름 조회
- 스타일목록 - Style sheets reference — Matplotlib 3.8.0 documentation
import numpy as np
plt.style.use('default') # 원하는 style 입력 default 입력시 원래의 style로 변경
x = np.linspace(1, 10, num=100) # 1 ~ 10 범위를 100등분했을때 분위수를 가지는 배열
plt.plot(x, x+3)
plt.plot(x, x+2)
plt.plot(x, x)
plt.plot(x, x-1)
plt.show()
plt.scatter(x, x)
plt.show()