
matplotlib
Python의 데이터 (DataFrame, Series)를 차트(Chart) 혹은 플롯(Plot)으로 시각화하는 모듈입니다.
다음과 같은 플롯 및 차트를 제공합니다.
- 라인 플롯 (Line Plot)
- 스캐터 플롯 (Scatter Plot)
- 컨투어 플롯 (Contour Plot)
- 서피스 플롯 (Surface Plot)
- 바 차트 (Bar Chart)
- 히스토그램 (Histogram)
- 박스 플롯 (Box Plot)
먼저 아래와 같이 matplotlib 모듈을 임포트합니다.
import matplotlib.pyplot as plt라인 플롯 (Line Plot)
가장 간단한 플롯으로, 선을 그리는 라인 플롯입니다.
데이터가 시간, 순서 등에 따라 어떻게 변화하는지 보여주기 위한 용도입니다.
먼저 보여줄 데이터를 ndarray로 만듭니다.
arr = np.array([10, 30, 14, 20])plot() 함수를 이용해 그래프를 그립니다. ndarray의 Index는 x축으로, ndarray의 각 값은 y축으로 그립니다.
plt.plot(arr)
그리고, 보여줄 데이터가 2차원 데이터일 때를 살펴봅시다.
arr = np.array([[10, 30, 14, 20], [20, 50, 33, 10], [30, 20, 5, 0]])똑같은 방식으로 plot() 이용해서 그립니다.
첫번째 [0][0] 데이터 4개가 그래프의 시작이며, [1][0] 데이터 4개가 그 다음, [2][0] 데이터 4개가 마지막입니다.
x축은 ndarray의 Index로 동일하며, 각 구간별 데이터를 연결해서 다른 색상으로 그래프를 그립니다.
plt.plot(arr)
여기서 추가적으로, x축과 y축을 각각 지정해줄 수 있습니다.
x = np.arange(0, 1, 0.01)
y = x ** 2plot() 함수에 x, y parameter로 각각 ndarray를 건네줍니다.
plt.plot(x, y)
이번엔 Series로 Line Plot을 그려보겠습니다.
s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
Series는 Index가 x축이고, Value가 y축이 됩니다.
plt.plot(s)
또한, Pandas 객체는 자체적으로 matplotlib 기반의 시각화 메소드도 제공합니다.
s.plot()
여기서 x축의 Index를 Series의 Index처럼 10, 20, 30, 40, ... 처럼 표시하고 싶다면, xticks()를 이용합니다.
plt.xticks(s.index)
plt.show()
심지어, DataFrame도 가능합니다. 아래와 같은 DataFrame을 만들어봅시다.
df = pd.DataFrame(
np.random.randn(10, 4).cumsum(axis=0),
columns=["A", "B", "C", "D"],
index=np.arange(0, 100, 10)
)
DataFrame도 pandas 객체이므로, plot() 함수를 사용합니다.
컬럼인 A, B, C, D를 기준으로 각 그래프를 그리고, x축을 Index, y축을 Value로 인식합니다.
컬럼을 기준으로 한 범례도 보여줍니다.
df.plot()
만약 특정 컬럼에 대한 것만 라인 플롯을 그리고 싶다면 리스트 인덱싱을 통해 접근하고, plot()을 사용하면 됩니다.
df[['B', 'C']].plot()
바 플롯 (Bar Plot)
바 플롯은 막대 그래프를 의미합니다.
테스트를 위해 Series 자료구조를 하나 만들어보겠습니다.
s2 = pd.Series(np.random.rand(16), index=list("abcdefghijklmnop"))
bar 형태로 그래프를 그리기 위해 parameter로 kind='bar'를 추가합니다.
s2.plot(kind='bar')
눕혀진 bar 형태로 그래프를 그리기 위해 parameter로 kind='barh'를 추가합니다.
s2.plot(kind='barh')
2차원 DataFrame을 만들어 바 플롯으로 만들어보겠습니다.
df2 = pd.DataFrame(
np.random.rand(6, 4),
index=['one', 'two', 'three', 'four', 'five', 'six'],
columns=pd.Index(["A", "B", "C", "D"], name="Genus")
)
이 DataFrame을 plot()을 통해 바 플롯을 그리면, 인덱스별로 4개의 컬럼의 값이 나옵니다.
df2.plot(kind='bar')
여기서 stacked=True 옵션을 넣으면 하나의 막대 그래프로 합쳐줍니다.
df2.plot(kind='bar', stacked=True)
히스토그램 (Histogram)
도수분포표의 하나로써, 수량에 관한 것이므로 Index가 필요없습니다.
그래서, Index가 zero-based인 Series를 만들어보겠습니다.
s3 = pd.Series(np.random.normal(0, 1, size=200))
히스토그램 그릴 때는 가로축이 값이고, 세로축이 분포 (수량 및 개수)입니다.
구간을 10개 정도로 나누고, 각 구간별로 몇개씩 있는지 분포를 나타냅니다.
현재 Series를 정규분포로 랜덤값을 돌렸으므로, 대부분 종 모양으로 histogram이 구성됩니다.
s3.hist()
이제 구간을 따로 설정해봅시다. bins parameter를 통해 설정하며 기본값은 10입니다.
구간을 20등분해보겠습니다.
s3.hist(bins=20)
스캐터 플롯 (Scatterplot)
산점도를 의미하며, 두 개의 독립변수에 대해 두 변수가 어떤 관계가 있는지 살펴보기 위해 사용됩니다.
랜덤값으로 2개의 1차원 배열을 만들어보겠습니다.
np.random.seed(42)
x1 = np.random.normal(1, 1, size=(100, 1))
x2 = np.random.normal(-2, 4, size=(100, 1))이것을 scatterplot으로 그립니다. x1이 x축이고, x2가 y축입니다.
결론적으로, 산점도가 이렇게 퍼져서 있는 관계면 별로 관계가 없다고 말합니다.
plt.scatter(x1, x2)
Figure, Subplot
Matplotlib은 그림을 그릴 때 Figure와 Subplot 객체를 이용해 화면에 시각화를 합니다.
figure는 전체 그림(도화지)이며, subplot은 그림 안의 공간입니다.
수동으로 figure 객체를 생성해보겠습니다.
fig = plt.figure() # <Figure size 640x480 with 0 Axes>그러면, figure 도화지에다가 그림 공간을 추가해보겠습니다. 가로 x 세로 = 2행 x 2열 짜리 그림 공간을 만듭니다.
그리고 첫번째 공간을 사용하기 위해 그 그림 공간을 리턴받습니다. 그러면 Axes 객체(subplot)가 리턴됩니다.
ax1 = fig.add_subplot(2, 2, 1) # <Axes: >axes를 하나 더 생성하겠습니다.
ax4 = fig.add_subplot(2, 2, 4)이렇게 되면 figure 도화지를 출력하면, 1번과 4번 공간에 빈 그래프가 생깁니다.

오늘날에는 add_subplot()보다는 plt.subplots(row, col)을 추천합니다.
이것은 (Figure 객체, Axes 객체 튜플) 튜플을 리턴합니다.
fig, (ax1, ax2, ax3) = plt.subplots(1, 3) # 1 x 3 그림 공간
그림 공간이 행, 열이 2차원 행렬일 경우, Axes 객체 튜플은 2차원 튜플을 리턴받습니다.
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
그러면, ax 객체를 가지고 직접 그림을 그릴 수 있습니다.
ax1.set_title('1st graph')
ax4.set_title('4th graph')
plt 꾸미기 옵션
먼저 그래프 색상의 경우, 8가지 옵션을 제공합니다.
- b : blue
- g: green
- r: red
- c: cyan
- m: magenta
- y: yellow
- k: black
- w: white
직접 초록색 그래프 색상으로 바꿔보겠습니다.
plt.plot(np.random.randn(50), color='g')
다음은 값 마킹 디자인입니다.
- . : point
- , : pixel
- o : circle
- v : triangle_down
- ^ : triangle_up
- < : triangle_left
- > : triangle_right
- 8 : octagon
여기서는 동그라미 마커로 적용해보겠습니다.
plt.plot(np.random.randn(50), color='g', marker='o')
다음은 라인 스타일 옵션 입니다.
- - : solid line
- -- : dashed line
- -. : dash-dotted line
- : : dotted line
- None : draw Nothing
여기서는 점선 라인으로 적용해보겠습니다.
plt.plot(np.random.randn(50), color='g', marker='o', linestyle='--')