파이썬/파이썬 시각화

2. Matplotlib - 2

2023. 5. 2. 10:35
목차
  1. 축의 범위 설정하기
  2. 틱 설정하기
  3. 틱 라벨 문자열에는 ’$$’ 사이에 수학 문자식을 넣을 수도 있다.
  4. 여러 개의 선 그리기
  5. 복수의 plot()을 하나의 그림에 겹쳐서 그릴 수도 있다.
  6. 범례 = legend
  7. x,y축 label
  8. Figure와 Axes
  9. Figure
  10. Axes
  11. Figure - plt.show()가 그래프를 그리는 방식의 차이
  12. Figure - Figure 객체 얻기
  13. Axes
  14. Axes
  15. Axis

축의 범위 설정하기

  • 범위 경계선에 있어서 잘 보이지 않는 경우가 있을 수 있는데 축범위를 지정하여 해결 가능하다.
plt.title('x축,y축의 범위 설정')
plt.plot([10,20,30,40],[1,4,9,16],
        c = 'b' ,lw = 5, ls = '--', marker = 'o' , ms = 15 , mec = 'g', mew = 5, mfc = 'r')
plt.xlim(0,50)
plt.ylim(-10,30)
plt.show()

틱 설정하기

  • tick은 축상의 위치 표시 지점을 뜻한다.
  • tick label을 설정하여 수동 설정이 가능하다.
import numpy as np
X = np.linspace(-np.pi, np.pi,256)
C = np.cos(X)
plt.title('x축과 y축의 tick label 설정')
plt.plot(X,C)
plt.xticks([-np.pi,-np.pi / 2,0, np.pi/2,np.pi])
plt.yticks([-1,0,+1])
plt.show()

틱 라벨 문자열에는 ’$$’ 사이에 수학 문자식을 넣을 수도 있다.

  • 다양한 mathematical expression이 적용 가능하다.
  • https://matplotlib.org/3.1.1/tutorials/text/mathtext.html
  • 위 링크에서 여러 수학 문자식의 표기방식을 볼 수 있다.
import numpy as np
X = np.linspace(-np.pi, np.pi,256)
C = np.cos(X)
plt.title('TeX, 문자열로 tick label 정의')
plt.plot(X,C)
plt.xticks([-np.pi,-np.pi / 2, 0, np.pi/2, np.pi],
          [r'$-\\pi$',r'$-\\pi/2$',r'$0$',r'$+\\pi/2$',r'$+\\pi$']) 
plt.yticks([-1,0,+1],['Low','Zero','High'])
plt.show()

여러 개의 선 그리기

  • x데이터, y데이터, 스타일 문자열을 반복하여 인수로 넘긴다.
  • 이 경우에는 하나의 선을 그릴 때 처럼 x데이터나 스타일 문자열을 생략할 수 없다.
t = np.arange(0.,5.,0.2)
plt.title('라인 플롯에서 여러개의 선 그리기')
plt.plot(t,t,'r--',t,0.5*t**2,'bs:', t,0.2*t**3,'g^-') # x,y,style을 3번 반복해서 3개의 선을 그린것.
plt.show()

복수의 plot()을 하나의 그림에 겹쳐서 그릴 수도 있다.

  • function에 인수를 전달할 때 unpacking해서 가능하다.
plt.title("복수의 plot 명령을 한 그림에서 표현")
style1 = {'c' : "b", 'lw':5, 'ls':"--", 'marker':"o", 'ms':15, 'mec':"g", 'mew':5,'mfc':"r"}
style2 = {'c':"k", 'lw':3, 'ls':":", 'marker':"s", 'ms':10, 'mec':"m", 'mew':5, 'mfc':"c"}
plt.plot([1, 4, 9, 16],**style1)
# plt.hold(True)   # <- 1,5 버전에서는 이 코드가 필요하다.
plt.plot([9, 16, 4, 1], **style2)
# plt.hold(False)  # <- 1,5 버전에서는 이 코드가 필요하다.
plt.show()

범례 = legend

  • 플롯을 동시에 그리는 경우 각 선이 무슨 자료를 표시하는지 보여주기 위해 추가할 수 있다.
  • 범례의 위치는 자동으로 정해지지만 수동으로 설정하고 싶으면 loc 키워드 인수를 사용한다.(숫자마다 위치가 정해져 있다.)
  • plot 마다 label 키워드 인수를 통해 legent label을 설정하고 구분한다.
  • 아래 그림의 숫자에 따라 범례 위치가 달라진다.

X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)
plt.title("legend를 표시한 플롯")
plt.plot(X, C, ls="--", label="cosine")
plt.plot(X, S, ls=":", label="sine")
plt.legend(loc=2) # upper left에 범례를 지정함.
plt.show()

x,y축 label

  • x축과 y축에 그 데이터가 의미하는 바를 표시하기 위해 라벨을 추가해 준다.
X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)
plt.plot(X, C, label="cosine")
plt.xlabel("time")       #x축 추가
plt.ylabel("amplitude")  #y축 추가
plt.title("Cosine Plot")
plt.show()
#연습문제1
plt.title('섭씨 온도와 화씨 온도')
plt.xlabel('화씨 온도')
plt.ylabel('섭씨 온도')
X = np.arange(32,100)
Y = (X-32)*5/9
plt.plot(X,Y,'r-.')
plt.show()

Figure와 Axes

Figure

  • data를 Figure(ex windows, jupyter widgets, etc)에 x-y 좌표의 그래프로 표시한다. 각각의 Figure는 최소 하나 이상의 Axes를 갖는다.
  • Figure는 표의 전체 영역을 의미하는 객체이다.
  • Figure 객체는 Axes, 특수 Artit 그룹(title, figure legends, colorbar, etc), 중첩된 subfigures까지 포함한다.

Axes

  • Axes는 Figure를 나누어서 각각 분할하여 표를 그릴 수 있는 Figure의 하위 개념이다.
  • pyplot.subplots()를 사용하여 Figure와 Axes객체를 만들 수 있다.
  • Axes.plot()을 활용하여 Axes에 데이터를 그린다.
fig = plt.figure() # Axes영역이 없는 empty figure 만드는 경우.
fig, ax = plt.subplots()  # figure 하나와 그 안에 하나의 Axes가 있는 경우. default로 1들어감.
fig,axs = plt.subplots(2,2) # figure안에 2 X 2 격자형 Axes 4개가 만들어진 경우.

fig, ax = plt.subplots()
ax.plot([1,2,3,4],[1,4,2,3])

figure()만 사용해서 Figure 객체를 얻는 게 처음 설계였으나

plot() 명령만 실행해도 자동으로 Figure 객체를 생성해 주기 때문에 figure() 함수를 잘 사용하지 않는다.

다만 figure()는 여러 개의 windows를 동시에 띄우거나(주피터는 해당 x), 그림의 크기를 설정하고 싶을 때 사용한다.

np.random.seed(0)
f1 = plt.figure(figsize=(10, 2))
plt.title("figure size : (10, 2)")
plt.plot(np.random.randn(100))
plt.show()

Figure - plt.show()가 그래프를 그리는 방식의 차이

  • 주피터 랩에서 show() 메서드를 통해 그래프를 그려보면 별도의 window 객체를 생성하지 않고 jupyter widget으로 결과를 보여준다.(그냥 다 한 화면에 보여주는 방식)
  • 반면 파이썬을 독립 실행하는. py 같은 경우에는 하나의 Figure당 하나의 window를 별도로 가지며, Figure windows에 대한 확대 및 축소 기능을 지원한다.

Figure - Figure 객체 얻기

  • plt.gcf()
  • 현재 사용하고 있는 Figure 객체를 얻으려면(변수에 할당) gcf() 메서드를 사용한다.
f1 = plt.figure(1)
plt.title("현재의 Figure 객체")
plt.plot([1, 2, 3, 4], 'ro:')

f2 = plt.gcf()
print(f1, id(f1))
print(f2, id(f2))
plt.show()

Axes

  • Figure 객체 안에 여러 개의 플롯을 grid 형태로 보여야 하는 경우도 있다.
  • Figure 안에 있는 각각의 플롯은 Axes라고 불리는 객체에 속한다.
  • 원래는 subplot()을 사용하여 명시적으로 Axes 객체를 얻어야 하나 plot()을 바로 사용해도 자동으로 Figure, Axes 객체를 생성해 준다.
# subplot 명령은 세개의 인수를 가지는데 처음 두개의 원소가 전체 그리드 행렬의 모양을 지시하는 두 숫자이고, 
# 세번째 인수가 네 개 중 어느것인지(몇번쨰인지 따지는)를 의미하는 숫자가 된다.
ax1 = plt.subplot(2,1,1)
#여기에서 윗부분에 그릴 플롯 명령 실행
ax2 = plt.subplot(2,1,2)

  • 숫자 인덱싱은 파이썬이 아닌 Matlab 관행을 따르기 때문에 첫 번째 플롯을 가리키는 숫자가 0이 아니라 1 임에 주의할 것.
  • tight_layout() 명령을 실행하면 플롯 간의 간격을 자동으로 맞춰준다.
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)

ax1 = plt.subplot(2, 1, 1)
plt.plot(x1, y1, 'yo-')
plt.title('A tale of 2 subplots')
plt.ylabel('Damped oscillation')

ax2 = plt.subplot(2, 1, 2)
plt.plot(x2, y2, 'r.-')
plt.xlabel('time (s)')
plt.ylabel('Undamped')

plt.tight_layout()
plt.show()

np.random.seed(0)

plt.subplot(221)  # 2 x 2 형태의 네 개의 플롯이라면 다음과 같이 그릴 수 있다.
plt.plot(np.random.rand(5))
plt.title("axes 1")

plt.subplot(222)
plt.plot(np.random.rand(5))
plt.title("axes 2")

plt.subplot(223)
plt.plot(np.random.rand(5))
plt.title("axes 3")

plt.subplot(224)
plt.plot(np.random.rand(5))
plt.title("axes 4")

plt.tight_layout()
plt.show()

fig, axes = plt.subplots(2, 2) # 인수 두개 전달 했을 때 2X2로 만들라는 소리임.

np.random.seed(0)
axes[0, 0].plot(np.random.rand(5)) # 그러면 subplot 여러번 쓸 필요 없이 Axes가 shape 모양으로 각각 접근이 가능하다. 
axes[0, 0].set_title("axes 1")
axes[0, 1].plot(np.random.rand(5))
axes[0, 1].set_title("axes 2")
axes[1, 0].plot(np.random.rand(5))
axes[1, 0].set_title("axes 3")
axes[1, 1].plot(np.random.rand(5))
axes[1, 1].set_title("axes 4")

plt.tight_layout()
plt.show()

Axes

  • Axes는 데이터 플로팅을 위한 영역으로 Figure에 포함되는 Artist이다.
  • Axes와 Axis를 헷갈리지 않게 잘 구분해야 함

Axis

  • 하나의 Axes 객체는 두 개 이상의 Axis(축) 객체를 가집니다.(가로축, 세로축)
  • Axis 객체는 ticks와 ticklable에 대한 규모와 제한을 설정한다.
  • 여러 가지 플롯을 하나의 Axes 객체에 표시할 때 y값의 크기가 달라서 표시 가히 힘들 수 있다.
  • 이때 twinx 명령으로 복수의 y축을 가진 플롯을 만들 수도 있다. 얘는 x축을 공유하는 새로운 Axes객체를 만들어준다.
fig, ax0 = plt.subplots()
ax1 = ax0.twinx()
ax0.set_title("2개의 y축 한 figure에서 사용하기")
ax0.plot([10, 5, 2, 9, 7], 'r-', label="y0")
ax0.set_ylabel("y0")
ax0.grid(False)

ax1.plot([100, 200, 220, 180, 120], 'g:', label="y1")
ax1.set_ylabel("y1")
ax1.grid(False)

ax0.set_xlabel("공유되는 x축")
plt.show()

'파이썬 > 파이썬 시각화' 카테고리의 다른 글

6. Seaborn - 3  (0) 2023.05.02
5. Seaborn - 2  (0) 2023.05.02
4. Seaborn - 1  (0) 2023.05.02
3. Matplotlib - 3  (0) 2023.05.02
1. Matplotlib - 1  (0) 2023.05.02
  1. 축의 범위 설정하기
  2. 틱 설정하기
  3. 틱 라벨 문자열에는 ’$$’ 사이에 수학 문자식을 넣을 수도 있다.
  4. 여러 개의 선 그리기
  5. 복수의 plot()을 하나의 그림에 겹쳐서 그릴 수도 있다.
  6. 범례 = legend
  7. x,y축 label
  8. Figure와 Axes
  9. Figure
  10. Axes
  11. Figure - plt.show()가 그래프를 그리는 방식의 차이
  12. Figure - Figure 객체 얻기
  13. Axes
  14. Axes
  15. Axis
'파이썬/파이썬 시각화' 카테고리의 다른 글
  • 5. Seaborn - 2
  • 4. Seaborn - 1
  • 3. Matplotlib - 3
  • 1. Matplotlib - 1
잘잔디
잘잔디
4학년이 되고 취업 준비를 위해 2023-01-01부터 공부한 내용을 정리한 블로그입니다.
잘잔디
MBCS 공부일지
잘잔디
전체
오늘
어제
  • 분류 전체보기 (217)
    • 파이썬 (28)
      • 파이썬 이론 (8)
      • NumPy (3)
      • Pandas (6)
      • 파이썬 시각화 (8)
      • 응용 (2)
    • Java (3)
    • Back (38)
      • DataBase이론 (12)
      • MySQL (2)
      • JSP (8)
      • JSTL (2)
      • Spring (0)
      • Django (8)
      • MongoDB (6)
      • FastAPI (0)
    • Front (8)
      • HTML (3)
      • CSS (2)
      • JS (1)
    • 회고록 (10)
    • 알고리즘 문제 풀이 (95)
      • 알고리즘 이론 공부 (14)
      • 프로그래머스 (69)
      • 백준 (12)
    • 머신러닝 (0)
    • 딥러닝 (0)
    • Git (3)
    • R 프로그래밍 (3)
    • 빅데이터 관리 (16)
      • 리눅스 (4)
      • Hadoop (12)
    • AWS (2)
    • 일상 (10)
      • 책 리뷰 (5)
      • TOEIC (2)
      • 자잘하게 공부한 것들 (2)
    • 사이버보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • playdata
  • 골드
  • CSS
  • 독산역
  • Encore
  • backend
  • git
  • OOP
  • 객체지향
  • db
  • web
  • 백준
  • HTML
  • JS
  • Java
  • 이중우선순위 큐
  • JavaScript
  • Database
  • 즐거웠다

최근 댓글

최근 글

hELLO · Designed By 정상우.
잘잔디
2. Matplotlib - 2
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.