日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 数据分析三剑客之 Matplotlib(十):3D 图的绘制

發布時間:2023/12/10 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
import numpy as np import matplotlib.pyplot as plt# 設置中文顯示 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 依次獲取畫布和繪圖區并創建 Axes3D 對象 fig = plt.figure() ax = fig.gca(projection='3d')# 第一條3D線性圖數據 theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) z1 = np.linspace(-2, 2, 100) r = z1**2 + 1 x1 = r * np.sin(theta) y1 = r * np.cos(theta)# 第二條3D線性圖數據 z2 = np.linspace(-3, 3, 100) x2 = np.sin(z2) y2 = np.cos(z2)# 繪制3D線性圖 ax.plot(x1, y1, z1, color='b', label='3D 線性圖一') ax.plot(x2, y2, z2, color='r', label='3D 線性圖二')# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel、plt.legend... ax.set_title('繪制 3D 線性圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸', color='r', fontsize='12') ax.set_ylabel('y 軸', color='g', fontsize='12') ax.set_zlabel('z 軸', color='b', fontsize='12') ax.legend()plt.show()

【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
depthshadebool 值,可選項,默認 True,是否為散點標記著色以提供深度外觀
**kwargs其他關鍵字參數,可選項,可參見 scatter
import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 依次獲取畫布和繪圖區并創建 Axes3D 對象 fig = plt.figure() ax = fig.gca(projection='3d') n = 100def randrange(n, vmin, vmax):return (vmax - vmin)*np.random.rand(n) + vmin''' 定義繪制 n 個隨機點,設置每一組數據點的樣式和范圍 x軸數據位于[23,32]區間,y軸數據位于[0,100]區間,z軸數據位于[zlow,zhigh]區間 ''' for m, zlow, zhigh in [('o', -50, -25), ('^', -30, -5)]:xs = randrange(n, 23, 32)ys = randrange(n, 0, 100)zs = randrange(n, zlow, zhigh)ax.scatter(xs, ys, zs, marker=m)# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel... ax.set_title('繪制 3D 散點圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸', color='b') ax.set_ylabel('y 軸', color='b') ax.set_zlabel('z 軸', color='b')plt.show()

【05x00】3D 線框圖:Axes3D.plot_wireframe

基本方法:Axes3D.plot_wireframe(X, Y, Z[, *args, **kwargs])

參數描述
X二維數組,x 軸數據
Y二維數組,y 軸數據
Z二維數組,z 軸數據
**kwargs其他關鍵字參數,可選項,如線條樣式顏色等,可參見 Line3DCollection
import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d')# 定義Z軸坐標的生成方法 def f(m, n):return np.sin(np.sqrt(m ** 2 + n ** 2))# 設置3D線框圖數據 x = np.linspace(-6, 6, 30) y = np.linspace(-6, 6, 30) # 生成網格點坐標矩陣,該方法在系列文章八中有具體介紹 X, Y = np.meshgrid(x, y) Z = f(X, Y)# 繪制3D線框圖 ax.plot_wireframe(X, Y, Z, color='c')# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel... ax.set_title('繪制 3D 線框圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸')plt.show()

【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
import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d')# 設置3D曲面圖數據 X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) # 生成網格點坐標矩陣,該方法在系列文章八中有具體介紹 X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R)# 繪制3D曲面圖并添加色條(長度0.8) surface = ax.plot_surface(X, Y, Z, cmap='rainbow', antialiased=False) fig.colorbar(surface, shrink=0.8)# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel... ax.set_title('繪制 3D 曲面圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸') # 調整觀察角度和方位角,俯仰角25度,方位角40度 ax.view_init(25, 40) # 設置Z軸刻度界限 ax.set_zlim(-2, 2)plt.show()


這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 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
import matplotlib.pyplot as plt import numpy as npplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d')colors = ['r', 'g', 'b', 'y'] yticks = [3, 2, 1, 0]# 設置3D柱狀圖數據并繪制圖像 for c, k in zip(colors, yticks):xs = np.arange(20)ys = np.random.rand(20)cs = [c] * len(xs)ax.bar(xs, ys, zs=k, zdir='y', color=cs, alpha=0.8)# 設置圖像標題、坐標標簽以及范圍 ax.set_title('繪制 3D 柱狀圖示例', pad=15, fontsize='12') ax.set_xlabel('X 軸') ax.set_ylabel('Y 軸') ax.set_zlabel('Z 軸') ax.set_yticks(yticks)plt.show()

【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 軸分量
lengthfloat 類型,每個箭筒的長度,默認為 1.0
arrow_length_ratiofloat 類型,箭頭相對于箭身的比率,默認為 0.3
pivot箭頭在網格點上的位置;箭頭圍繞該點旋轉,因此命名為 pivot,默認為 'tail’
可選項:'tail':尾部;'middle':中間;'tip':尖端
normalizebool 類型,如果為 True,則所有箭頭的長度都將相同
默認為 False,即箭頭的長度取決于 U、V、W 的值
**kwargs其他關鍵字參數,參見 LineCollection
import matplotlib.pyplot as plt import numpy as npplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 依次獲取畫布和繪圖區并創建 Axes3D 對象 fig = plt.figure() ax = fig.gca(projection='3d')# 設置箭頭位置 x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),np.arange(-0.8, 1, 0.2),np.arange(-0.8, 1, 0.8))# 設置箭頭數據 u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z))# 繪制 3D 箭頭圖 ax.quiver(x, y, z, u, v, w, length=0.1, normalize=True)# 設置圖像標題、坐標標簽 ax.set_title('繪制 3D 箭頭圖示例', pad=15, fontsize='12') ax.set_xlabel('X 軸') ax.set_ylabel('Y 軸') ax.set_zlabel('Z 軸')# 調整觀察角度,俯仰角20度 ax.view_init(20)plt.show()

【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 軸數據
extend3dbool 值,可選項,是否以 3D 延伸輪廓,默認 False
strideint 類型,可選項,用于延伸輪廓的步長
zdir可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞,
若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’
offset標量,可選項,如果指定,則在垂直于 zdir 的平面上的位置繪制輪廓線的投影
**kwargs其他關鍵字參數,可選項,可參見 matplotlib.axes.Axes.contour
import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure(figsize=(8, 4.8)) ax = fig.add_subplot(111, projection='3d')# 設置等高線數據 X = np.arange(-2.0, 2.0, 0.01) Y = np.arange(-2.0, 2.0, 0.01) # 生成網格點坐標矩陣 m, n = np.meshgrid(X, Y)# 指定一個函數用于計算每個點的高度,也可以直接使用二維數組儲存每個點的高度 def f(a, b):return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)# 繪制3D等高線圖并添加色條圖(長度0.8) contour = ax.contour(X, Y, f(m, n), cmap='rainbow') fig.colorbar(contour, shrink=0.8)# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel... ax.set_title('繪制 3D 等高線圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸')plt.show()

【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
import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure(figsize=(8, 4.8)) ax = fig.add_subplot(111, projection='3d')# 設置等高線數據 X = np.arange(-2.0, 2.0, 0.01) Y = np.arange(-2.0, 2.0, 0.01) # 生成網格點坐標矩陣 m, n = np.meshgrid(X, Y)# 指定一個函數用于計算每個點的高度,也可以直接使用二維數組儲存每個點的高度 def f(a, b):return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)# 繪制3D等高線圖并添加色條圖(長度0.8) contourf = ax.contourf(X, Y, f(m, n), cmap='rainbow') fig.colorbar(contourf, shrink=0.8)# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel... ax.set_title('繪制 3D 等高線填充圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸')plt.show()

【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
import matplotlib.pyplot as plt import numpy as npplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 獲取 figure 畫布并通過子圖創建 Axes3D 對象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d')n_radii = 8 n_angles = 36radii = np.linspace(0.125, 1.0, n_radii) angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)[..., np.newaxis] x = np.append(0, (radii*np.cos(angles)).flatten()) y = np.append(0, (radii*np.sin(angles)).flatten()) z = np.sin(-x*y)# 繪制3D三角曲面圖并添加色條(長度0.8) trisurf = ax.plot_trisurf(x, y, z, cmap='rainbow') fig.colorbar(trisurf, shrink=0.8)# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel... ax.set_title('繪制 3D 三角曲面圖示例', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸')plt.show()

import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as mtriplt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] fig = plt.figure(figsize=(15, 6))# ============ 第一個示例圖 ============ #ax = fig.add_subplot(1, 2, 1, projection='3d')u = np.linspace(0, 2.0 * np.pi, endpoint=True, num=50) v = np.linspace(-0.5, 0.5, endpoint=True, num=10) u, v = np.meshgrid(u, v) u, v = u.flatten(), v.flatten()x = (1 + 0.5 * v * np.cos(u / 2.0)) * np.cos(u) y = (1 + 0.5 * v * np.cos(u / 2.0)) * np.sin(u) z = 0.5 * v * np.sin(u / 2.0)tri = mtri.Triangulation(u, v)trisurf_1 = ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap='cool') fig.colorbar(trisurf_1, shrink=0.8) ax.set_zlim(-1, 1)ax.set_title('繪制 3D 三角曲面圖示例一', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸')# ============ 第二個示例圖 ============ #ax = fig.add_subplot(1, 2, 2, projection='3d')n_angles = 36 n_radii = 8 min_radius = 0.25 radii = np.linspace(min_radius, 0.95, n_radii)angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False) angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1) angles[:, 1::2] += np.pi/n_anglesx = (radii*np.cos(angles)).flatten() y = (radii*np.sin(angles)).flatten() z = (np.cos(radii)*np.cos(3*angles)).flatten()triang = mtri.Triangulation(x, y)xmid = x[triang.triangles].mean(axis=1) ymid = y[triang.triangles].mean(axis=1) mask = xmid**2 + ymid**2 < min_radius**2 triang.set_mask(mask)trisurf_2 = ax.plot_trisurf(triang, z, cmap='hsv') fig.colorbar(trisurf_2, shrink=0.8)ax.set_title('繪制 3D 三角曲面圖示例二', pad=15, fontsize='12') ax.set_xlabel('x 軸') ax.set_ylabel('y 軸') ax.set_zlabel('z 軸')plt.show()

【12x00】將 2D 圖像聚合到 3D 圖像中:Axes3D.add_collection3d

基本方法:Axes3D.add_collection3d(col, zs=0, zdir='z')

參數描述
colPolyCollection / 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
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 依次獲取畫布和繪圖區并創建 Axes3D 對象 fig = 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:設置顏色 ax.text(9, 0, 0, "red", color='red')# Demo 3: text2D,位置(0,0)為左下角,(1,1)為右上角。 ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes)# 設置坐標軸界限和標簽 ax.set_xlim(0, 10) ax.set_ylim(0, 10) ax.set_zlim(0, 10) ax.set_xlabel('X 軸') ax.set_ylabel('Y 軸') ax.set_zlabel('Z 軸')plt.show()


這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106558131 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Python 数据分析三剑客之 Matplotlib(十):3D 图的绘制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。