ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] matplotlib 관련 정보 기록
    Programming (Others)/Language·Library 2021. 5. 22. 04:13

    서론

    더보기

    C나 C++은 안그랬던 것 같은데.. Java는 은근슬쩍 빠짐

    1학년때 위의 세 언어만 열심히 판 까닭일까, 학교 커리에 없던 python은 위의 언어처럼 각잡고 열심히 했다기보다는,

    간단한 무료 인강을 (2배속으로 팔짱 끼고(..)) 들으며 기초 문법을 익히고, 그 뒤 python을 기초로 하는 수많은 수업과 프로젝트를 진행하며 대강 익힌 게 전부였다.

    또한 부가적인 관리(복사생성자, 동적 할당 관리 등)는 필요하나 제공하는 기능 자체는 단순한 C, C++에 비해

    python은 관리해야 할 게 적지만, 제공되는 기능 자체가 너무 많고 복잡하다..ㅠ_ㅠ

    그래서.... 열심히 구글링+복붙(or 수업시간에 교수님/조교님 실습 코드 개조..)해서 과제물을 만들고 제출하지만.... 돌아서면 까먹는...... 불상사가 항상 일어난다.

     

    특히 정말 numpy와 matplotlib, pandas..... 요 세 개는 python에서 정말정말정말 많이 쓰이는데 빈 에디터 주고 구현해보라고 하면 못한다...^^

    그러므로 이제부턴 제대로 각잡고 공부를 해보기로 했다.

     

     

    본론

    여기는, python의 라이브러리 중 하나인 matplotlib 에서 제공하는 함수의 종류와 사용법(파라미터, 리턴값 등)을 기록할 것이다.

    공부를 하며 새로 알아가는 즉시 여기다가 기록할 것이다. 언젠가 까먹었을 때 볼 수 있도록...!

     

     

    0. Pyplot이란?

    파이썬에서 간단한 점, 직선 그래프를 그릴 수 있게 하는 라이브러리이다.

    2차 이상의 함수나, 초월함수도 numpy의 linspace를 활용하면 그릴 수 있긴 하다. (사실상 직선을 여러 개 이어붙인거긴 하지만..)

    이와 관련된 코드는 이 링크를 참조

     

     

    1. 기본적인 그래프 그리는 코드의 틀

    plt.plot(x, y)	# 직선
    plt.scatter(x, y)	# 점
    plt.hlines(y)	# 수평선
    plt.vlines(x)	# 수직선
    
    # 부가 함수 (label, 범례 등)
    
    plt.show()	# 그래프 보이기

    이 때, plot나 scatter의 파라미터로 데이터 이외에 여러 인자를 넣어줄 수 있다.

    밑은 그 예시.

    plt.plot(x, y, 'bo')	# 세 번째 인자 : format string. (color+)marker 조합.
    # 예시에서는 파란색 circle 마커 추가
    plt.scatter(y_train_pred, y_train_pred - y_train, c = 'gray', marker = 'o', label = 'Train Data')
    # 회색, 동그란 형태. 'Train data'라는 라벨 추가
    plt.hlines(y=0, xmin=-10, xmax=10)

    또한 x와 y 데이터의 타입은 아무거나 상관없다고 한다. (numpy든, pandas든...)

    marker의 종류와 그에 해당하는 format string에 대한 정보는 이 링크 참조.

     

    그리고 저렇게 x와 y의 형태로 파라미터를 입력하지 않고 아래처럼 라벨이 있는 데이터를 불러온 뒤 x와 y 자리에 label 이름을 넣어줘도 된다.

    plot('xlabel', 'ylabel', data=obj)

     

    plot함수scatter함수에 대한 자세한 설명은 해당 api참고 (링크에 걸어두었다.)

     

     

    2. 부가적인 기능 넣기 (label, 범례 등)

    1.의 코드에서 #부가 함수 주석 위치에 넣는다.

     

    가. 라벨 넣기

    plt.xlabel('x축 라벨 이름')	# X축 라벨 추가
    plt.ylabel('y축 라벨 이름')	# Y축 라벨 추가

     

    나. 범례 넣기

    plt.legend(loc = 'upper left')	# loc : 범례 위치, 'best'로 할 경우 최적의 위치로 지정됨

     

     

    다. 축의 범위 정하기

    plt.xlim([0, 50])	# x축
    plt.ylim([0, 50])	# y축

     

    라. 축의 눈금 값 지정

    # 눈금 설정
    plt.xticks([0, 1, 2, 3])	# x축
    plt.yticks(np.arange(0, 101, 10))	# y축
    plt.yticks(0:25:100)
    
    # 눈금에 label 지정
    yticklabels({'y = 0','y = 50','y = 100'})
    
    # 눈금 디폴트 값으로 초기화
    yticks('auto')

    x/yticks() 안에 들어갈 파라미터는 벡터 값이다. 지정한 눈금의 값이 그래프에 표시된다.

     

    마. 그래프 제목 지정

    plt.title('그래프 제목')

     

    사. 그리드 추가

    plt.grid()

     

    3. 한 번에 여러 그래프 띄우기 (subplot)

    가. 그래프의 구조

    우선 이 기능을 배우기 전에, plt.show()를 하면 등장하는 그래프 객체의 구조에 대해 자세히 알 필요가 있다. (이에 관한 내용을 익히는 데에 이 글이 많이 도움이 되었다.)

    pyplot으로 그래프를 그리려면 figure 객체가 반드시 필요하고, Figure 객체 안에는 하나 이상의 Axes 객체가 있어야 한다고 한다. (방금 참조한 링크를 타고 들어가면 이해하기 쉽게 그림도 나와 있다! 설명도 나보다 더 친절하고 자세하니 한번 읽어보는 것을 츄천한다!)

    그리고 그 Axes 객체는 또 두 개의 Axis 객체로 이루어져 있다. 이것이 바로 x축과 y축.

    그러면 여러 그래프를 띄우려면? Figure 객체 안에 여러 개의 Axes 객체를 만들어야 한다.

     

    나. Figure 객체 생성하고 Axes 객체 추가하기

    예시는 창을 2x1 그리드로 나눈 뒤 axes 객체를 생성하는 코드

    fig = plt.figure()
    # fig = plt.figure(figsize=[x,y])	# 인자로 크기를 지정해줄 수 있다.
    
    ax1 = fig.add_subplot(211)	# (행, 열, x번째 플롯)
    ax2 = fig.add_subplot(212)	# (2, 1, 2) 도 가능
    
    plt.show()	# 생성된 모든 figure를 출력

    이 때 subplot 창은 겹쳐도 되는 것 같다(..) 즉, 코드를 예시로 들면 이렇다.

    ax1 = fig.add_subplot(111)
    ax2 = fig.add_subplot(212)

    1x1 그리드로 나누어 하나의 subplot (사실상 칸을 나누지 않은 거나 마찬가지)을 추가하고, 그 다음 2x1 그리드로 나누어 2번째 칸에 subplot을 추가했다.

    그랬더니 이런 결과물이 나왔다. 그래프가 겹치는 것을 알 수 있다.

     

    다. 각 axes에 그래프 그리기

    1에서 소개한 것과 똑같이 그리면 된다. 이 때 1에는 plt.(함수) 형태로 그렸다면, 이번에는 다음과 같이

    ax1.plot(x, y)
    ax2.plot(x, y)

    각 axes 객체의 이름에다 함수를 붙여 코드를 작성한다.

     

    여기서 "아까전에 그래프를 그릴때는 무조건 figure와 axes 객체가 필요하다고 했지 않은가, 그런데 아까 1에선 어떻게 그렸지?" 하는 의문이  들 것이다.

    이에 대한 해답은 아까 전에 걸었던 글에 굉장히 잘 나와있다. (꼭꼭 참고해보라고 다시 링크를 건다.)

    즉 요약하면, figure와 axes 객체가 생성되어있지 않은 경우 자동으로 생성을 하고, 이미 존재하는 경우 가장 최근에 생성된 figure객체를 찾아 그래프를 그린다고 한다. 그렇기 때문에 plt.(함수)를 써서 그래프를 그려 주었어도 자동으로 figure()와 add_subplot() 함수가 기능을 한 것이다.

     

    그리고 부가적인 기능을 넣는 코드는 다음과 같다. (하나의 그래프를 그릴 때와 동일한 것도 있고 다른 것도 있다.)

    # 라벨 추가
    ax1.set_xlabel('X축 라벨 이름')
    ax1.set_ylabel('Y축 라벨 이름')
    
    # 범례 추가
    ax1.legend(loc='위치')

     

     

    라. figure와 axes 객체 생성하지 않고 subplot 그리기

    예전에 했던 과제들을 살펴보다가 예전의 내가 위의 함수들을 사용하지 않고 그냥 subplot()함수를 이용해서 짠 코드가 있길래 가져왔다.

    (내가 짰었던 코드의 일부. subplot 함수의 사용 맥락을 명확하게 하기 위해 for문 전체를 긁어왔다.)

    for col1 in list(df.columns)[1:-1]:
        for col2 in list(df.columns)[i+1:-1]:
            plt.subplot(3, 5, idx)
            plt.xlabel(col1, fontsize=10)
            plt.ylabel(col2, fontsize=10)
            plt.scatter(df[col1].tolist(), df[col2].tolist(), s=10)
            idx += 1
        i += 1

     

     

    틀린 지식이 있을 경우 알려주세요...

    새로운 것을 알게 되는 대로 계속 추가해 나갈 예정입니다.

    댓글

Life is hard, so am I