作者簡介:85後一名分析化學

工作者及科學愛好者,深愛著北京的老北京人,愛好運動,科學,旅行,個人微信公眾號《科學是什麼東東》,歡迎關注!

搭建python-matplotlib繪圖平台的四個要素是什麼:

它們是:python軟體主體;pip庫管理工具;matplotlib繪圖庫;文本編輯器。

在這一專題中,我們將介紹多元函數的3D圖形化和擬合。在理學和工學工作中,或在數學教學中,人們總會遇到多種多樣的函數,其中以X,Y,Z為自(因)變數的多元函數占很大一部分,如何讓函數圖形化呢?我們運用matplotlib就可以實現,以下是幾種多元函數的3D圖形化:

Z=X^2-Y^2

Z=(X-Y)^2

在分析化學中,經常會遇到多元組分對總濃度值的影響,我們可利用matplotlib將其圖形化,從而分析多元組分濃度分布Z=0.5X^2+2Y-1.5(示例)

Z=sin(sqrt(X^2+Y^2))

在數學教學中,使用matplotlib庫,即可以讓孩子直觀認識拋物線Z=X^2,也可以學習編程,一舉兩得

我們需要著手設計程序,可實現的功能為:

允許用戶輸入x,y軸長度值,x和y的次方數(整數),x,y,z軸和主標題的標籤名稱(英文)。

最終效果:生成3D視圖,並分別在xy,xz,yz的平面上生成等高線圖。

在圖形顯示窗口,我們可以通過滑鼠操作改變視角,縮放圖形,也可保存視圖。

主程序代碼如下:

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()

ax=Axes3D(fig)

print("Welcometo use 3D graphic generator, the formula model is z=sqrt(x^n1+y^n2).
")

a1=input("pleaseenter x axis length value(x),actual display range is from - x to x:
")

a1=float(a1)

print("Thex axis actual display range is from - "+str(a1)+" to"+str(a1)+":
")

a2=input("pleaseenter y axis length value(y),actual display range is from - y to y:
")

a2=float(a2)

print("They axis actual display range is from - "+str(a2)+" to"+str(a2)+":
")

a3=input("pleaseenter n power number of x value:(please enter an integer)
")

a3=int(a3)

print("The power number of x value is "+str(a3)+".
")

a4=input("pleaseenter n power number of y value:(please enter an integer)
")

a4=int(a4)

print("Thepower number of y value is "+str(a4)+".
")

X=np.arange(-a1,a1,0.5)

Y=np.arange(-a2,a2,0.5)

X,Y=np.meshgrid(X,Y)

Z=np.sqrt(X**a3+Y**a4)

ax.plot_surface(X,Y,Z,rstride=2,cstride=2,alpha=0.5,cmap=plt.cm.rainbow)

x1=input("pleaseenter x label name:
")

x2=input("pleaseenter y label name:
")

x3=input("pleaseenter z label name:
")

x4=input("pleaseenter title label name:
")

ax.set_xlabel(x1,fontsize=20)

ax.set_ylabel(x2,fontsize=20)

ax.set_zlabel(x3,fontsize=20)

ax.set_title(x4,fontsize=25)

ax.view_init(30,35)

b1=a1+4

b2=a2+4

cset=ax.contour(X,Y, Z, zdir = x, offset = -b1, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = y, offset = -b2, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = z, offset = -7, cmap = plt.cm.hot)

ax.set_xlim(-b1,b1)

ax.set_ylim(-b2,b2)

ax.set_zlim(-8,8)

plt.show()

該程序主要步驟解析為:

1. 分別導入3個庫,以實現基本函數,matplotlib繪圖以及3D做圖功能:(進行三維繪圖時,最後一個庫的導入必不可少,若進行二維繪圖,只導入前兩個庫即可)

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

2.通過輸入設定x,y的坐標範圍,並生成網格,如下:

其中a1,a2分別代表X,Y坐標的選值範圍,0.5代表單個網格的跨度,越小,曲面越平滑

X=np.arange(-a1,a1,0.5)

Y=np.arange(-a2,a2,0.5)

X,Y=np.meshgrid(X,Y)

3.構建Z關於X和Y的方程,示例如下(可做很多變換):

Z=np.sqrt(X**a3+Y**a4)

又例如:

#注釋:X的多次方和Y的多次方之和開根號的正弦值

R=np.sqrt(X**a3+Y**a4)

Z=np.sin(R)

#注釋:X的多次方和Y的多次方之差開根號的餘弦值

R=np.sqrt(X**a3-Y**a4)

Z=np.cos(R)

#注釋:以e為底的(X的多次方和Y的多次方之差開根號)次方

R=np.sqrt(X**a3-Y**a4)

Z=np.exp(R)

註:a3,a4可在程序中進行輸入

#注釋:X平方與Y平方之和

Z=X^2+Y^2

#注釋:多元組分

多元組分濃度分布Z=0.5X^2+2Y-1.5

4.創建關於x,y,z的3D視圖,x,y軸步長均為2,透明度為0.5,彩虹色漸變,如下:

ax.plot_surface(X,Y,Z,rstride=2,cstride=2,alpha=0.5,cmap=plt.cm.rainbow)

5.創建該3D視圖在xy,xz,yz平面的投影圖,並選擇投影的坐標面位置,hot色漸變,如下:

cset=ax.contour(X, Y, Z, zdir = x, offset = -b1, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = y, offset = -b2, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = z, offset = -7, cmap = plt.cm.hot)

6.設定xyz軸的顯示範圍,如下:

ax.set_xlim(-b1,b1)

ax.set_ylim(-b2,b2)

ax.set_zlim(-8,8)

7.最終生成畫圖:

plt.show()

當然,對於函數主體,我們也可以加入重複繪圖的命令:

在導入各種庫的命令之後,加入(這裡不需要首行縮進)

while True:

結尾處加入(注意全部需要首行縮進,break在if語句後進行首行縮進)

keep_testing=input("continuepainting?")

if keep_testing==n:

break

中間的全部命令也要首行縮進

這樣就可以在圖形關閉後,系統會自動提示是否再次畫圖,按n後結束程序

講到這裡,本期的內容就告一段落了,腳本編輯是開放式設計,可以進行很多改造,讓程序段更完善。

本文作者的個人微信公眾號《科學是什麼東東》,歡迎關注!


推薦閱讀:
相关文章