第一關 繪制三維圖?
任務描述
本關任務:使用matplotlib
繪制三維圖。
相關知識
educoder行與縮進闖關答案,matplotlib
原本只能畫二維圖,隨著版本更新matplotlib
實現了一些建立在二維圖上的三維圖。
matplotlib畫三維圖
要畫三維圖需要先導入from mpl_toolkits import mplot3d
。導入這個子模塊后,就可以在創建任意一個普通坐標軸的過程中添加projection='3d'
參數,從而創建一個三維坐標軸。三維圖的優點是在notebook
中可以交互瀏覽。
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.show()
最基本的三維圖是由(x,y,z)
三維坐標點構成的線圖與散點圖。與之前普通二維圖類似,可以用ax.plot3D
與ax.scatter3D
函數來創建。不僅創建方式類似,三維圖函數的參數也和二維圖函數的參數基本相同。
下面來畫一個三角螺旋線并在線上隨機分布一些散點:
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
import numpy as np
ax = plt.axes(projection='3d')
# 三維線的數據
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray')
# 三維散點的數據
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens');
plt.show()
educoder官網、與二維ax.contour
圖形一樣,ax.contour3D
要求所有數據都是二維網格數據的形式,并且由函數計算z
軸數值。
下面用三維正弦函數畫三維等高線圖:
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');
plt.show()
默認的初始顯示角度有時不是最優的,matplotlib
提供了view_init
可以調整觀察角度與方位角。下面我們把俯仰角調整為60
度(x-y
平面的旋轉角度),方位角調整為35
度(繞z
軸順時針旋轉35
度)。
ax.view_init(60,35)
plt.show()
其實,也可以在matplotlib
的交互式后端界面直接通過點擊、拖拽圖形,實現同樣的交互旋轉效果。
線框圖和曲面圖
matplotlib畫圖?接下來我們將學習線框圖和曲面圖。它們都是將網格數據映射成三維曲面,得到的三維形狀非常容易可視化:
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
#繪制線框圖
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='black')
plt.show()
曲面圖和線框圖類似,只不過線框圖的每個面都是由多邊形構成的。需要注意的是,畫曲面圖需要二維數據,但可以不是直角坐標系。
#繪制曲面圖
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
plt.show()
下面創建一個局部的極坐標網絡,當我們把它畫成surface3D
圖形時,可以獲得一種使用了切片的可視化效果:
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
r = np.linspace(0, 6, 20)
theta = np.linspace(-0.9 * np.pi, 0.8 * np.pi, 40)
r, theta = np.meshgrid(r, theta)
X = r * np.sin(theta)
Y = r * np.cos(theta)
Z = f(X, Y)
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
plt.show()
編程要求
本關的編程任務是補全右側上部代碼編輯區內的相應代碼,根據輸入數據構建曲面,并設置顏色條為viridis
,具體格式化要求如下:
Task1/img/T1.png
;matplotlib的方法,請先仔細閱讀右側上部代碼編輯區內給出的代碼框架,再開始你的編程工作!
測試說明
平臺會對你編寫的代碼進行測試,對比你輸出的數值與實際正確的數值,只有所有數據全部計算正確才能進入下一關。
測試輸入:
無測試輸入
matplotlib中文手冊,預期輸出:
你的答案與正確答案一致
開始你的任務吧,祝你成功!
import matplotlib
matplotlib.use("Agg")
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
import numpy as npdef student(x,y,z):# ********* Begin *********#ax = plt.axes(projection='3d')ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')plt.savefig('Task1/img/T1.png')plt.show()# ********* End *********#
pythonmatplotlib?
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态