[matplotlib] figure / ax 활용 예제

Pygmalion Dali·2023년 9월 18일
0

matplotlib

목록 보기
1/3

콘다 환경 설치

conda env list

conda create -n (프로젝트 명)

conda activate (프로젝트 명)

아나콘다를 통한 환경설치

맥의 경우 terminal, 윈도우는 cmd를 열어 아래와 같은 명령어를 입력해준다.

conda install -c anaconda numpy

conda install -c anaconda scikit-learn

conda install -c anaconda pandas

conda install -c anaconda matplotlib

파이참에서 가상환경 설치

https://certlys82.tistory.com/entry/파이썬-코딩을-위한-파이참-아나콘다-설치하기맥북m1

이후 import를 통한 라이브러리를 불러오기 위해 이 과정을 거쳐야한다.

matplotlib 활용 ax 생성

import matplotlib.pyplot as plt
import numpy as np

#띄어쓰기에 유의. matplotlib에서 사용하는 '문법'
#fig 선언을 통해 fig라는 figure 생성
fig = plt.figure(figsize=(7, 7), facecolor='linen')

ax = fig.add_subplot()

#선그래프 그리기
ax.plot([2,3,1])
#산점도 그래프 그리기
ax.scatter([2,3,1],[2,3,4])

#그래프의 소제목 - fontsize(크기) / fontfamily(글꼴)을 선택할 수 있음
fig.suptitle("Title of a Figure", fontsize=30, fontfamily='monospace')

plt.show()

fig와 ax를 선언해 subplot생성한다. 산점도 그래프를 그려 삽입한다.

결과는 위와 같다.

set / get을 타이틀 삽입

get(getter): 셋팅된 세터를 가져와주는 역할

figsize = (7,7)
fig, ax = plt.subplots(figsize=figsize)
ax.set_title("Title of a Ax", fontsize=30, fontfamily='monospace')
plt.show()

set_title을 통해 ax의 타이틀을 붙일 수 있다. 뿐만 아니라 fontsize와 fontfamily도 설정해줄 수 있다.

해당 코드를 실행시켰을 때의 결과값. 그래프가 잘 그려진 것을 알 수 있다.

X label & Y label 붙이기

fig, ax = plt.subplots(figsize=figsize)
ax.set_xlabel("X label", fontsize=20)
ax.set_ylabel("Y label", fontsize=20)

이번엔 x와 y축에 대해 label을 선언해보자. x축과 y축에 대한 설명을

figsize는 subplots을 선언해줄 때 기본적으로 선언해주는 값으로, subplot을 작성할 때 인지를 하고 있어야 한다.

오브젝트: data + 기능을 추가한 것이라 생각하면 편하다.

클래스: 새로운 오브젝트 타입으로 만든다

X와 Y축에 labeling 하기

<X label & Y label 붙이기>
figsize = (7, 7)
fig, ax = plt.subplots(figsize=figsize)

fig.suptitle("Title of a Figure", fontsize=30, color='darkblue', alpha=0.9)
ax.set_xlabel("X label", color='darkblue', alpha=0.7)
ax.set_ylabel("Y label", color='darkblue', alpha=0.7)
#tight_layout()
fig.tight_layout()

set_xlabel / ylabel을 통해 컬러값을 정해줄 수 있다. 뿐만 아니라 특정 메소드의 형태를 알아보려면, matplotlib에서 찾으며 인자를 어디에 넣을지 선택할 수 있다.

한 ax에 여러 개의 그래프 그리기

#<ax.twinx>
fig = plt.figure(figsize=(10, 10))

ax1 = fig.add_subplot()
ax2 = ax1.twinx()

#x & y축의 범위 설정
ax1.set_xlim([0, 100])
ax1.set_ylim([0, 100])
ax2.set_ylim([0, 0.01])

#축의 범위 설정
ax1.set_title("Twinx Graph", fontsize=30)
ax1.set_ylabel("Data1", fontsize=30)
ax2.set_ylabel("Data2", fontsize=30)

#figure의 크기가 변치 않는 여백을 만들어줌
fig.tight_layout()

twinx를 통해 x축을 두 개로 만들어줄 수 있다. 뿐만 아니라 xlim이라는 함수를 통해 범위를 지정해주어 그래프의 범위를 설정할 수 있다. 시각화를 하는 과정에서 이 과정은 필수적이기 때문에 인지를 할 필요가 있음.

tick을 통한 그래프 단위 나누기

# tick: 그래프 나누어진 범위 
ax.tick_params(labelsize=20,
               length=10,
               width=3,
               bottom=False, labelbottom=False,
               left=False, labelleft=False,
               top=True, labeltop=True,
               right=True, labelright=True)

그래프의 쪼개진 걸 tick이라 하는데, 이 tick의 파라미터를 수정해 시각적 변형을 일으킬 수 있다.

위와 같이 코드를 입력해 tick의 파라미터를 수정할 수 있으며, 아래처럼 rotation 인자를 입력해 파라미터를 회전할 수 있다.

ax.tick_params(axis='x',
               labelsize=20,
               length=10,
               width=3,
               rotation=30)

ax.tick_params(axis='y',
               labelsize=20,
               length=10,
               width=3,
               rotation=30)

위에 있던 코드를 실행했을 때의 결과물.

그래프에 텍스트 삽입하기

figsize = (7,7)
fig, ax = plt.subplots(figsize=figsize)
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.grid()
ax.tick_parmas(axis='both',labelsize=15)

ax.text(x=0, y=0, s="Hello", fontsize=30)

xlim / ylim을 통해 ax의 범위를 설정할 수 있으며, tick params를 통해 tick을 설정해줄 수도 있다.

다른 좌표에 텍스트를 넣을 순 없을까? 방법이 있다. x/y 좌표를 설정하면 몇 개든 추가할 수 있다. 뿐만 아니라 fontsize와 s을 정해 원하는 내용을 적어 넣을 수도 있다.

텍스트 정렬을 하기 위해서는 어떻게 해야할까?

#텍스트 정렬
ax.text(x=0, y=0,
        va='center', ha='left',
        s='Hello',
        fontsize=30)

ax.text(x=0, y=0,
        va='center', ha='center',
        s='Hello',
        fontsize=30)

ax.text(x=0, y=0,
        va='center', ha='right',
        s='Hello',
        fontsize=30)fig.tight_layout()
plt.show()

정렬을 하기 위해서는 아래의 두 정의와 범위를 알아야 한다. va / ha라는 생소한 축약어지만, 뜻을 살펴보면 이해하기 쉽다.

va(vertical alignment): y축에서의 위치 → center / top / bottom / baseline

ha(horizontal alignment): x축에서의 위치 → center / right / left

텍스트 기준으로 점을 찍어 이를 좌표로 활용한다 생각하면 쉽다.

이렇게 va / ha를 통해 같은 위치에 있더라도 정렬 방식에 따라 달라질 수 있다는 사실을 기억하면 된다.

실습자료

matplotlib 라이브러리 컬러

matplotlib의 경우 tab20을 사용한다

enumerate함수의 사용

#named colors: enumerate함수의 사용
color_list = ['b', 'g', 'r', 'c', 'm', 'y']

fig, ax = plt.subplots(figsize=(5, 10))
ax.set_xlim([-1,1])
ax.set_ylim([-1,len(color_list)])

    #enumerate: 원소와 인덱스 동시에 접근할 수 있는 함수
for c_idx, c in enumerate(color_list):
    ax.text(0, c_idx,
            "color="+c,
            fontsize=20,
            ha='center',
            color=c)

enumerate → 리스트와 인덱스에 동시에 접근할 수 있도록 하는 함수

  • 즉, 리스트를 딕셔너리 개념으로 바꿔준다고 할 수 있다.

c_idx 인덱스의 인자인 'b', 'g', 'r', 'c', 'm', 'y'를 enumerate를 통해 하나씩 호출한다. 때문에

len(color_list)는 6가 될 것이고, (0,0) - (0,5) 사이에 하나씩 해당 인자들이 출력될 것이다.

0개의 댓글