娛樂小視頻:小黃人番外短片合集 — 第16集【The Secret Life of Kyle 凱爾的祕密生活】
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 個圖表【譯文】
文章目錄
- 【01x00】瞭解 mplot3d Toolkit
- 【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 |
depthshade | bool 值,可選項,默認 True,是否爲散點標記着色以提供深度外觀 |
**kwargs | 其他關鍵字參數,可選項,可參見 scatter |
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')
n = 100
def 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 plt
plt.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 plt
plt.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 np
plt.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 軸分量 |
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 |
import matplotlib.pyplot as plt
import numpy as np
plt.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 軸數據 |
extend3d | bool 值,可選項,是否以 3D 延伸輪廓,默認 False |
stride | int 類型,可選項,用於延伸輪廓的步長 |
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 plt
plt.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 plt
plt.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 np
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 獲取 figure 畫布並通過子圖創建 Axes3D 對象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n_radii = 8
n_angles = 36
radii = 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 mtri
plt.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_angles
x = (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')
參數 | 描述 |
---|---|
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 PolyCollection
plt.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)) * 300
value[0], value[-1] = 0, 0
precipitation.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, Line3DCollection
plt.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 plt
plt.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
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!