Matplotlib
- 파이썬 프로그래밍 기반 시각화 라이브러리
- Numpy 라이브러리, Pandas 라이브러리와 함께 데이터분석 용으로 많이 사용된다.
- 선 그래프, 산점도, 막대 그래프 등 다양한 플롯 및 차트 기능을 제공한다.
- 기본적으로 파이썬에 제공되는 라이브러리는 아니기 때문에 구글링을 통해 라이브러리를 설치하길 바란다.
Matplotlib 라이브러리 불러오기
import matplotlib as mpl # 맷플롯립 패키지 전부 불러오기
import matplotlib.pyplot as plt # 맷플롯립의 서브패키지 pyplot 불러오기 (대부분 이것 사용)
- 맷플롯립은 관행적으로 mpl이라는 약칭을 사용하여 불러온다.
- 간단한 시각화 작업은 맷플롯립의 서브패키지인 pyplot 만으로도 충분히 수행할 수 있기 때문에, 대부분은 두 번째 줄처럼 pyplot 서브패키지만 불러와서 사용하는 경우가 많다.
- 관행적으로 pyplot의 약칭은 plt로 사용한다.
- pyplot 서브패키지는 공학용 프로그램인 MATLAB과 비슷한 명령어 스타일로 동작한다.
Matplotlib 기본 사용법
선 그래프 그리기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5])
plt.show()
- 가장 간단한 선 그래프를 그려보았다.
- plot은 pyplot 서브패키지의 메서드로, 선그래프를 그리는 기능을 수행한다.
- plt.plot 메서드 안에 들어있는 리스트는 암묵적으로 Y값으로 지정되도록 되어 있다.
- 공식 문서에 따르면, X를 따로 적지 않는 경우 X는 Y의 개수(len(y))로 자동적으로 지정된다고 한다. 즉 X값은 len(y)=len([1,2,3,4,5])=5에 의해서 [0, 1, 2, 3, 4]가 된다.
- 더 자세한 내용은 하단의 공식문서 링크를 들어가서 확인해보자. 코드에 대한 의문이 생기면 공식문서를 찾아보는 것이 가장 빠른 해결법이 아닐까 싶다. (요즘은 ChatGPT가 있긴 하지만..)
- show 또한 pyplot 서브패키지의 메서드로, 그래프를 화면에 표시하는 기능을 수행한다.
- Jupyter, IPython 등의 툴을 사용할 때는 따로 표기할 필요없이 자동으로 그래프가 나오지만, 웬만하면 마지막에 plt.show()를 적도록 하자.
X와 Y 둘 다 명시해서 그리기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50]) # 앞이 X, 뒤가 Y
plt.show()
- 맨앞에 X를 넣으면, X에 따른 Y값을 표시할 수 있다.
- 반드시 X와 Y의 개수는 같아야 함에 유의하자.
레이블이 있는 데이터 불러와서 그리기
import matplotlib.pyplot as plt
DataDict = {
'xValues' : [1, 2, 3, 4, 5],
'yValues' : [10, 20, 30, 40, 50]
}
plt.plot('xValues', 'yValues', data=DataDict)
plt.show()
- dictionary 자료형과 같이, 값에 대한 레이블이 있는 자료형들도 plot을 통해 그릴 수 있다.
- "data=DataDict"처럼 어떠한 데이터를 사용할 것인지 명시만 한다면, x와 y의 자리에 레이블(딕셔너리의 경우 Key)만 적으면 된다.
축 범위 및 스케일 지정
축 범위 지정
- pyplot 모듈의 xlim(), ylim(), axis() 함수를 이용하여 축 범위를 지정할 수 있다.
xlim(), ylim()
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50])
plt.xlim([0, 6]) # [xmin, xmax]
plt.ylim([0, 60]) # [ymin, ymax]
plt.show()
- xlim() : X축의 범위를 지정
- ylim() : Y축의 범위를 지정
- 아무 값도 지정하지 않을 경우, 자동으로 범위가 지정된다.
axis()
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50])
plt.axis((0, 6, 0, 60)) # (xmin, xmax, ymin, ymax)
plt.show()
- axis() 함수를 사용하면 X축과 Y축의 범위를 한 번에 지정할 수 있다.
- 이밖에도 axis() 함수는 'square', 'scaled' 등의 축 옵션을 설정할 수 있다.
축 스케일 지정
- pyplot 모듈의 xscale(), yscale() 함수를 이용하여 축 범위를 지정할 수 있다.
- 축 스케일은 기본적으로 'linear'이며, 'log', 'symlog', 'logit' 등 다양하게 스케일을 변경할 수 있다.
xscale()
import matplotlib.pyplot as plt
plt.plot([-100, -10, 0, 10, 100], [100, 200, 300, 400, 500])
plt.xscale('symlog') # symmetrical log scale
plt.show()
- 원점을 기준으로 대칭적인 로그 스케일인 'symlog'로 X축 스케일을 지정하였다.
yscale()
import matplotlib.pyplot as plt
plt.plot([-100, -10, 0, 10, 100], [100, 200, 300, 400, 500])
plt.yscale('log')
plt.show()
- Y축 스케일을 'log'로 지정하였다.
그래프 스타일 바꾸기
색상
- 문자 혹은 약자를 이용하여 그래프의 색을 지정할 수 있다.
- 색상 목록은 다음 웹사이트를 참고하자.
색상 바꾸기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], color='green')
plt.show()
- color='green'으로 선의 색을 초록색으로 바꾸었다.
color 생략 및 약어 사용
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], 'g')
plt.show()
- color는 생략해도 상관없으며, green의 약어인 'g'로도 동일한 결과가 나온다.
마커 및 선 스타일
- 마커(marker)는 실제 데이터의 위치를 나타내는 기호이다.
- 선 스타일 또한 바꿀 수 있다.
- 마커와 선 종류는 무엇이 있는지는 다음 웹사이트를 참조하자.
마커 및 선 스타일 바꾸기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], linestyle=':', marker='o')
plt.show()
- 선스타일은 'linestyle', 마커스타일은 'marker'에 값을 지정하여 바꿀 수 있다.
- 점선 스타일은 ':' 이며, 동그라미 마커 스타일은 'o'이다.
- 원하는 스타일에 대응되는 값이 무엇인지는 위에서 언급한 웹사이트에 접속하면 나온다.
마커 크기, 선 두께 바꾸기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], linewidth=5, marker='o', markersize=10)
plt.show()
- 마커의 크기는 markersize, 선 두께는 linewidth를 통해 지정할 수 있다.
- 마커의 크기를 정하려면 반드시 마커가 있어야 하므로, marker='' 부분을 빠뜨리지 않도록 유의하자.
색, 마커, 선스타일 한 번에 바꾸기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], 'go:')
plt.show()
- 선의 색, 선스타일, 마커스타일을 합쳐서 지정할 수 있다.
- 'go:'는 ['g' - 초록색 선, 'o' - 동그라미 마커, ':' - 점선]를 의미한다.
튜플로 선 스타일 지정하기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], linestyle=(0, (3, 5, 1, 5)))
plt.show()
- 튜플을 이용하여 더 다양한 선 스타일을 지정할 수 있다.
- 선 스타일 종류는 다음과 같다.
이외에도 스타일은 정말 다양하지만 내용이 너무 많으므로 필요한 게 있다면 다음 웹사이트를 참조하자.
타이틀, 축 레이블 설정
plt.title('타이틀명')
plt.xlabel('X축 레이블')
plt.ylabel('Y축 레이블')
- 그래프의 타이틀, X축 레이블, Y축 레이블을 지정할 수 있다.
타이틀 및 축 레이블 설정하기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50])
plt.title("My Plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
레이블 여백 및 폰트 지정
import matplotlib.pyplot as plt
font = {
'family': 'monospace',
'color': 'b',
'weight': 'bold',
'size': 14
}
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50])
plt.title("My Plot", fontdict=font)
plt.xlabel("X", labelpad=10, fontdict=font)
plt.ylabel("Y", labelpad=10, fontdict=font)
plt.show()
- labelpad: 레이블의 여백을 설정
- fontdict: 폰트 설정
범례 설정
- 범례(legend)란 그래프에 데이터의 종류를 표시하는 텍스트이다.
- plt.legend() 함수를 통해 범례를 나타낼 수 있다.
범례 나타내기
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], label='Line') # label='범례명'
plt.title("My Plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend() # 범례 나타내기
plt.show()
- plt.plot()의 파라미터인 label에 범례 이름을 작성한 뒤, plt.legend() 함수를 호출하면 그래프에 범례가 나타난다.
범례 위치 및 스타일 설정
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], label='Line')
plt.title("My Plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend(
loc=(0.75, 0.1), # 위치 - 왼쪽 아래: (0, 0), 오른쪽 위: (1.0, 1.0)
shadow=True, # 그림자 설정
fancybox=True, # 모서리를 둥글게 만드는 설정
frameon=True, # 테두리 표시
fontsize=13 # 폰트 크기
)
plt.show()
- loc: 범례 위치 조정
- shadow: 그림자 설정
- fancybox: 범례 모서리 설정
- frameon: 범례 테두리 설정
- fontsize: 범례 폰트 크기 설정
- 이외에도 다양한 파라미터가 있다.
여러 곡선(Curve) 겹쳐 그리기
- 한 개의 Box 안에 여러 Cruve를 함께 그릴 수 있다.
- 여러 Curve를 그리는 방법은 1) plot 함수에 Curve 데이터 여러 개 넘기기, 2) plot 함수 여러 번 쓰기 가 있다.
Curve 데이터 여러 개 넘기기
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2, 0.2)
y = np.arange(0, 2, 0.2)
plt.plot(x, y, 'r', x, y**2, 'b:', x, y**3, 'g--')
plt.title("My Plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
- plot() 함수에 (X, Y, 선스타일) 순서대로 총 3개의 Curve 데이터가 입력되었다.
plot() 함수 여러 개 사용
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2, 0.2)
y = np.arange(0, 2, 0.2)
plt.plot(x, y, 'r', marker='^')
plt.plot(x, y**2, 'b:', marker='*')
plt.plot(x, y**3, 'g--', marker='o')
plt.title("My Plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
- plot() 함수를 여러 개 작성하여도 한 Figure 안에 여러 개의 Curve를 나타낼 수 있다.
여러 그래프 그리기
- 같거나, 서로 다른 형태의 그래프를 한 화면에 따로따로 나타낼 수 있다.
- pyplot 모듈의 subplot() 혹은 subplots() 함수를 사용하면 이것이 가능하다.
subplot()
- subplot()에 위와 같이 인자를 전달하면 된다.
- 첫 번째 레이아웃을 선택하여 그래프를 그려보겠다.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2, 0.2)
y = np.arange(0, 2, 0.2)
plt.subplot(2, 1, 1) # plt.subplot(211)
plt.plot(x, y**2, 'r', marker='^')
plt.title("My Plot 1")
plt.xlabel("X")
plt.ylabel("X^2")
plt.subplot(2, 1, 2)
plt.plot(x, y**2, 'b:', marker='*')
plt.title("My Plot 2")
plt.xlabel("X")
plt.ylabel("X^3")
plt.tight_layout()
plt.show()
- plt.plot() 함수를 사용하기 이전에 plt.subplot()을 작성하면, 그래프를 분리하여 한 Figure 안에 나타낼 수 있다.
- 현재 두 그래프는 서로 다른 축을 사용하고 있으며, 파라미터 설정을 통해 같은 축을 공유하도록 설정할 수 있다.
- subplot()에는 콤마(,) 표시 없이 단순히 subplot(221)이라고 작성하여도 같은 동작이 이루어진다.
subplot() - 축(axis) 공유
- sharex 파라미터를 이용하면, 한 그래프의 축을 다른 그래프가 공유하여 사용할 수 있다.
import matplotlib.pyplot as plt
import numpy as np
x1 = np.arange(0, 2, 0.2)
y1 = np.arange(0, 2, 0.2)
x2 = np.arange(0, 5, 0.5)
y2 = np.arange(0, 2, 0.2)
ax1 = plt.subplot(2, 1, 1)
plt.plot(x1, y1**2, 'r', marker='^')
plt.title("My Plot")
plt.ylabel("X^2")
plt.xticks(visible=False) # X축 눈금을 가리는 설정
ax2 = plt.subplot(2, 1, 2, sharex=ax1)
plt.plot(x2, y2**2, 'b:', marker='*')
plt.xlabel("X")
plt.ylabel("X^2")
plt.tight_layout()
plt.show()
- sharex 파라미터로 두 그래프가 같은 X축을 사용하도록 설정하였다.
subplots()
- 이번에는 subplot()이 아니라 subplots()를 사용한다.
- subplot() 함수는 리턴값이 axes 하나이지만, subplots()은 fig와 axes 총 2개의 리턴값을 갖는다.
- fig는 그래프가 그려지는 전체 Figure를 의미하며, axes는 그래프 각각을 의미한다고 보면 된다.
subplot()과 subplots()의 차이
- subplot()은 State-based 방식이며, subplots()는 Object-oriented 방식이다.
- 두 방식의 차이를 ChatGPT한테 물어보았다.
Q) matplotlib에서 subplot과 subplots의 차이?
A)
>> subplot과 subplots는 둘 다 matplotlib에서 여러 개의 축을 가진 그림을 만드는 데 사용됩니다.
subplot은 matplotlib.pyplot의 함수 중 하나로, 단일 그림 내에서 여러 개의 축을 만드는 데 사용됩니다.
subplot은 하나의 숫자와 함께 호출됩니다.
이 숫자는 하나의 숫자로 나타낸 "그리드"에서 각 축의 위치를 지정합니다.
예를 들어, subplot(2,2,3)은 2x2 그리드에서 3번째 위치에 있는 축을 생성합니다.
subplots는 matplotlib.pyplot의 함수 중 하나로, 여러 개의 축을 가진 그림을 만드는 데 사용됩니다.
subplots는 그림에 사용할 축의 수를 인수로 받습니다.
예를 들어, fig, axs = plt.subplots(2, 2)는 2x2 그리드에 4개의 축을 생성합니다.
반환된 fig 객체는 전체 그림에 대한 참조이고, axs 객체는 축의 배열입니다.
즉, subplot은 하나의 그림에 여러 개의 축을 만들기 위해 사용되고,
subplots는 여러 개의 축을 가진 그림 자체를 만들기 위해 사용됩니다.
------------------------------------------------------------------------------------------------------------------------
Q) 둘의 차이는 존재해 subplot은 state-based 방식이고, subplots는 object-orientd 방식이라는 거 같아
A)
>> 네, 맞습니다. subplot은 state-based 방식이고, subplots는 object-oriented 방식입니다.
subplot 함수는 현재 축(axes)을 설정하고, 이후의 모든 플로팅 명령은 현재 축에 적용됩니다.
즉, subplot을 사용하면 pyplot 모듈의 상태가 변경됩니다.
이 방식은 matplotlib의 초기 버전에서 사용되었으며, 간단한 플롯 작업에는 유용하지만,
복잡한 그래프를 만들 때는 제한적입니다.
반면에 subplots 함수는 Figure 객체와 Axes 객체를 모두 반환합니다.
이 방식은 subplot보다 더 객체지향적이며, 그림에 대한 상세한 제어가 가능합니다.
예를 들어, subplots를 사용하면 개별 축에 대한 속성을 쉽게 변경할 수 있습니다.
따라서, subplots 함수를 사용하는 것이 더 권장되는 방식이며,
subplot은 간단한 예제나 빠른 플로팅에만 사용됩니다.
- 이러한 차이가 있다고 합니다.
- subplots()를 사용하는 편을 권장하므로 subplots()를 사용하자.
subplots() 사용
fig, axes = plt.subplots()
fig, axes = plt.subplots(nrows, ncols)
fig, axes = plt.subplots(nrows, ncols, sharex=True, sharey=True)
- nrows는 행 개수, ncols는 열 개수를 지정한다.
- sharex는 X축 공유, sharey는 Y축 공유를 지정한다.
그래프 그리기
# 2x1 Figure
import matplotlib.pyplot as plt
import numpy as np
x1 = np.arange(0, 2, 0.2)
y1 = np.arange(0, 2, 0.2)
x2 = np.arange(0, 5, 0.5)
y2 = np.arange(0, 2, 0.2)
fig, axes = plt.subplots(2, 1, sharex=True, sharey=False)
axes[0].plot(x1, y1, 'r', marker='^', label='Line1')
axes[0].set_title('My Plot')
axes[0].set_ylabel('Y1')
axes[0].legend(loc='upper right')
axes[1].plot(x2, y2, 'b:', marker='*', label='Line2')
axes[1].set_xlabel('X')
axes[1].set_ylabel('Y2')
axes[1].legend(loc='lower right')
plt.show()
- subplot() 때와는 다르게 subplots()를 사용할 때는 axes 객체에 함수를 적용하여 그래프를 그린다.
- 각 그래프를 설정하기 위해 axes 객체에 인덱싱을 통해 접근한다.
- 사용하는 함수명도 subplots()에서는 조금씩 다르다.
- set_title(): 그래프의 타이틀을 지정한다.
- set_xlabel(): X축 레이블을 지정한다.
- set_ylabel(): Y축 레이블을 지정한다.
- set_xlim(): X축 범위를 지정한다.
- set_ylim(): Y축 범위를 지정한다.
- 이외에 다양한 함수가 존재한다.
# 2x2 Figure
import matplotlib.pyplot as plt
import numpy as np
x1 = np.arange(0, 2, 0.2)
x2 = np.arange(0, 3, 0.3)
x3 = np.arange(0, 4, 0.4)
x4 = np.arange(0, 5, 0.5)
fig, axes = plt.subplots(2, 2, sharex=True, sharey=False)
axes[0][0].plot(x1, x1, 'r', marker='^')
axes[0][1].plot(x2, x2, 'g', marker='*')
axes[1][0].plot(x3, x3, 'b', marker='o')
axes[1][1].plot(x4, x4, 'y', marker='1')
plt.show()
- 2x2 Figure에서는 [0][0]이 왼쪽 위, [1][1]이 오른쪽 아래이며, axes 변수에 인덱싱을 이용하여 접근한다.
twinx()
- twinx()는 그래프들이 X축을 공유하도록 설정할 때 사용하는 함수이다.
- subplots()와 함께 사용한다.
import matplotlib.pyplot as plt
import numpy as np
x1 = np.arange(-2, 2, 0.1)
x2 = np.arange(-2, 2, 0.1)
fig, ax0 = plt.subplots()
ax1 = ax0.twinx() # ax0과 X축을 공유하는 객체 ax1 생성
ax0.plot(x1, x1**2, 'r', label='y=x^2')
ax0.set_title("My Plot")
ax0.set_ylabel("X^2")
ax0.legend(loc='lower left')
ax1.plot(x2, (-1)*(x2**2), 'b:', label='y=-x^2')
ax1.set_xlabel("X")
ax1.set_ylabel("- X^2")
ax1.legend(loc='lower right')
plt.show()
- twinx() 함수를 이용하면 X축을 공유하면서 좌/우로 다른 Y축을 갖도록 그래프를 겹쳐 그릴 수 있다.
다양한 그래프 그리기
- matplotlib은 곡선(Curve) 뿐만 아니라 매우 다양한 그래프 함수를 제공한다.
막대 그래프
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
y = np.arange(0, 100, 10)
colors = [np.random.rand(3, ) for _ in range(10)]
# plt.bar(x, y)
fig, ax = plt.subplots(figsize=(6, 6)) # figsize: figure 크기
ax.bar(x, y, width=0.8, color=colors) # width: 막대 너비
plt.show()
- 막대 그래프는 bar() 함수를 이용하여 그릴 수 있다.
- bar() 함수의 파라미터를 조정하여 막대 그래프 스타일을 지정할 수 있다.
- plt.bar()를 사용하여도 동일한 출력을 얻을 수 있다.
수평 막대 그래프
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
y = np.arange(0, 100, 10)
colors = [np.random.rand(3, ) for _ in range(10)]
# plt.barh(x, y)
fig, ax = plt.subplots(figsize=(6, 6))
ax.barh(x, y, height=0.6, color=colors) # 수평막대그래프는 width가 아니라 height
plt.show()
- 수평 막대 그래프는 barh() 함수를 이용하여 그릴 수 있다.
- plt.barh()를 사용하여도 동일한 출력을 얻을 수 있다.
누적 막대 그래프
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(5)
y = np.random.rand(5)
z = np.random.rand(5)
data = [x, y, z]
x_range = np.arange(5)
fig, ax = plt.subplots(figsize=(6, 6))
for i in range(0, 3):
ax.bar(x_range, # [0, 1, 2, 3, 4]
data[i], # x, y, z 순서대로 누적
# bottom(누적 지점) 설정
bottom=np.sum(data[:i], axis=0) # sum(data[:i])부터 막대그래프가 이어 그려짐
)
plt.show()
- 누적막대그래프는 막대그래프 함수인 bar() 혹은 barh()를 그대로 이용한다.
- bottom 파라미터를 이용하여, Y축의 누적 지점을 설정할 수 있다. (sum(data[:i])는 지금까지 누적된 값)
- 아래에서부터 x, y, z 데이터 순서대로 누적 그래프가 그려진다.
산점도(Scatter)
import matplotlib.pyplot as plt
import numpy as np
# x, y 각각 난수 100개 생성
x = np.random.rand(100)
y = np.random.rand(100)
sizes = (20 * np.random.rand(100)) ** 2
colors = np.random.rand(100)
fig, ax = plt.subplots(figsize=(6, 5))
# plt.scatter(x, y)
sc = ax.scatter(x, y, s=sizes, c=colors, alpha=0.7, cmap='Spectral')
# ax.scatter(x, y, s=sizes, c=colors, alpha=0.7, cmap='Spectral')
fig.colorbar(sc, ax=ax) # 컬러바 생성
plt.show()
- 산점도(scatter)는 scatter() 함수를 이용하여 그릴 수 있다.
- scatter 함수의 매개변수로는 기본적으로 X, Y 데이터가 있으며, 이 외에도 s(마커 사이즈), c(마커 색), alpha(불투명도), cmap(컬러맵:색조합) 등의 다양한 매개변수를 갖는다.
- 컬러바를 생성하기 위해 ax.scatter()를 sc 객체에 대입하여 colorbar() 함수의 인자로 넘겼다. 만약 컬러바를 생성할 필요가 없다면 주석 처리한 부분대로 작성하면 되겠다.
히스토그램(histogram)
import matplotlib.pyplot as plt
import numpy as np
# 난수 100개 생성
y = np.array([np.random.randint(30) for _ in range(100)])
fig, ax = plt.subplots(figsize=(10, 5))
ax.hist(y, bins=30, width=1.0) # bins: 구간 개수, width: 막대 너비
# plt.hist(y)
plt.show()
- 히스토그램(histogram)이란 값에 대한 도수를 나타낸 그래프이다.
- 히스토그램은 hist() 함수를 이용하여 그릴 수 있다.
누적 히스토그램
import matplotlib.pyplot as plt
import numpy as np
# 난수 100개 생성
y = np.array([np.random.randint(10) for _ in range(30)])
fig, ax = plt.subplots(figsize=(10, 5))
ax.hist(y, cumulative=True, label='cumulative=True')
ax.hist(y, cumulative=False, label='cumulative=False')
ax.legend(loc='upper left')
plt.show()
- hist() 함수 파라미터를 cumulative=True로 설정하면 누적 히스토그램을 그릴 수 있다.
파이(pie) 차트
import matplotlib.pyplot as plt
import numpy as np
ratio = [17, 26, 11, 25, 21]
labels = ['A', 'B', 'C', 'D', 'E']
fig, ax = plt.subplots(figsize=(7, 7))
ax.pie(ratio, labels=labels, autopct='%.1f%%') # autopct는 숫자 형식 지정 (소수점 한자리)
ax.legend(loc='upper left')
plt.show()
- 파이 차트는 pie() 함수를 이용하여 그릴 수 있다.
- autopct 인자를 통해 파이 차트 내에 숫자를 매길 수 있다.
히트맵(heatmap)
import matplotlib.pyplot as plt
import numpy as np
arr = np.random.standard_normal((20, 20)) # 20x20 표준정규분포 array
fig, ax = plt.subplots(figsize=(9, 7))
hm = ax.pcolor(arr) # ax.matshow(arr)
plt.colorbar(hm, ax=ax) # 컬러바 생성
plt.show()
- 히트맵(heatmap)이란 열(heat)과 맵(map)을 결합시킨 단어로, 데이터의 크기 및 분포 범위에 따라 이를 열분포 형태처럼 나타내는 그래픽 표현 방식이다.
- 히트맵은 pcolor() 함수 혹은 matshow() 함수를 통해서 생성할 수 있다. 두 함수의 차이는 다음과 같다.
Q) pyplot 메서드 중에 히트맵을 그리는 함수가 2개 있어. 그게 pcolor()와 matshow()인데 이 둘의 차이가 뭐니?
A)
>> pcolor()와 matshow()는 모두 2D 배열 데이터의 히트맵을 그리기 위한 pyplot 메서드입니다.
하지만 이 두 메서드는 몇 가지 차이가 있습니다.
matshow()는 입력된 데이터 배열을 이미지로 바로 출력하지만,
pcolor()는 색상 맵을 사용하여 각 값에 대한 색상을 계산합니다.
또한 pcolor()는 격자 형태로 출력되고, x, y축의 눈금을 지정할 수 있습니다.
반면, matshow()는 격자 없이 출력되고, x, y축의 눈금을 지정할 수 없습니다.
또 다른 차이점은 성능입니다. 일반적으로 matshow()는 pcolor()보다 빠르게 동작합니다.
이는 pcolor()가 불필요한 계산을 수행하고 많은 메모리를 사용하기 때문입니다.
따라서 데이터의 크기가 작거나 표현 방법이 격자 형태인 경우에는 pcolor()를 사용하고,
데이터의 크기가 크거나 빠른 성능이 필요한 경우에는 matshow()를 사용하는 것이 좋습니다.
그래프 저장하기
- pyplot 패키지에는 그래프 이미지를 저장하는 함수인 savefig()를 제공한다.
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5])
plt.savefig('line.png', dpi=100) # savefig('파일명'), dpi는 이미지 해상도(디폴트 100)
plt.show()