본문 바로가기
수학

제3장

by 자동매매 2023. 12. 27.

3장 그림 및 예제 코드

# 기본적인 import들
# 이후 그래프 그리는 코드에는 중복으로 적지 않음.
# 다른 곳으로 그래프 그리는 코드를 복사-붙이기 할 때는 
# 이 import 코드와 함께 복사-붙이기 해야함
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits import mplot3d
import matplotlib.font_manager as mfm

# numpy 출력 형식 지정
np.set_printoptions(precision=4, linewidth=150)

# matplotlib 스타일 지정
mpl.style.use('bmh')
mpl.style.use('seaborn-v0_8-whitegrid')
style = plt.style.library['bmh']
# 스타일 컬러를 쉽게 쓸 수 있도록 리스트 저장
style_colors = [ c['color'] for c in style['axes.prop_cycle'] ]

# 그림을 로컬 폴더에 저장하고 싶으면 True로 수정 
file_print = False
# 데이터 파일 사용을 위한 github repo 복사
# !주의! 
# 구글 colab 환경에서 실행하는 경우만 실행하세요.
# 로컬환경에서는 실행하지 마세요.
# !git clone -l -s https://github.com/metamath1/noviceml.git noviceml
# 구글 colab 환경일 경우 그래프에 한글 폰트 사용을 위한 설정
# path = 'noviceml/font/NanumBarunGothic.ttf'
# fontprop = mfm.FontProperties(fname=path, size=18)

# 로컬 환경일 경우 그래프에 한글 폰트 사용을 위한 설정
# https://financedata.github.io/posts/matplotlib-hangul-for-ubuntu-linux.html
# 아래 코드의 주석 제거 후 경로를 유저 컴퓨터의 폰트 파일 경로로 수정하세요.
path = path = r'noviceml\font\NanumBarunGothic.ttf'
fontprop = mfm.FontProperties(fname=path, size=18)

그림 3-1

fig = plt.figure(figsize=(7, 7))
ax = plt.axes(projection='3d')
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax.zaxis.set_tick_params(labelsize=15)
ax.set_xlabel('$x$', fontsize=20)
ax.set_ylabel('$y$', fontsize=20)
ax.set_zlabel('$z$', fontsize=20)

t = np.linspace(0, 2, 101)
x = np.sin(6*t)
y = 1/4 * t
z = t**2 / 2

ax.plot3D(x, y, z, c='k')
ax.plot([x[0]],  [y[0]],  [z[0]],  'o', markersize=10, color='k',
        label="t = {:.2f}".format(t[0]))
ax.plot([x[50]], [y[50]], [z[50]], '^', markersize=10, color='k',
        label="t = {:.2f}".format(t[50]))
ax.plot([x[-1]], [y[-1]], [z[-1]], '*', markersize=10, color='k',
        label="t = {:.2f}".format(t[-1])) 

ax.legend(fontsize=15, loc="upper left")

if file_print == True :
    fig.savefig("imgs/chap3/fig3-1.png", dpi=300, bbox_inches='tight')
    fig.savefig("imgs/chap3/fig3-1.pdf", format='pdf', bbox_inches='tight')

plt.show()

그림 3-3

fig = plt.figure(figsize=(7, 7))

ax = plt.axes(projection="3d")
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax.zaxis.set_tick_params(labelsize=15)
ax.set_xlabel(r"$x_1$", fontsize=20)
ax.set_ylabel(r"$x_2$", fontsize=20)
ax.set_zlabel(r"$z$", fontsize=20)

x1 = np.linspace(-2, 2, 51)
x2 = np.linspace(-1, 3, 51)
X1, X2 = np.meshgrid(x1, x2)
Z = 50*(X2 - X1**2)**2 + (2-X1)**2


ax.scatter3D(X1, X2, Z, marker=".", color="r")

if file_print == True:
    fig.savefig("imgs/chap3/fig3-3.png", dpi=300, bbox_inches="tight")
    fig.savefig("imgs/chap3/fig3-3.pdf", format="pdf", bbox_inches="tight")

plt.show()

그림 3-4

fig = plt.figure(figsize=(7, 7))

x1 = np.linspace(-2, 2, 51)
x2 = np.linspace(-1, 3, 51)
X1, X2 = np.meshgrid(x1, x2)
Z = 50*(X2 - X1**2)**2 + (2-X1)**2

ax = plt.axes(projection='3d')
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax.zaxis.set_tick_params(labelsize=15)

ax.plot_surface(X1, X2, Z, cmap=plt.cm.binary, edgecolor="k")

ax.set_xlabel(r'$x_1$', fontsize=20)
ax.set_ylabel(r'$x_2$', fontsize=20)
ax.set_zlabel(r'$z$', fontsize=20)

if file_print == True :
    fig.savefig("imgs/chap3/fig3-4.png", dpi=300, bbox_inches='tight')
    fig.savefig("imgs/chap3/fig3-4.pdf", format='pdf', bbox_inches='tight')

plt.show()

그림 3-5

그림 3-5에 사용할 등고선 생성

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(1, 1, 1)
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)

x1 = np.linspace(-2, 2, 51)
x2 = np.linspace(-1, 3, 51)
X1, X2 = np.meshgrid(x1, x2)
Z = 50 * (X2 - X1**2) ** 2 + (2 - X1) ** 2

levels = [200, 600]

# 등고선 그리기
contours = ax.contour(X1, X2, Z, levels=levels, cmap="coolwarm")

ax.set_xlabel(r"$x_1$", fontsize=20)
ax.set_ylabel(r"$x_2$", fontsize=20)

# 등고선 라벨 추가
plt.clabel(contours, inline=True, fontsize=8)

plt.show()

paths200 = contours.collections[0].get_paths()
# print(paths[0].vertices)
# print(paths[1].vertices)
plt.plot(paths200[0].vertices[:, 0], paths200[0].vertices[:, 1], "o-")
plt.plot(paths200[1].vertices[:, 0], paths200[1].vertices[:, 1], "o-")
plt.plot(paths200[2].vertices[:, 0], paths200[2].vertices[:, 1], "o-")
plt.show()

paths600 = contours.collections[1].get_paths()
# print(paths[0].vertices)
# print(paths[1].vertices)
plt.plot(paths600[0].vertices[:, 0], paths600[0].vertices[:, 1], "o-")
plt.plot(paths600[1].vertices[:, 0], paths600[1].vertices[:, 1], "o-")

plt.show()

fig = plt.figure(figsize=(7, 7))

x1 = np.linspace(-2, 2, 51)
x2 = np.linspace(-1, 3, 51)
X1, X2 = np.meshgrid(x1, x2)
Z = 50*(X2 - X1**2)**2 + (2-X1)**2

ax = plt.axes(projection='3d')
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax.zaxis.set_tick_params(labelsize=15)

ax.plot_surface(X1, X2, Z, cmap=plt.cm.binary, edgecolor="k")
#ax.plot_wireframe(X1, X2, Z, cmap=plt.cm.OrRd, edgecolor="k")

ax.plot3D(paths200[0].vertices[:,0], paths200[0].vertices[:,1], [200]*paths200[0].vertices.shape[0], 
          lw=2, color='k', linestyle='--')
ax.plot3D(paths200[1].vertices[:,0], paths200[1].vertices[:,1], [200]*paths200[1].vertices.shape[0], 
          lw=2, color='k', linestyle='--')
ax.plot3D(paths200[2].vertices[:,0], paths200[2].vertices[:,1], [200]*paths200[2].vertices.shape[0], 
          lw=2, color='k', linestyle='--')

ax.plot3D(paths600[0].vertices[:,0], paths600[0].vertices[:,1], [600]*paths600[0].vertices.shape[0], 
          lw=2, color='w', linestyle='-')
ax.plot3D(paths600[1].vertices[:,0], paths600[1].vertices[:,1], [600]*paths600[1].vertices.shape[0], 
          lw=2, color='w', linestyle='-')

ax.text(1.5, -1,  400, r"$f(x_1, x_2)=200$", color='k', fontsize=18)
ax.text(1., -1, 800, r"$f(x_1, x_2)=600$", color='k', fontsize=18)

ax.set_xlabel(r'$x_1$', fontsize=20)
ax.set_ylabel(r'$x_2$', fontsize=20)
ax.set_zlabel(r'$z$', fontsize=20)

ax.view_init(50, 80)



if file_print == True :
    fig.savefig("imgs/chap3/fig3-5.png", dpi=300, bbox_inches='tight')
    fig.savefig("imgs/chap3/fig3-5.pdf", format='pdf', bbox_inches='tight')

plt.show()

그림 3-6

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(1, 1, 1)
ax.xaxis.set_tick_params(labelsize=18)
ax.yaxis.set_tick_params(labelsize=18)

x1 = np.linspace(-2, 2, 51)
x2 = np.linspace(-1, 3, 51)
X1, X2 = np.meshgrid(x1, x2)
Z = 50*(X2 - X1**2)**2 + (2-X1)**2

contours = ax.contour(X1, X2, Z, levels=[30, 200, 600],  colors='k', 
            linestyles=['solid','dashed', 'dotted'])

ax.clabel(contours, contours.levels, fmt="%d", inline=True, fontsize=20)

ax.set_xlabel(r'$x_1$', fontsize=25)
ax.set_ylabel(r'$x_2$', fontsize=25)

if file_print == True :
    fig.savefig("imgs/chap3/fig3-6.png", dpi=300, bbox_inches='tight')
    fig.savefig("imgs/chap3/fig3-6.pdf", format='pdf', bbox_inches='tight')

plt.show()

그림 3-7

fig = plt.figure(figsize=(7, 7))
ax = plt.axes(projection='3d')
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax.zaxis.set_tick_params(labelsize=15)
ax.set_xlabel(r'$x$', fontsize=20)
ax.set_ylabel(r'$y$', fontsize=20)
ax.set_zlabel(r'$z$', fontsize=20)

u = np.linspace(0,1,30)
v = np.linspace(0,1,30)
U, V = np.meshgrid(u, v)
X = U
Y = V
Z = (1+U**2) + (V/(1+V**2))

ax.scatter3D(X, Y, Z, marker='.', color='gray')
# ax.plot_surface(X, Y, Z, color='gray')


if file_print == True :
    fig.savefig("imgs/chap3/fig3-7.png", dpi=300, bbox_inches='tight')
    fig.savefig("imgs/chap3/fig3-7.pdf", format='pdf', bbox_inches='tight')

plt.show()

그림 3-13

fig, ax = plt.subplots(2, 2)
fig.set_size_inches((16,13))

plt.subplots_adjust(wspace=0.2, hspace=0.2)
x = np.linspace(-4, 4, 100)
y = x**3 - 15*x + 30
z = np.log(y)

ax[0,0].plot(x,y, label=r'$x^3 -15x + 30$', color='k')
ax[0,0].xaxis.set_tick_params(labelsize=18)
ax[0,0].yaxis.set_tick_params(labelsize=18)
ax[0,0].set_xlabel('$x$', fontsize=25)
ax[0,0].set_ylabel('$y$', fontsize=25)
ax[0,0].legend(fontsize=18)
ax[0,0].grid(False)

ax[0,1].plot(y,z, label=r'$\log(y)$', color='k')
ax[0,1].xaxis.set_tick_params(labelsize=18)
ax[0,1].yaxis.set_tick_params(labelsize=18)
ax[0,1].set_xlabel('$y$', fontsize=25)
ax[0,1].set_ylabel('$z$', fontsize=25)
ax[0,1].legend(fontsize=18)
ax[0,1].grid(False)

ax[1,0].plot(x,z, '--', label=r'$\log(f(x))$', color='k')
ax[1,0].xaxis.set_tick_params(labelsize=18)
ax[1,0].yaxis.set_tick_params(labelsize=18)
ax[1,0].set_xlabel('$x$', fontsize=25)
ax[1,0].set_ylabel('$z$', fontsize=25)
ax[1,0].legend(fontsize=18)
ax[1,0].grid(False)

ax[1,1].plot(x,y, label=r'$x^3 -15x + 30$', color='k')
ax[1,1].xaxis.set_tick_params(labelsize=18)
ax[1,1].yaxis.set_tick_params(labelsize=18)
ax[1,1].set_xlabel('$x$', fontsize=25)
ax[1,1].set_ylabel('$y$', fontsize=25)
ax[1,1].legend(loc='lower left', fontsize=18)
ax[1,1].grid(False)

ax_ = ax[1,1].twinx()
ax_.plot(x,z, '--', label=r'$\log(f(x))$', color='k')
ax_.yaxis.set_tick_params(labelsize=18)
ax_.set_ylabel('$z$', fontsize=25)
ax_.grid(False)
ax_.legend(fontsize=18)

if file_print == True :
    fig.savefig("imgs/chap3/fig3-13.png", dpi=300, bbox_inches='tight')
    fig.savefig("imgs/chap3/fig3-13.pdf", format='pdf', bbox_inches='tight')

plt.show()

'수학' 카테고리의 다른 글

제5장  (0) 2023.12.27
제4장  (0) 2023.12.27
제2장  (0) 2023.12.27
제1장  (1) 2023.12.27
제1장 완성  (0) 2023.12.22

댓글