Python 數據分析三劍客之 Matplotlib(十):3D 圖的繪製

娛樂小視頻:小黃人番外短片合集 — 第16集【The Secret Life of Kyle 凱爾的祕密生活】


Matplotlib 系列文章:



這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 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 圖,在本文的示例中,可能會用到的一些沒有具體解釋的函數或者參數,其用法均可在前面的系列文章中找到:

繪製 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()

以上三種方法運行結果均爲下圖:

01

分割圖

【02x00】cmap 與 colorbar

默認情況下,散點圖、線性圖、曲面圖等將以純色着色,但可以通過提供 cmap 參數支持顏色映射。cmap 參數用於設置一些特殊的顏色組合,如漸變色等,參數取值通常爲 Colormap 中的值,具體取值可參見下圖:

官方文檔:https://matplotlib.org/tutorials/colors/colormaps.html

02

如果使用了 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()

03

分割圖

【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()

04

分割圖

【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()

05

分割圖

【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()

06

分割圖


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 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()

07

分割圖

【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()

08

分割圖

【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()

09

分割圖

【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()

10

分割圖

【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()

11

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()

12

分割圖

【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()

13

此外,該方法也常被用於繪製 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()

14

分割圖

【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()

15


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/106558131
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章