ABOUT ME

-

  • [Library] Matplotlib 베이직 - Plot, Scatter, Hist, Subplots
    Codes & Programming 2021. 5. 28. 14:07

    오늘은 Matplot library에서 기본 바그래프, 히스토그램 등을 연습한 내역을 업데이트 하고자 합니다.

    아래는 주피터 노트북 형태인데, 아직 보기에 예쁘진 않은 것 같네요. 다음 포스팅에는 더 연습해 볼게요.

     

    예제가 모두 익숙한 건 기분 탓이 아니고, 실제로 본적이 있으시기 때문일 겁니다. 공식 문서를 참고하여 만들었습니다.

    이만한 슨생님이 안 계시더라구요 ^0^ /

    https://matplotlib.org/stable/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py

     

     >  깃허브 바로가기

     

    #먼저 라이브러리를 불러오겠습니다.

    In [ ]:

    import seaborn as sns
    import matplotlib.pyplot as plt
    import numpy as np
    

    #데이터셋을 불러와 볼게요. 펭귄데이터는 시본에서 제공하고있는 데이터 셋에 있어요.

    In [ ]:

    df = sns.load_dataset('penguins')
    df
    

    Out[ ]:

      species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
    0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
    1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
    2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
    3 Adelie Torgersen NaN NaN NaN NaN NaN
    4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
    ... ... ... ... ... ... ... ...
    339 Gentoo Biscoe NaN NaN NaN NaN NaN
    340 Gentoo Biscoe 46.8 14.3 215.0 4850.0 Female
    341 Gentoo Biscoe 50.4 15.7 222.0 5750.0 Male
    342 Gentoo Biscoe 45.2 14.8 212.0 5200.0 Female
    343 Gentoo Biscoe 49.9 16.1 213.0 5400.0 Male

    344 rows × 7 columns

    #기본 그래프를 그려보았습니다. Y축에는 레이블도 넣어주었어요. 그래프 위에 설명이 붙어나오는 경우가 있는데 그때는 plt.show(); 로 실행해주심 됩니다.

    In [ ]:

    ax = plt.axes()
    ax.plot([1,2,3,4])
    plt.ylabel('some numbers')
    plt.show()
    

    # 'r--' -- > red컬러로 -- 이 점선그래프로 만들었습니다.

    In [ ]:

    plt.plot([1,2,3,4], [1,4,9,16], 'r--', marker = 'o')
    plt.axis([0,6,0,20])
    plt.show()
    

    #세개의 다른 선 그래프를 그렸습니다.

    In [ ]:

    t = np.arange(0. , 5. , 0.2)
    t
    

    Out[ ]:

    array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
           2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8])

    In [ ]:

    plt.plot(t, t, 'r--')
    plt.plot(t, t**2, 'bs')
    plt.plot(t, 3*t, 'g^')
    plt.show()
    
    or 
    
    plt.plot(t, t, 'r--', t, t**2, 'bs', t, 3*t, 'g^')
    plt.show()
    

    #맨 위에서 불러왔던 데이터에서 숫자 몇 열만 긁어와 스캐터 플랏을 그렸습니다.

    In [ ]:

    df2 = df.iloc[:, 2:5]
    df2
    

    Out[ ]:

      bill_length_mm bill_depth_mm flipper_length_mm
    0 39.1 18.7 181.0
    1 39.5 17.4 186.0
    2 40.3 18.0 195.0
    3 NaN NaN NaN
    4 36.7 19.3 193.0
    ... ... ... ...
    339 NaN NaN NaN
    340 46.8 14.3 215.0
    341 50.4 15.7 222.0
    342 45.2 14.8 212.0
    343 49.9 16.1 213.0

    344 rows × 3 columns

    In [ ]:

    df2['color'] = np.random.randint(0,50,344)
    df2['d'] = np.abs(df2['color']) * 100
    df2
    

    Out[ ]:

      bill_length_mm bill_depth_mm flipper_length_mm color d
    0 39.1 18.7 181.0 18 1800
    1 39.5 17.4 186.0 30 3000
    2 40.3 18.0 195.0 44 4400
    3 NaN NaN NaN 38 3800
    4 36.7 19.3 193.0 46 4600
    ... ... ... ... ... ...
    339 NaN NaN NaN 35 3500
    340 46.8 14.3 215.0 48 4800
    341 50.4 15.7 222.0 24 2400
    342 45.2 14.8 212.0 12 1200
    343 49.9 16.1 213.0 39 3900

    344 rows × 5 columns

    In [ ]:

    plt.scatter('bill_length_mm', 'bill_depth_mm', c = 'color',  data = df2 )
    plt.show()
    

    #서브플랏 지정하여 그래프 그리기

    In [ ]:

    x = ['A', 'B', 'C']
    y = [1,10,100]
    
    plt.figure(figsize =(9,3)) #figsize = 
    plt.subplot(131)
    plt.bar(x,y)
    
    plt.subplot(132)
    plt.scatter(x,y)
    plt.axis()
    
    plt.subplot(133)
    plt.plot(x,y)
    
    plt.show()
    

    #중간에 1

    3 , 4

    6 비어있는 공간을 두기위해 plt.setp을 사용하였습니다.

    In [ ]:

    lines = plt.plot([1,2,3], [1,2,3], [4,5,6], [4,5,6])
    plt.setp(lines, color = 'r', linewidth = 2.0);
    

    #plt.setp(lines)를 치면 설명들이 나오네요.

    In [ ]:

    plt.setp(lines)
    
      agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array
      alpha: float or None
      animated: bool
      antialiased or aa: bool
      clip_box: `.Bbox`
      clip_on: bool
      clip_path: Patch or (Path, Transform) or None
      color or c: color
      contains: callable
      dash_capstyle: {'butt', 'round', 'projecting'}
      dash_joinstyle: {'miter', 'round', 'bevel'}
      dashes: sequence of floats (on/off ink in points) or (None, None)
      data: (2, N) array or two 1D arrays
      drawstyle or ds: {'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post'}, default: 'default'
      figure: `.Figure`
      fillstyle: {'full', 'left', 'right', 'bottom', 'top', 'none'}
      gid: str
      in_layout: bool
      label: object
      linestyle or ls: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}
      linewidth or lw: float
      marker: marker style
      markeredgecolor or mec: color
      markeredgewidth or mew: float
      markerfacecolor or mfc: color
      markerfacecoloralt or mfcalt: color
      markersize or ms: float
      markevery: None or int or (int, int) or slice or List[int] or float or (float, float)
      path_effects: `.AbstractPathEffect`
      picker: float or callable[[Artist, Event], Tuple[bool, dict]]
      pickradius: float
      rasterized: bool or None
      sketch_params: (scale: float, length: float, randomness: float)
      snap: bool or None
      solid_capstyle: {'butt', 'round', 'projecting'}
      solid_joinstyle: {'miter', 'round', 'bevel'}
      transform: `matplotlib.transforms.Transform`
      url: str
      visible: bool
      xdata: 1D array
      ydata: 1D array
      zorder: float
    

    #서브플랏을 그려주고, 그래프별 marker와 linestyle에 변형을 주었습니다.

    In [ ]:

    import matplotlib.pyplot as plt
    
    
    def f (t):
      return np.exp(-t) * np.cos(2*np.pi*t)
    
    t1 = np.arange(0.0, 5.0, 0.1)
    t2 = np.arange(0.0, 5.0, 0.02)
    
    plt.figure()
    plt.subplot(211)
    plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')  #뒤에 애 빼보기
    
    plt.subplot(212)
    plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
    plt.show()
    

    #위와 차이점이 있다면, 위 그래프에서는 당초 axes의 수를 지정하지 않고, 211, 212와 같이 순서대로 선언하고 진행했어요.

    아래 그래프는 애당초 ax2, ax2로 설정후에 진행했습니다.

    In [ ]:

    x1 = np.linspace(0.0, 5.0)
    x2 = np.linspace(0.0, 2.0)
    y1= np.cos(2*np.pi*x1)*np.exp(-x1)
    y2 = np.cos(2*np.pi*x2)
    
    fig, (ax1, ax2) = plt.subplots(2, sharey= True)
    
    ax1.plot(x1,y1,'bo-')
    ax1.set(title = ' 2 polots :)', ylabel = 'Plot 1')
    ax2.plot(x2, y2, 'r.-')
    ax2.set(xlabel = 'Time', ylabel = 'Plot 2')
    
    plt.show()
    

    #figure와 ax의 차이 예시입니다. figure를 여러개 설정해주어 그래프를 그릴수 있고, 한 figure에 여러개 ax를 추가하여 그릴수있습니다. 후자가 matplot이 선호하는 방식인 것으로 저는 이해했습니다.

    In [ ]:

    plt.figure(1)                # the first figure
    plt.subplot(211)             # the first subplot in the first figure
    plt.plot([1, 2, 3])
    plt.subplot(212)             # the second subplot in the first figure
    plt.plot([4, 5, 6])
    
    
    plt.figure(2)                # a second figure
    plt.plot([4, 5, 6])          # creates a subplot() by default
    
    plt.figure(1)                # figure 1 current; subplot(212) still current
    plt.subplot(211)             # make subplot(211) in figure1 current
    plt.title('Easy as 1, 2, 3') # subplot 211 title
    
    plt.show();
    
    /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:12: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
      if sys.path[0] == '':
    

    #히스토그램을 그려보았습니다. 흥미로운 것은 $blabla$ 를 사용하여 적용해주면, 저희가 아는 수학적 기호들을 불러와주네요.

    In [ ]:

    mu, sigma = 100, 15
    x = mu + sigma * np.random.randn(10000)
    
    n, bins, patches = plt.hist(x, 50, density = 1, facecolor = 'g', alpha = .75) #bins 의 갯수 = 50 
    plt.text(60, .025, r'$\mu=100,\ \sigma=15$') #위치 포인트 x,y - 적을 내용 순
    plt.axis([40,160,0,0.03])
    plt.grid(True)
    plt.show()
    

    #annotate를 실행했습니다. plt.annotate(적을 말, 포인트 좌표, 텍스트가 들어갈 좌표, 화살표 속성) 순으로 적어주면 됩니다. 다른 파라미터 ? 를 더 애드할 수 있겠네요.

    In [ ]:

    ax = plt.subplot()
    
    t = np.arange(0.0, 5.0, 0.01)
    s = np.cos(2*np.pi*t)
    line, = plt.plot(t,s, lw = 2)
    
    plt.annotate('local max', xy=(2,1), xytext = (3, 1.5), arrowprops = dict(facecolor  = 'black', shrink  = 0.05))
    
    plt.ylim(-2,2)
    plt.show()
    

    감사합니다 :)

    2021.05.28

    댓글