Python 数据分析三剑客之 Matplotlib(十):3D 图的绘制
CSDN 課程推薦:《Python 數據分析與挖掘》,講師劉順祥,浙江工商大學統計學碩士,數據分析師,曾擔任唯品會大數據部擔任數據分析師一職,負責支付環節的數據分析業務。曾與聯想、亨氏、網魚網咖等企業合作多個企業級項目。
Matplotlib 系列文章:
- Python 數據分析三劍客之 Matplotlib(一):初識 Matplotlib 與其 matplotibrc 配置文件
- Python 數據分析三劍客之 Matplotlib(二):文本描述 / 中文支持 / 畫布 / 網格等基本圖像屬性
- Python 數據分析三劍客之 Matplotlib(三):圖例 / LaTeX / 刻度 / 子圖 / 補丁等基本圖像屬性
- Python 數據分析三劍客之 Matplotlib(四):線性圖的繪制
- Python 數據分析三劍客之 Matplotlib(五):散點圖的繪制
- Python 數據分析三劍客之 Matplotlib(六):直方圖 / 柱狀圖 / 條形圖的繪制
- Python 數據分析三劍客之 Matplotlib(七):餅狀圖的繪制
- Python 數據分析三劍客之 Matplotlib(八):等高線 / 等值線圖的繪制
- Python 數據分析三劍客之 Matplotlib(九):極區圖 / 極坐標圖 / 雷達圖的繪制
- Python 數據分析三劍客之 Matplotlib(十):3D 圖的繪制
- Python 數據分析三劍客之 Matplotlib(十一):最熱門最常用的 50 個圖表【譯文】
另有 NumPy、Pandas 系列文章已更新完畢,歡迎關注:
- NumPy 系列文章:https://itrhx.blog.csdn.net/category_9780393.html
- Pandas 系列文章:https://itrhx.blog.csdn.net/category_9780397.html
- NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table
推薦學習資料與網站(博主參與部分文檔翻譯):
- NumPy 官方中文網:https://www.numpy.org.cn/
- Pandas 官方中文網:https://www.pypandas.cn/
- Matplotlib 官方中文網:https://www.matplotlib.org.cn/
- NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table
文章目錄
- 【01x00】了解 mplot3d Toolkit
- 【01x01】Axes3D 對象創建方法一:Axes3D(fig)
- 【01x02】Axes3D 對象創建方法二:add_subplot
- 【01x03】Axes3D 對象創建方法三:gca
- 【02x00】cmap 與 colorbar
- 【03x00】3D 線性圖:Axes3D.plot
- 【04x00】3D 散點圖:Axes3D.scatter
- 【05x00】3D 線框圖:Axes3D.plot_wireframe
- 【06x00】3D 曲面圖:Axes3D.plot_surface
- 【07x00】3D 柱狀圖:Axes3D.bar
- 【08x00】3D 箭頭圖:Axes3D.quiver
- 【09x00】3D 等高線圖:Axes3D.contour
- 【10x00】3D 等高線填充圖:Axes3D.contourf
- 【11x00】3D 三角曲面圖:Axes3D.plot_trisurf
- 【12x00】將 2D 圖像聚合到 3D 圖像中:Axes3D.add_collection3d
- 【13x00】3D 圖添加文本描述:Axes3D.text
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106558131 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
【01x00】了解 mplot3d Toolkit
mplot3d Toolkit 即 mplot3d 工具包,在 matplotlib 中使用 mplot3d 工具包可以繪制 3D 圖。
mplot3d 官方文檔:https://matplotlib.org/tutorials/toolkits/mplot3d.html
在 matplotlib 中,figure 為畫布,axes 為繪圖區,fig.add_subplot()、plt.subplot() 方法均可以創建子圖,在繪制 3D 圖時,某些 2D 圖的參數也適用于 3D 圖,在本文的示例中,可能會用到的一些沒有具體解釋的函數或者參數,其用法均可在前面的系列文章中找到:
-
《Python 數據分析三劍客之 Matplotlib(一):初識 Matplotlib 與其 matplotibrc 配置文件》
-
《Python 數據分析三劍客之 Matplotlib(二):文本描述 / 中文支持 / 畫布 / 網格等基本圖像屬性》
-
《Python 數據分析三劍客之 Matplotlib(三):圖例 / LaTeX / 刻度 / 子圖 / 補丁等基本圖像屬性》
繪制 3D 圖的步驟:創建 Axes3D 對象,然后調用 Axes3D 的不同方法來繪制不同類型的 3D 圖。以下介紹三種 Axes3D 對象創建的方法。
【01x01】Axes3D 對象創建方法一:Axes3D(fig)
在 Matplotlib 1.0.0 版本中,繪制 3D 圖需要先導入 Axes3D 包,獲取 figure 畫布對象 fig 后,通過 Axes3D(fig) 方法來創建 Axes3D 對象,具體方法如下:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 獲取 figure 畫布并創建 Axes3D 對象 fig = plt.figure() ax = Axes3D(fig)# 數據坐標 z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z)# 繪制線性圖 ax.plot(x, y, z) plt.show()【01x02】Axes3D 對象創建方法二:add_subplot
在 Matplotlib 3.2.0 版本中,繪制 3D 圖可以通過創建子圖,然后指定 projection 參數 為 3d 即可,返回的 ax 為 Axes3D 對象,以下兩種方法均可:
import numpy as np import matplotlib.pyplot as plt# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d')# 數據坐標 z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z)# 繪制線性圖 ax.plot(x, y, z) plt.show() import numpy as np import matplotlib.pyplot as plt# 通過子圖創建 Axes3D 對象 ax = plt.subplot(111, projection='3d')# 數據坐標 z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z)# 繪制線性圖 ax.plot(x, y, z) plt.show()【01x03】Axes3D 對象創建方法三:gca
除了以上兩種方法以外,還可以先獲取畫布對象 fig,再通過 fig.gca() 方法獲取當前繪圖區(gca = Get Current Axes),然后指定 projection 參數 為 3d 即可,返回的 ax 為 Axes3D 對象。
import numpy as np import matplotlib.pyplot as plt# 依次獲取畫布和繪圖區并創建 Axes3D 對象 fig = plt.figure() ax = fig.gca(projection='3d')# 數據坐標 z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z)# 繪制線性圖 ax.plot(x, y, z) plt.show()以上三種方法運行結果均為下圖:
【02x00】cmap 與 colorbar
默認情況下,散點圖、線性圖、曲面圖等將以純色著色,但可以通過提供 cmap 參數支持顏色映射。cmap 參數用于設置一些特殊的顏色組合,如漸變色等,參數取值通常為 Colormap 中的值,具體取值可參見下圖:
官方文檔:https://matplotlib.org/tutorials/colors/colormaps.html
如果使用了 cmap 參數,則可以使用 pyplot.colorbar() 函數來繪制一個色條,即顏色對照條。
基本語法:matplotlib.pyplot.colorbar([mappable=None, cax=None, ax=None, **kw])
部分參數解釋如下表,其他參數,如長度,寬度等請參考官方文檔。
| mappable | 要設置色條的圖像對象,該參數對于 Figure.colorbar 方法是必需的,但對于 pyplot.colorbar 函數是可選的 |
| cax | 可選項,要繪制色條的軸 |
| ax | 可選項,設置色條的顯示位置,通常在一個畫布上有多個子圖時使用 |
| **kw | 可選項,其他關鍵字參數,參考官方文檔 |
【03x00】3D 線性圖:Axes3D.plot
基本方法:Axes3D.plot(xs, ys[, zs, zdir='z', *args, **kwargs])
| xs | 一維數組,點的 x 軸坐標 |
| ys | 一維數組,點的 y 軸坐標 |
| zs | 一維數組,可選項,點的 z 軸坐標 |
| zdir | 可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞, 若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’ |
| **kwargs | 其他關鍵字參數,可選項,可參見 matplotlib.axes.Axes.plot |
【04x00】3D 散點圖:Axes3D.scatter
基本方法:Axes3D.scatter(xs, ys[, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs])
| xs | 一維數組,點的 x 軸坐標 |
| ys | 一維數組,點的 y 軸坐標 |
| zs | 一維數組,可選項,點的 z 軸坐標 |
| zdir | 可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞, 若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’ |
| s | 標量或數組類型,可選項,標記的大小,默認 20 |
| c | 標記的顏色,可選項,可以是單個顏色或者一個顏色列表 支持英文顏色名稱及其簡寫、十六進制顏色碼等,更多顏色示例參見官網 Color Demo |
| depthshade | bool 值,可選項,默認 True,是否為散點標記著色以提供深度外觀 |
| **kwargs | 其他關鍵字參數,可選項,可參見 scatter |
【05x00】3D 線框圖:Axes3D.plot_wireframe
基本方法:Axes3D.plot_wireframe(X, Y, Z[, *args, **kwargs])
| X | 二維數組,x 軸數據 |
| Y | 二維數組,y 軸數據 |
| Z | 二維數組,z 軸數據 |
| **kwargs | 其他關鍵字參數,可選項,如線條樣式顏色等,可參見 Line3DCollection |
【06x00】3D 曲面圖:Axes3D.plot_surface
基本方法:Axes3D.plot_surface(X, Y, Z[, *args, vmin=None, vmax=None, **kwargs])
| X | 二維數組,x 軸數據 |
| Y | 二維數組,y 軸數據 |
| Z | 二維數組,z 軸數據 |
| vmin / vmax | 規定數據界限 |
| **kwargs | 其他關鍵字參數,可選項,如線條樣式顏色等,可參見 Line3DCollection |
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106558131 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
【07x00】3D 柱狀圖:Axes3D.bar
基本方法:Axes3D.bar(left, height, zs=0, zdir='z', *args, **kwargs)
| left | 一維數組,柱狀圖最左側位置的 x 坐標 |
| height | 一維數組,柱狀圖的高度(y 坐標) |
| zs | 第 i 個多邊形將出現在平面 y=zs[i] 上 |
| zdir | 可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞, 若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’ |
| **kwargs | 其他關鍵字參數,參見 matplotlib.axes.Axes.bar |
【08x00】3D 箭頭圖:Axes3D.quiver
基本方法:Axes3D.quiver(X, Y, Z, U, V, W, length=1, arrow_length_ratio=0.3, pivot='tail', normalize=False, **kwargs)
| X, Y, Z | 數組形式,箭頭位置的 x、y 和 z 軸坐標(默認為箭頭尾部) |
| U, V, W | 數組形式,箭頭向量的 x、y 和 z 軸分量 |
| length | float 類型,每個箭筒的長度,默認為 1.0 |
| arrow_length_ratio | float 類型,箭頭相對于箭身的比率,默認為 0.3 |
| pivot | 箭頭在網格點上的位置;箭頭圍繞該點旋轉,因此命名為 pivot,默認為 'tail’ 可選項:'tail':尾部;'middle':中間;'tip':尖端 |
| normalize | bool 類型,如果為 True,則所有箭頭的長度都將相同 默認為 False,即箭頭的長度取決于 U、V、W 的值 |
| **kwargs | 其他關鍵字參數,參見 LineCollection |
【09x00】3D 等高線圖:Axes3D.contour
基本方法:Axes3D.contour(X, Y, Z[, *args, extend3d=False, stride=5, zdir='z', offset=None, **kwargs])
| X | 一維數組,x 軸數據 |
| Y | 一維數組,y 軸數據 |
| Z | 一維數組,z 軸數據 |
| extend3d | bool 值,可選項,是否以 3D 延伸輪廓,默認 False |
| stride | int 類型,可選項,用于延伸輪廓的步長 |
| zdir | 可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞, 若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’ |
| offset | 標量,可選項,如果指定,則在垂直于 zdir 的平面上的位置繪制輪廓線的投影 |
| **kwargs | 其他關鍵字參數,可選項,可參見 matplotlib.axes.Axes.contour |
【10x00】3D 等高線填充圖:Axes3D.contourf
基本語法:Axes3D.contourf(X, Y, Z[, *args, zdir='z', offset=None, **kwargs])
| X | 一維數組,x 軸數據 |
| Y | 一維數組,y 軸數據 |
| Z | 一維數組,z 軸數據 |
| zdir | 可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞, 若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’ |
| offset | 標量,可選項,如果指定,則在垂直于 zdir 的平面上的位置繪制輪廓線的投影 |
| **kwargs | 其他關鍵字參數,可選項,可參見 matplotlib.axes.Axes.contourf |
【11x00】3D 三角曲面圖:Axes3D.plot_trisurf
基本方法:Axes3D.plot_trisurf(X, Y, Z[, *args, color=None, vmin=None, vmax=None, **kwargs])
| X | 一維數組,x 軸數據 |
| Y | 一維數組,y 軸數據 |
| Z | 一維數組,z 軸數據 |
| color | 曲面表面的顏色 |
| vmin / vmax | 規定數據界限 |
| **kwargs | 可選項,其他關鍵字參數,可參見 Poly3DCollection |
【12x00】將 2D 圖像聚合到 3D 圖像中:Axes3D.add_collection3d
基本方法:Axes3D.add_collection3d(col, zs=0, zdir='z')
| col | PolyCollection / LineCollection / PatchCollection 對象 |
| zs | 第 i 個多邊形將出現在平面 y=zs[i] 上 |
| zdir | 可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞, 若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’ |
該函數一般用來向圖形中添加 3D 集合對象,以下用一個示例來展示某個地區在不同年份和不同月份的降水量:
import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import PolyCollectionplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']fig = plt.figure() ax = fig.gca(projection='3d')np.random.seed(59) month = np.arange(0, 13) years = [2017, 2018, 2019, 2020]precipitation = [] for year in years:value = np.random.rand(len(month)) * 300value[0], value[-1] = 0, 0precipitation.append(list(zip(month, value)))poly = PolyCollection(precipitation, facecolors=['r', 'g', 'b', 'y'], alpha=.6) ax.add_collection3d(poly, zs=years, zdir='y')ax.set_title('2D 圖像聚合到 3D 圖像示例', pad=15, fontsize='12') ax.set_xlabel('月份') ax.set_ylabel('年份') ax.set_zlabel('降水量') ax.set_xlim3d(0, 12) ax.set_ylim3d(2016, 2021) ax.set_zlim3d(0, 300)plt.show()此外,該方法也常被用于繪制 3D 多邊形圖,即多邊體,示例如下:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollectionplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']fig = plt.figure() ax = fig.gca(projection='3d')# 六面體頂點和面 verts = [(0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 0, 0), (0, 0, 1), (0, 1, 1), (1, 1, 1), (1, 0, 1)] faces = [[0, 1, 2, 3], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [0, 3, 7, 4]]# 獲取每個面的頂點 poly3d = [[verts[vert_id] for vert_id in face] for face in faces]# 繪制頂點 x, y, z = zip(*verts) ax.scatter(x, y, z) # 繪制多邊形面 ax.add_collection3d(Poly3DCollection(poly3d, facecolors='w', linewidths=1, alpha=0.5)) # 繪制多邊形的邊 ax.add_collection3d(Line3DCollection(poly3d, colors='k', linewidths=0.5, linestyles=':'))# 設置圖像標題、坐標標簽以及范圍 ax.set_title('繪制多邊體示例', pad=15, fontsize='12') ax.set_xlabel('X 軸') ax.set_ylabel('Y 軸') ax.set_zlabel('Z 軸') ax.set_xlim3d(-0.5, 1.5) ax.set_ylim3d(-0.5, 1.5) ax.set_zlim3d(-0.5, 1.5) plt.show()【13x00】3D 圖添加文本描述:Axes3D.text
基本方法:Axes3D.text(x, y, z, s[, zdir=None, **kwargs])
| x, y, z | 文本位置的 x、y、z 軸坐標 |
| s | 要添加的文本 |
| zdir | 可選項,若將 zdir 設置為 ‘y’,文本將會被投影到 x-z 軸平面上,默認為 None |
| **kwargs | 其他關鍵字參數,參見 matplotlib.text |
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106558131 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Python 数据分析三剑客之 Matplotlib(十):3D 图的绘制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东京造智能运动手表发布:只要319元
- 下一篇: 【Python CheckiO 题解】N