matplotlib(六)三维作图
文章目錄
- 寫在篇前
- 三維繪圖函數
- LinePlot
- ScatterPlot
- WireframePlot
- SurfacePlot
- ContourPlot
- FilledContourPlot
- PolygonPlot
- BarPlot
- Text
- 寫在篇后
寫在篇前
??matplotlib也支持三維作圖,但是相對于matlab來講,感覺功能更弱。當然話說回來,三維作圖用的場景相對也更少,所以呢,有一定的知識儲備就夠了。matplotlib繪制三維圖形依賴于mpl_toolkits.mplot3d,用法也比較簡單,只需要一個關鍵字參數projection='3d'就可以創建三維Axes。
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure() ax = fig.add_subplot(111, projection='3d')?你可能會看到有的教程寫的是ax = Axes3D(fig),這是version1.0.0之前的寫法
三維繪圖函數
LinePlot
-
Axes3D.``plot(xs, ys, *args, zdir=‘z’, **kwargs)
??其他參數向下傳遞給plot函數
| xs, ys | x、y 坐標 |
| zs | z 坐標,可以是一個標量或一個x*y維矩陣 |
| zdir | 當繪制二維圖像時的z軸方向 |
ScatterPlot
-
Axes3D.``scatter(xs, ys, zs=0, zdir=‘z’, s=20, c=None, depthshade=True, *args, **kwargs)
返回Patch3DCollection,
??其他參數向下傳遞給plot函數
ArgumentDescription xs, ys x,y坐標點 zs z 坐標,可以是一個標量或一個x*y維矩陣,默認是0. zdir 當繪制二維圖像時的z軸方向 s size,即散點大小 c 顏色映射,其取值可以是非常多類型,有時間專門寫一篇講解 depthshade 是否渲染景深(或則就說陰影吧),默認是True.
WireframePlot
-
Axes3D.``plot_wireframe(X, Y, Z, *args, **kwargs)
from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as pltfig = plt.figure() ax = fig.add_subplot(111, projection='3d')# Grab some test data. X, Y, Z = axes3d.get_test_data(0.05)# Plot a basic wireframe. ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)plt.show()ArgumentDescription X, Y,Z 坐標點 rcount,ccount 采樣數,越大采樣越多,默認50 rstride,cstride 采樣步長,越小采樣越多 **kwargs 其他參數向下傳入Line3DCollection
SurfacePlot
-
Axes3D.``plot_surface(X, Y, Z, *args, norm=None, vmin=None, vmax=None, lightsource=None, **kwargs)
??這個函數算是比較常用的函數,用于繪制三維表面圖,讓人驚艷的是它的著色效果。
ArgumentDescription X, Y,Z 坐標點 rcount,ccount,rstride,cstride 同上 color 定義surface patch的顏色,type:color-like cmap 定義surface patch的顏色,只不過是colorMap,type:colormap facecolors 指定單個patch的顏色, type:array-like of colors norm colormap的normalization, type:Normalize shade 陰影效果,type:boolean vmin, vmax normalization的邊界 **kwargs 向下傳遞到Poly3DCollection antialiased 抗鋸齒,type:boolean
ContourPlot
-
Axes3D.``contour(X, Y, Z, *args, extend3d=False, stride=5, zdir=‘z’, offset=None, **kwargs)
ArgumentDescription X, Y,Z Data values as numpy.arrays extend3d 是否延申到3d空間 (default: False) *stride (extend3d的)采樣步長 zdir 同上 offset 繪制輪廓線在zdir垂直的水平面上的投影 ??其他位置、關鍵字參數向下傳遞到二維contour()函數
FilledContourPlot
- Axes3D.``contourf(X, Y, Z, *args, zdir=‘z’, offset=None, **kwargs)
| X, Y,Z | Data values as numpy.arrays |
| zdir | 同上 |
| offset | 繪制輪廓線在zdir垂直的水平面上的投影 |
??其他位置、關鍵字參數向下傳遞到二維contourf(),例子請參考上面的contour
PolygonPlot
-
Axes3D.``add_collection3d(col, zs=0, zdir=‘z’)
???這個函數挺有趣,但是我沒有遇到過這種場景。它可以將三維 collection對象或二維collection對象加入到一個圖形中,包括:
-
PolyCollection
-
LineCollection
-
PatchCollection
-
BarPlot
-
Axes3D.``bar(left, height, zs=0, zdir=‘z’, *args, **kwargs)
?其他參數向下傳遞給bar函數,返回Patch3DCollection對象
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused importimport matplotlib.pyplot as plt import numpy as np# Fixing random state for reproducibility np.random.seed(19680801)fig = plt.figure() ax = fig.add_subplot(111, projection='3d')colors = ['r', 'g', 'b', 'y'] yticks = [3, 2, 1, 0] for c, k in zip(colors, yticks):# Generate the random data for the y=k 'layer'.xs = np.arange(20)ys = np.random.rand(20)# You can provide either a single color or an array with the same length as# xs and ys. To demonstrate this, we color the first bar of each set cyan.cs = [c] * len(xs)# Plot the bar graph given by xs and ys on the plane y=k with 80% opacity.ax.bar(xs, ys, zs=k, zdir='y', color=cs, alpha=0.8)ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z')# On the y axis let's only label the discrete values that we have data for. ax.set_yticks(yticks)plt.show()ArgumentDescription left 條形圖水平坐標 height 條形的高度 zs Z方向 zdir 同上
Text
-
Axes3D.``text(x, y, z, s, zdir=None, **kwargs)
??text的內容其實也很繁雜,需要用一篇內容去探討,在三維中很重要的一點是要學會二維、三維文字的添加。
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused importimport matplotlib.pyplot as pltfig = plt.figure() ax = fig.gca(projection='3d')# Demo 1: zdir zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1)) xs = (1, 4, 4, 9, 4, 1) ys = (2, 5, 8, 10, 1, 2) zs = (10, 3, 8, 9, 1, 8)for zdir, x, y, z in zip(zdirs, xs, ys, zs):label = '(%d, %d, %d), dir=%s' % (x, y, z, zdir)ax.text(x, y, z, label, zdir)# Demo 2: color ax.text(9, 0, 0, "red", color='red')# Demo 3: text2D # Placement 0, 0 would be the bottom left, 1, 1 would be the top right. ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes)# Tweaking display region and labels ax.set_xlim(0, 10) ax.set_ylim(0, 10) ax.set_zlim(0, 10) ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis')plt.show()
寫在篇后
??三維繪圖不是很常用,主要就是scatterPlot以及surfacePlot稍微更常用。關于三維繪圖總結的也有點糙,更多關于matplotlib,可以閱讀參考我寫的同類文章請參考:
- Matplotlib(一)工作流程
- Matplotlib(二)繪圖生命周期
- Matplotlib(三) rcParams 自定義樣式控制
- matplotlib(四)核心模式以及注意事項
- matplotlib(五)排版布局
總結
以上是生活随笔為你收集整理的matplotlib(六)三维作图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】NMF(非负矩阵分解)
- 下一篇: 实用Linux命令