Matplotlib에서는 figure라는 그림단위를 사용하여, 이 안에서 한개 혹은 여러개의 plot을 그리고 관리하도록 지원을 한다.

이 때, figure안에 들어가는 plot하나를 subplot이라 부른다.

figure에 알아보기 앞서 필요한 패키지들과 매직명령어를 import하자
%matplotlib nbagg
import matplotlib.pyplot as plt
import matplotlib

figure –> subplot 으로 세분화해서 그릴 준비하기

  • pyplot에서 제공하는 .figure()함수를 호출해서, 내부가 텅빈 초기 figure를 만들 수 있다.
    image
  • 이제 생성한 피규어 fig 에 subplot을 추가해야한다. add_subplot( , , )을 호출하여 좌표평면을 나타내는 변수(axes)에 받아줘야한다.
    앞에 2개인자는 fig 내에 몇행x몇렬로 subplot을 가질 것인지 지정한다.
    마지막 인자는, 행렬의 몇번째 성분에 그릴 것인지를 지정하는 것이다. 2x2라면 1,2/3,4 시작위치를 지정할 수 있다.
    ax1 = fig.add_subplot(2,2,1) 라는 명령어를 입력하면, 만들었던 피규어의 2x2 중 1번째 위치에서 빈 좌표평면(ax1)이 그려지는 것을 확인할 수 있다.
    image
    마찬가지로 2, 3번째 위치에서 시작하는 subplot의 좌표평면도 나타내자
    image
    이렇게 인터렉티브하게 조작할 수 있는 것은 매직명령어로 옵션을 줘놨기 때문에 가능하다.


numpy, pandas로 데이터 생성 후  figure의 subplot마다 그려보기

패키지를 먼저 import한다.
import numpy as np
import pandas as pd

  • plt.figure()로 생성한 fig에 .add_subplot()를 통해 생성한 좌표평면 ax1, ax2, ax3가 있다.
    pyplot에서 제공하는 plt.plot()함수의 인자에, 1차원 랜덤데이터 50개의 누적합 데이터를 주고, 좌표평면(ax1, ax2, ax3)을 지정하지 않고 그려보자.
    아래와 같이, 맨 마지막에 위치한 좌표평면(ax3)에 plot이 그려진다.
    만약, 또 좌표평면을 지정하지 않고 그린다면, 그 전인 2번째 좌표평면(ax2)에, 그리고 그다음에는 1번재 좌표평면(ax1)에 그려지게 된다.
    즉, 좌표평면을 지정하지 않고 figure의 subplot에 그림을 그리면, 마지막부터 역순으로 plot이 채워진다.
    * 해당 subplot에 그림을 그릴려면, subplot생성할 때 마다 지정해준 좌표평면을 선택해줘야하구나! (plt.plot() (x)- > ax.plot() )
    image
  • axes를 지정해줘서 plot을 그려주자. 첫번 째로, ax1에다가 히스토그램(x값만 있으면 그려지는) 한번 그려보자.
    ax1.hist( np.random.randn(100), bins = 20) - 랜덤정수100개가 속하는 구간을 20개의 구간으로로 나타낸다.
    아래와 같이 첫번째 좌표평면에 그려지게 된다.(fig-subplot-ax가 없었을 땐,  Series.hist(bins=,normed=) )
    image

  • ax2 좌표평면에다가는 산점도를 그려보자(산점도는 독립변수 2개가 필요함)
    비교하는 독립변수에는 0부터 30전까지 1차원array와 동일한array+3*30개 랜덤수 데이터를 대입하자.
    ax2.scatter(np.arange(30), np.arange(30) + 3*np.random.rand(30))
    (fig-subplot-ax 없었을 땐, plt.scatter(열인덱싱, 열인덱싱) )
    image
    특정axes를 나타내는 변수에 .plot(), .hist(), .scatter( ) 함수를 사용해서 fig > subplot > axes좌표평면에다가 그릴 수 있었다.

figure와 subplot을 좀 더 직관적으로 그리기

pyplot에서 제공하는 plt.subplots (m ,n ) or (m) 을 통해서 fig와 axes를 2개 동시에 반환 받을 수 있다.
fig, axes = plt.subplots(2,3) 를 통해, 2x3 subplot들을 한꺼번에 만들고, fig와 axes도 반환받자.
image

반환받은 axes에는 2x3짜리 array가 들어가 있으며, 각 성분은 그 위치의 axes에 해당한다. ax1, ax2방식이 아니라, 인덱스로 지정해준 다음 .plot()을 통해 해당 위치에 plot을 그릴 수 있다.
image



plot 모양 변형하기

라인플롯의 경우, 색/마킹기호/라인스타일 등을 지정할 수 있다. plt.plot()으로 라인플롯을 그리면서,
인자로 color, marker, linestyle이라는 값을 줘보자.

  • plt.plot(np.random.randn(30), color="g", marker="o", linestyle="—")
    image
  • 인자를 “” 문자열 안에 한번에 줄 수 도 있다.
    plt.plot(np.random.randn(30), "k.-") : 검은색, 점모양, 일반라인
    image

  • 각종 인자color, marker, linestyle값 목록
    image


라인플롯 이외에,  바 플롯, 히스토그램, 산점도 에는 coloralpha값을 지정할 수 있다. 그리고 좌표평면axes도 ax 인자로 지정해주자.
subplots를 생성해서 그리면서 채워보자. alpha는 투명도를 의미한다.
fig, axes = plt.subplots(2,1)
image

  • 먼저, 데이터를 만들자, pd.씨리즈인데, 16개 랜덤수이며, index는 list함수로 문자열 16개를 쪼개서 대입한다.
    data = pd.Series(np.random.randn(16), index = list("abcdefghijklmnop"))
    그리고 이 dataFrame 혹은 Series를 plot으로 그릴 때는,   data.plot( )의 인자에, 플롯의종류kind 이외에 ax=라는 인자를 주어,
    subplot만들 때 반환받은 axes array를 인덱싱해주면된다. ( 걍 바로 그릴 때는 plt.plot(data직접 생성)으로 그렸었음 )
    여기서는 2 x 1 axes가 생성되었으므로, 그것의 첫번째 성분인 axes[0]을 ax=인자에 명시해주자.
    * 2x1행렬에서는,,, axes[0]이 1열이 아니라 1행의 성분이 되는구나… axes[1]은 2번째 열이 아니라 2행의 성분.
    * 만약, 1x2 행렬이라면 , axes[0]은 1열, axes[1]는 2열이 된다.
    *** series 뿐만 아니라,  1x n / n x 1 도 1차원이다!!!!!!! ==> array[n] 열인덱싱이  ~번째 성분만 의미하게 된다.
    이어서 그릴axes뿐만 아니라, color와 alpha인자도 주자(라인플롯은 color, marker, linestyle)
    data.plot(kind="bar", ax=axes[0], color="k", alpha=0.7)
    image
  • 마찬가지로, 수평 바플롯을 그리고 색과 투명도를 주자.
    data.plot(kind="barh", ax=axes[1], color="g", alpha=0.3)
    image
    마찬가지로, 히스토그램이나 산점도도 마찬가지로 입력하면된다.


눈금 및 눈금의 레이블 조작하기

눈금, 레이블, 범례를 조작하기 위해서는 먼저 figure를 만들어야한다.
fig = plt.figure()
만든 fig에 대해서 subplot을 만든다. 간단하게 1x1 서브플롯의 1번째 axes를 지정해주자.
ax3 = fig.add_subplot(1,1,1)
여기에 랜덤한 수 1000개들의 누적합으로, 라인플롯을 하나 그려주자.
ax3.plot(np.random.randn(1000).cumsum())

image

수평축은 0부터 1000까지 나타나있으며, 기본눈금이 200단위로 되어있는 1000개 랜덤수의 누적합을 라인플롯으로 확인할 수 있다.
수학적으로 이러한 결과물을 random walk라고 부른다.
그리고 이렇게 200단위로 나타나는 x축의 눈금 matplotlib에서는  x tick , y축의 눈금을 y tick이라 부른다.

  • x축의 눈금(tick)을 변형하기 위해서는 해당 좌표평면.set_xticks[0, 250, 500, 750, 1000] ) 식으로 인자에 리스트형식으로 넣어준다.
    ax3.set_xticks( [0, 250, 500, 750, 1000] )
    image
  • 이제 x축의 눈금을 –> label(문자열)로 바꿔보자.
    원래 x의 눈금(ticks)가 5개 였으므로, tick의 수와 동일한 갯수로 좌표평면.set_xticklabels( [ "문자열1”, "문자열2” , ,,, , "문자열5” ] 로 바꿔주면된다.
    이 때, 추가적으로 회전도폰트사이즈 등을 줄 수도 있다.
    ax3.set_xticklabels( ["one", "two", "three", "four", "five"],
                         rotation = 20, fontsize = "small")
    image
  • y축 눈금도 마찬가지로 set_yticklabes ()를 이용하면된다.


다음으로, 현재 띄워놓은 axes의 제목을 변경해보자.

  • ax3.set_title("Random Walk Plot")
    image


각각 축의 눈금(tick)의 이름(label)도 넣어줄 수 있다.

  • ax3.set_xlabel("Stages")
    ax3.set_ylabel("Values")
    image



범례 조작하기


하나의 axes(좌표평면)안에 여러개의 plot들이 들어갔을 때는, 범례가 필요하다.  이를 legend라 한다.
먼저 새로운 figure와 subplot-axes를 만든 뒤 , 3개의 plot을 입혀보자.
fig = plt.figure()
ax = fig.add_subplot(1,1  ,1) : 1행1열의 subplot 1번째 좌표평면ax
image

라인플롯을 3개 추가하는데, 인자에 바로 데이터를 만들어서 주고,  color/marker/linestyle
+ 범례에 들어갈 각 lineplot의 제목을 의미하는label 인자를  다르게 주자.
(아까는 하나의 좌표평면을 지정해서,  axes.set_title로 좌표평면의 label을 )

ax.plot(np.random.randn(1000).cumsum(),  'k', label = "one" )
ax.plot(np.random.randn(1000).cumsum(),  'b--', label = "two" )
ax.plot(np.random.randn(1000).cumsum(),  'r.', label = "three" )
.plot()안에 들어가는 label 인자는 범례에서 나타나는 이름이다!
image
label이라는 인자로 입력된 값은, axes상에 범례를 표시할 때, 각 플롯의 이름이 된다.

  • 범례를 표시하려면,  좌표평면.legend()함수를 사용해야하며, 인자로는 loc=”best”를 주면, 최적의 위치에 범폐를 표시한다.
    ax.legend(loc="best")
    image
    loc의 인자에 따라 범례 위치를 조작할 수 있으나 생략한다.


수직, 수평 축의 범위 확인

현재 표시된 좌표평면 ax.에 get_xlim()이라는 함수를 실행하게 되면, x축 눈금의 범위가 표시된다.

image

범위를 변경하고 싶다면 set_xlim()함수를 사용한 뒤, 인자로는 리스트형태로 범위를 시작,끝 을 넣어준다.
ax.set_xlim(  [ 100,900 ])
image
수칙축(y)도 마찬가지다.
ax.set_ylim( [-100,100])
image

다 외울 수 없으니, api나 구글링 하면서 사용하는 것이 좋다.

+ Recent posts