축의 범위 설정하기
- 범위 경계선에 있어서 잘 보이지 않는 경우가 있을 수 있는데 축범위를 지정하여 해결 가능하다.
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 |