日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

30行python代码设计_30行Python代码实现3D数据可视化

發(fā)布時(shí)間:2025/3/8 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 30行python代码设计_30行Python代码实现3D数据可视化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:30行Python代碼實(shí)現(xiàn)3D數(shù)據(jù)可視化

作者:潮汐

來源:Python技術(shù)

歡迎來到 編程教室~

我們之前的文章中有講解過不少 Matplotlib 的用法,比如:

之前我們基本都是用它來繪制二維的數(shù)據(jù)圖表。而今天文章中,我們將教大家如何用不到 30 行代碼繪制 Matplotlib 3D 圖形。

回顧 2D 作圖

用賽貝爾曲線作 2d 圖。此圖是用基于 Matplotlib 的 Path 通過賽貝爾曲線實(shí)現(xiàn)的,有對(duì)賽貝爾曲線感興趣的朋友們可以深入了解一下。在 matplotlib 中,figure 為畫布,axes 為繪圖區(qū),fig.add_subplot、plt.subplot 方法均可以創(chuàng)建子圖。以下是作圖實(shí)踐。

importmatplotlib.path asmpath

importmatplotlib.patches asmpatches

importmatplotlib.pyplot asplt

fig, ax = plt.subplots

#定義繪圖指令與控制點(diǎn)坐標(biāo)

Path = mpath.Path

# Path 控制坐標(biāo)點(diǎn)繪制貝塞爾曲線

# 圖形數(shù)據(jù)構(gòu)造

# MOVETO表示將繪制起點(diǎn)移動(dòng)到指定坐標(biāo)

# CURVE4表示使用4個(gè)控制點(diǎn)繪制3次貝塞爾曲線

# CURVE3表示使用3個(gè)控制點(diǎn)繪制2次貝塞爾曲線

# LINETO表示從當(dāng)前位置繪制直線到指定位置

# CLOSEPOLY表示從當(dāng)前位置繪制直線到指定位置,并閉合多邊形

path_data = [

(Path.MOVETO, ( 1.88, -2.57)),

(Path.CURVE4, ( 0.35, -1.1)),

(Path.CURVE4, ( -1.75, 1.5)),

(Path.CURVE4, ( 0.375, 2.0)),

(Path.LINETO, ( 0.85, 1.15)),

(Path.CURVE4, ( 2.2, 3.2)),

(Path.CURVE4, ( 3, 0.05)),

(Path.CURVE4, ( 2.0, -1.5)),

(Path.CLOSEPOLY, ( 1.58, -2.57)),

]

codes,verts = zip(*path_data)

path = mpath.Path(verts, codes)

patch = mpatches.PathPatch(path, facecolor= 'r', alpha= 0.5)

ax.add_patch(patch)

# plot control points and connecting lines

x, y = zip(*path.vertices)

line, = ax.plot(x, y, 'go-')

ax.grid

ax.axis( 'equal')

plt.show

心型效果圖 3D 帽子圖1

Matplotlib 繪制 3D 圖形使用的是 mplot3d Toolkit,即 mplot3d 工具包。繪制 3D 圖可以通過創(chuàng)建子圖,然后指定 projection 參數(shù) 為 3d 即可,返回的 ax 為 Axes3D 對(duì)象。

導(dǎo)入包:

frommatplotlib importcm

frommatplotlib.ticker importLinearLocator, FormatStrFormatter

frommpl_toolkits.mplot3d importAxes3D

繪圖全過程:

importmatplotlib.pyplot asplt

frommatplotlib importcm

frommatplotlib.ticker importLinearLocator, FormatStrFormatter

frommpl_toolkits.mplot3d importAxes3D

importnumpy asnp

fig = plt.figure

# 指定圖形類型是 3d 類型

ax = fig.add_subplot(projection= '3d')

# 構(gòu)造數(shù)據(jù)

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)

# Plot the surface.

surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,

linewidth= 0, antialiased= False)

# Customize the z axis.

ax.set_zlim( -1.01, 1.01)

ax.zaxis.set_major_locator(LinearLocator( 10))

ax.zaxis.set_major_formatter(FormatStrFormatter( '%.02f'))

# Add a color bar which maps values to colors.

fig.colorbar(surf, shrink= 0.5, aspect= 5)

plt.show

呈現(xiàn)效果:

帽子圖1 3D 帽子圖2 importnumpy asnp

importmatplotlib.pyplot asplt

frommpl_toolkits.mplot3d importAxes3D

fig = plt.figure

# 指定圖形類型為 3d 類型

ax = fig.add_subplot( 111, projection= '3d')

# X, Y value

X = np.arange( -5, 5, 0.25)

Y = np.arange( -5, 5, 0.25)

# 設(shè)置 x-y 平面的網(wǎng)格

X, Y = np.meshgrid(X, Y)

R = np.sqrt(X ** 2+ Y ** 2)

# height value

Z = np.sin(R)

# rstride:行之間的跨度 cstride:列之間的跨度

# rcount:設(shè)置間隔個(gè)數(shù),默認(rèn)50個(gè),ccount:列的間隔個(gè)數(shù) 不能與上面兩個(gè)參數(shù)同時(shí)出現(xiàn)

#vmax和vmin 顏色的最大值和最小值

ax.plot_surface(X, Y, Z, rstride= 1, cstride= 1, cmap=plt.get_cmap( 'rainbow'))

# zdir : 'z' | 'x' | 'y' 表示把等高線圖投射到哪個(gè)面

# offset : 表示等高線圖投射到指定頁面的某個(gè)刻度

ax.contourf(X,Y,Z,zdir= 'z',offset= -2)

# 設(shè)置圖像z軸的顯示范圍,x、y軸設(shè)置方式相同

ax.set_zlim( -2, 2)

plt.show

帽子圖2 3D 線性圖

3D 線性圖使用 Axes3D.plot來繪制。繪畫的基本方法:Axes3D.plot(xs, ys[, zs, zdir='z', *args, **kwargs])

參數(shù)說明:

參數(shù)

描述

xs

一維數(shù)組,點(diǎn)的 x 軸坐標(biāo)

ys

一維數(shù)組,點(diǎn)的 y 軸坐標(biāo)

zs

一維數(shù)組,可選項(xiàng),點(diǎn)的 z 軸坐標(biāo)

zdir

可選項(xiàng),在 3D 軸上繪制 2D 數(shù)據(jù)時(shí),數(shù)據(jù)必須以 xs,ys 的形式傳遞,若此時(shí)將 zdir 設(shè)置為 ‘y’,數(shù)據(jù)將會(huì)被繪制到 x-z 軸平面上,默認(rèn)為 ‘z’

**kwargs

其他關(guān)鍵字參數(shù),可選項(xiàng),可參見 matplotlib.axes.Axes.plot

importnumpy

asnp

importmatplotlib.pyplot asplt

frommpl_toolkits.mplot3d importAxes3D

# 依次獲取畫布和繪圖區(qū)并創(chuàng)建 Axes3D 對(duì)象

fig = plt.figure

ax = fig.gca(projection= '3d')

# 第一條3D線性圖數(shù)據(jù)

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線性圖數(shù)據(jù)

z2 = np.linspace( -3, 3, 100)

x2 = np.sin(z2)

y2 = np.cos(z2)

# 繪制3D線性圖

ax.plot(x1, y1, z1, color= 'b', label= '3D Line1')

ax.plot(x2, y2, z2, color= 'r', label= '3D Line2')

# 設(shè)置標(biāo)題、軸標(biāo)簽、圖例,也可以直接使用 plt.title、plt.xlabel、plt.legend...

ax.set_title( '3D Line View', pad= 15, fontsize= '10')

ax.set_xlabel( 'x ', color= 'r', fontsize= '14')

ax.set_ylabel( 'y ', color= 'g', fontsize= '14')

ax.set_zlabel( 'z ', color= 'b', fontsize= '14')

ax.legend

plt.show

結(jié)果顯示:

線性圖 3D 散點(diǎn)圖

繪制 3D 散點(diǎn)圖的基本方法是:Axes3D.scatter(xs, ys[, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs])

參數(shù)詳解:

參數(shù)

描述

xs

一維數(shù)組,點(diǎn)的 x 軸坐標(biāo)

ys

一維數(shù)組,點(diǎn)的 y 軸坐標(biāo)

zs

一維數(shù)組,可選項(xiàng),點(diǎn)的 z 軸坐標(biāo)

zdir

可選項(xiàng),在 3D 軸上繪制 2D 數(shù)據(jù)時(shí),數(shù)據(jù)必須以 xs,ys 的形式傳遞,若此時(shí)將 zdir 設(shè)置為 ‘y’,數(shù)據(jù)將會(huì)被繪制到 x-z 軸平面上,默認(rèn)為 ‘z’

s

標(biāo)量或數(shù)組類型,可選項(xiàng),標(biāo)記的大小,默認(rèn) 20

c

標(biāo)記的顏色,可選項(xiàng),可以是單個(gè)顏色或者一個(gè)顏色列表支持英文顏色名稱及其簡寫、十六進(jìn)制顏色碼等,更多顏色示例參見官網(wǎng) Color Demo

depthshade

bool 值,可選項(xiàng),默認(rèn) True,是否為散點(diǎn)標(biāo)記著色以提供深度外觀

**kwargs

其他關(guān)鍵字

importmatplotlib.pyplot

asplt

importnumpy asnp

frommpl_toolkits.mplot3d importAxes3D

defrandrange(n, vmin, vmax):

return(vmax - vmin) * np.random.rand(n) + vmin

fig = plt.figure

ax = fig.add_subplot( 111, projection= '3d')

n = 100

# For each set of style and range settings, plot n random points in the box

# defined by x in [23, 32], y in [0, 100], z in [zlow, zhigh].

forc, m, zlow, zhigh in[( 'r', 'o', -50, -25), ( 'b', '^', -30, -5)]:

xs = randrange(n, 23, 32)

ys = randrange(n, 0, 100)

zs = randrange(n, zlow, zhigh)

ax.scatter(xs, ys, zs, c=c, marker=m)

ax.set_title( '3D Diagram View', pad= 15, fontsize= '10')

ax.set_xlabel( 'x ', color= 'r', fontsize= '14')

ax.set_ylabel( 'y ', color= 'g', fontsize= '14')

ax.set_zlabel( 'z ', color= 'b', fontsize= '14')

plt.show

結(jié)果顯示為:

散點(diǎn)圖 總結(jié)

本文主要是介紹使用 Python 第三方庫 Matplotlib 來繪制 3D 圖形,當(dāng)然除了上面演示的這幾種,還有更多豐富的圖形和功能等待你去挖掘。相比于 2D 圖形,3D 圖形可以多展現(xiàn)一個(gè)維度的數(shù)據(jù)特征,在可視化時(shí)會(huì)有更加直觀的效果。 在實(shí)際的數(shù)據(jù)可視化過程中,我們要根據(jù)具體需求來決定用怎樣的形式來展現(xiàn),而多了解一些工具就可以更加游刃有余。這些強(qiáng)大的工具也正是 Python 在數(shù)據(jù)分析和可視化方面的一大優(yōu)勢(shì)之一。

本文相關(guān)代碼下載地址:

https://github.com/JustDoPython/python-examples/tree/master/chaoxi/Matplotlib_3D

150年前,他對(duì)拿破侖做數(shù)據(jù)可視化 返回搜狐,查看更多

責(zé)任編輯:

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的30行python代码设计_30行Python代码实现3D数据可视化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。