Python Library/Matplotlib

[Matplotlib - Python] A Brief matplotlib API Primer

바보1 2022. 6. 16. 02:38
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(10)
data
plt.plot(data)


Figures and Subplots

 

figure을 사용하여 matplotlib 객체를 넣을 수 있습니다.

fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

fig

add_subplot에서 해당 파라미터(n, x, y)의 의미는, n x n의 격자에서 x, y에 넣어라 라는 뜻입니다.

ax3.plot(np.random.randn(50).cumsum(), 'k--')

fig

3번째에 해당 그림을 넣습니다.

_ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))

fig

 

plt.close('all')

이후 plt.close를 통해 모두 닫습니다.

 

fig, axes = plt.subplots(2, 3)
axes


array([[<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>],
       [<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>]], dtype=object)

새로운 figure를 만들고, subplot obj를 반환합니다. (axes)

다른 예시로 보여드리겠습니다.

 

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)

코드 보시면 아마 이해되실 거예요


Colors, Markers, and Line Styles

 

 

plot 할 때, g--는 color = g, linestyle = --와 같습니다.

plt.figure()
from numpy.random import randn
plt.plot(randn(30).cumsum(), 'ko--')

이는 color = k, linestyle = --, marker = o와 같습니다.

data = np.random.randn(30).cumsum()
plt.plot(data, 'k--', label='Default')
plt.plot(data, 'k-', drawstyle='steps-post', label='steps-post')
plt.legend(loc='best')

 

색깔은 검은색, Default는 라인 스타일이 점선, steps-post는 라인 스타일이 직선이네요

또한 drawstyle을 steps-post로 계단 형식을 넣었습니다.

 


Ticks, Labels, and Legends

 

 

 

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())

ticks = ax.set_xticks([0, 250, 500, 750, 1000])
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
                            rotation=30, fontsize='small')
                            
fig

set_xticks는 좌표의 위치를 설정하고, labels를 통하여 이름과 회전과 글씨체를 넣습니다.

ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')

fig

이후 타이틀과 x축에 이름을 넣습니다.


Adding legends

 

 

from numpy.random import randn
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(randn(1000).cumsum(), 'k', label='one')
ax.plot(randn(1000).cumsum(), 'k--', label='two')
ax.plot(randn(1000).cumsum(), 'k.', label='three')

하나의 fig에 다 그려 넣는 모습입니다.

하지만 legend 함수가 없어서 아직 라벨을 붙이지 않았습니다.

ax.legend(loc='best')

fig

이렇게 해야 비로소 라벨이 붙습니다. best를 넣음으로써 알아서 좋은 자리에 넣습니다.


Annotations and Drawing on a Subplot

 

from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure()
# 새로운 figure을 생성함
ax = fig.add_subplot(1, 1, 1)
# 전체 칸을 가로 1칸, 세로 1칸으로 나눈 뒤, ax를 첫 번째 칸에 넣음
data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)
# csv파일을 불러옴, 이떄 0번째 column을 index로 둠, parse_dates를 True로 함으로써 날짜도 가져옴
spx = data['SPX']
# data의 spx 컬럼을 가져옴
spx.plot(ax=ax, style='k-')
# ax칸에 style은 검은색과, solid line style을 넣음
crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Stearns Fails'),
    (datetime(2008, 9, 14), 'Lehman Bankruptcy')
]
for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
    xytext=(date, spx.asof(date) + 225),
    arrowprops=dict(facecolor='black', headwidth=4, width=2,
    headlength=4),
    horizontalalignment='left', verticalalignment='top')
    
    # 주석을 닮, label과 date는 위의 crisis_data임
    # xy, xytest에 date와 좌표를 줌으로써 해당 주석을 위치 시킴
    # 이후 화살표의 특성을 설정함.
    # 색깔은 검은색, 그리고 넓이와 길이를 정함
    # horizontalalignment를 통해 좌표가 텍스트의 왼쪽에 넣고, 좌표가 텍스트 밑에 놓게 했다.
    
# Zoom in on 2007-2010
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 1800])
ax.set_title('Important dates in the 2008-2009 financial crisis')

anootate() 함수는 텍스트와 화살표, 다른 모양들을 표현할 수 있습니다.

fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(1, 1, 1)
rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]],
                   color='g', alpha=0.5)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

세 개의 객체를 만들어서 ax에 추가한 모습입니다.