生活随笔
收集整理的這篇文章主要介紹了
可视化篇(二)———使用matplotlib绘制常用3D图形及案例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可視化篇(二)———使用matplotlib繪制常用3D圖形及案例
- 摘要
- (一)添加matplotlib 3D模塊
- (二)3d圖中繪制曲線
- (三)3d圖中繪制散點圖
- (四)3d圖中繪制線框圖
- (五)3d圖中繪制曲面圖
- (六)3d圖中繪制三角表面圖
- (七)3d圖中繪制等高線
- (八)3d圖中繪制條形圖
摘要
本文通過學習matplotlib繪制3d圖形的官方文檔,總結了常用的3d圖形,以及針對每類圖形,通過一個小案例進行可視化。
官方文檔
(一)添加matplotlib 3D模塊
從工具箱中導入繪制3D圖所需要的坐標軸模塊。
from mpl_toolkits
.mplot3d
import Axes3D
import matplotlib
.pyplot
as plt
繪制子圖添加坐標軸時先申明繪制的類型為:3D (使用projection = "3d"進行申明)。
#
繪制子圖添加坐標軸時先申明繪制的類型為:3D (使用projection
= "3d"進行申明
)
fig
= plt
.figure()
ax
= fig
.add_subplot(1,1,1,projection
= "3d")
(二)3d圖中繪制曲線
1、在3d坐標軸對象下使用plot方法。
2、其余參數同2d圖。
#
************* 3d圖中繪制曲線
*************
# 在
3d坐標軸對象下使用plot方法
import numpy
as np
fig
= plt
.figure()
ax1
= fig
.add_subplot(1,1,1,projection
= "3d")
x
= np
.linspace(-10,10,100)
y
= np
.linspace(-10,10,100)
z
= x
**10 + y
**3
ax1
.plot(x
,y
,z
,label
= "3d curve") # 其余參數同
2d圖
ax1
.legend()
plt
.show()
(三)3d圖中繪制散點圖
1、在3d坐標軸對象下使用scatter方法。
2、zdir為指定z軸方向,其余參數同2d繪圖。
#
****************** 3d圖中繪制散點圖
******************
# 在
3d坐標軸對象下使用scatter方法
from mpl_toolkits
.mplot3d
import Axes3D
import matplotlib
.pyplot
as plt
fig
= plt
.figure()
ax1
= fig
.add_subplot(1,1,1,projection
= "3d")
from sklearn
.datasets
import make_blobs
data
= make_blobs(n_samples
= 100,n_features
= 3,cluster_std
= 2)
x
= data
[0][:,0]
z
= data
[0][:,1]
y
= data
[0][:,2]
label
= data
[1]
colors
= ""
for i
in range(100):if label
[i
] == 0:colors
+= "r"elif label
[i
] == 1:colors
+= "g"else:colors
+= "b"
ax1
.scatter(x
,y
,z
,zdir
= "z",c
= colors
) # zdir為指定z軸方向,其余參數同
2d繪圖
ax1
.set_xlabel("x")
ax1
.set_xlabel("y")
ax1
.set_xlabel("z")
(四)3d圖中繪制線框圖
1、在3d坐標軸對象下使用plot_wireframe方法。
2、Axes3D寫作axes3d也可以。
3、X和Y需要是二維數組。
4、rcount:為沿行方向繪制網格的數目,
ccount:為沿列方向繪制網格的數目。
#
****************** 3d圖中繪制線框圖
******************
# 在
3d坐標軸對象下使用plot_wireframe方法
from mpl_toolkits
.mplot3d
import axes3d # Axes3D寫作axes3d也可以
import matplotlib
.pyplot
as plt
import numpy
as np
fig
= plt
.figure(figsize
=(16,8))
ax1
= fig
.add_subplot(1,1,1,projection
= "3d")
x
= np
.linspace(-5,5,1000)
y
= np
.linspace(-5,5,1000)
X,Y = np
.meshgrid(x
,y
) #
X和
Y需要是二維數組
Z = np
.sin(np
.sqrt(X**2+Y**2))
ax1
.plot_wireframe(X,Y,Z,rcount
= 15,ccount
= 15) # rcount
:為沿行方向繪制網格的數目,ccount
:為沿列方向繪制網格的數目,
plt
.show()
(五)3d圖中繪制曲面圖
1、在3d坐標軸對象下使用plot_surface方法。
2、rcount:為沿行方向繪制網格的數目
ccount:為沿列方向繪制網格的數目
cmap:設定配色板(可直接調用matplotlib.cm中的配色板,如autumn,autumn_r,coolwarm等等)
color:設定顏色
#
****************** 3d圖中繪制曲面圖
******************
# 在
3d坐標軸對象下使用plot_surface方法
from mpl_toolkits
.mplot3d
import axes3d # Axes3D寫作axes3d也可以
import matplotlib
.pyplot
as plt
from matplotlib
import cm
import numpy
as np
fig
= plt
.figure(figsize
=(16,8))
ax1
= fig
.add_subplot(1,1,1,projection
= "3d")
x
= np
.linspace(-5,5,1000)
y
= np
.linspace(-5,5,1000)
X,Y = np
.meshgrid(x
,y
) #
X和
Y需要是二維數組
Z = np
.sin(np
.sqrt(X**2+Y**2))surf
= ax1
.plot_surface(X, Y, Z, cmap
=cm
.autumn
)
"""
其余參數:
rcount
:為沿行方向繪制網格的數目
ccount
:為沿列方向繪制網格的數目
cmap
:設定配色板(可直接調用matplotlib
.cm中的配色板,如autumn
,autumn_r,coolwarm等等)
color
:設定顏色
"""fig
.colorbar(surf
, shrink
=0.5, aspect
=5)
plt
.show()
(六)3d圖中繪制三角表面圖
1、 在3d坐標軸對象下使用plot_trisurf方法。
2、以繪制莫比烏斯帶為列。
#
****************** 3d圖中繪制三角表面圖
******************
# 在
3d坐標軸對象下使用plot_trisurf方法
from mpl_toolkits
.mplot3d
import axes3d
import matplotlib
.pyplot
as plt
import numpy
as np
from matplotlib
import cm
import matplotlib
.tri
as mtri
# 以繪制莫比烏斯帶為列fig
= plt
.figure()
ax1
= fig
.add_subplot(1, 1, 1, projection
='3d')x
= np
.linspace(0, 2*np
.pi
,100)
y
= np
.linspace(-0.5, 0.5,20)
x
,y
= np
.meshgrid(x
,y
)
# 將二維數組準換為一維數組
x
= x
.flatten()
y
= y
.flatten()# 通過莫比烏斯映射,把x,y轉化為
X,Y,Z
X = (1 + 0.5 * y
* np
.cos(x
/ 2.0)) * np
.cos(x
)
Y = (1 + 0.5 * y
* np
.cos(x
/ 2.0)) * np
.sin(x
)
Z = 0.5 * y
* np
.sin(x
/ 2.0)tri
= mtri
.Triangulation(x
, y
)ax1
.plot_trisurf(X, Y, Z, triangles
=tri
.triangles
, cmap
=cm
.coolwarm
)
ax1
.set_zlim(-0.5, 0.5)plt
.show()
(七)3d圖中繪制等高線
1、 在3d坐標軸對象下使用contour方法。
2、繪制填充的等高線,使用contourf方法。
3、zdir:選定投影方向。
offset:選定投影方向的投影位置。
#
****************** 3d圖中繪制等高線
******************
# 在
3d坐標軸對象下使用contour方法
# 繪制填充的等高線,使用contourf方法
from mpl_toolkits
.mplot3d
import axes3d # Axes3D寫作axes3d也可以
import matplotlib
.pyplot
as plt
from matplotlib
import cm
import numpy
as np
fig
= plt
.figure(figsize
=(16,16))# contour方法ax1
= fig
.add_subplot(2,1,1,projection
= "3d")
x
= np
.linspace(-5,5,1000)
y
= np
.linspace(-5,5,1000)
X,Y = np
.meshgrid(x
,y
) #
X和
Y需要是二維數組
Z = np
.sin(np
.sqrt(X**2+Y**2))surf
= ax1
.plot_surface(X, Y, Z,alpha
= 0.3)
ax1
.contour(X, Y, Z, zdir
='z', offset
=-1.5, cmap
=cm
.coolwarm
)
ax1
.contour(X, Y, Z, zdir
='x', offset
=-7, cmap
=cm
.coolwarm
)
ax1
.contour(X, Y, Z, zdir
='y', offset
=7, cmap
=cm
.coolwarm
)
"""
zdir
:選定投影方向
offset:選定投影方向的投影位置
"""
ax1
.set_xlabel('X')
ax1
.set_xlim(-7, 7)
ax1
.set_ylabel('Y')
ax1
.set_ylim(-7, 7)
ax1
.set_zlabel('Z')
ax1
.set_zlim(-1.5, 1.5)# contourf方法
ax2
= fig
.add_subplot(2,1,2,projection
= "3d")surf
= ax2
.plot_surface(X, Y, Z,alpha
= 0.3)
ax2
.contourf(X, Y, Z, zdir
='z', offset
=-1.5, cmap
=cm
.coolwarm
)
ax2
.contourf(X, Y, Z, zdir
='x', offset
=-7, cmap
=cm
.coolwarm
)
ax2
.contourf(X, Y, Z, zdir
='y', offset
=7, cmap
=cm
.coolwarm
)
"""
zdir
:選定投影方向
offset:選定投影方向的投影位置
"""
ax2
.set_xlabel('X')
ax2
.set_xlim(-7, 7)
ax2
.set_ylabel('Y')
ax2
.set_ylim(-7, 7)
ax2
.set_zlabel('Z')
ax2
.set_zlim(-1.5, 1.5)plt
.show()
contour方法圖形(等高線不填充):
contourf方法圖形(等高線填充):
(八)3d圖中繪制條形圖
1、 在3d坐標軸對象下使用bar方法。
2、 left:表示條形圖的橫軸
height:表示條形圖的縱軸
zdir:多組條形圖的排列方向,即哪個軸
zs:多組條形圖在排列方向上的位置
#
****************** 3d圖中繪制條形圖
******************
# 在
3d坐標軸對象下使用bar方法
from mpl_toolkits
.mplot3d
import axes3d
import matplotlib
.pyplot
as plt
import numpy
as npfig
= plt
.figure(figsize
=(16,16))
ax1
= fig
.add_subplot(2,1,1,projection
= "3d")
np
.random
.seed(10)
for color
,z
in zip(["r","g","b","k","y"],[0,10,20,30,40]):x
= np
.arange(10)y
= np
.abs(np
.random
.randn(10))ax1
.bar(left
= x
,height
= y
,zs
= z
,zdir
= "z",color
= color
)"""left
:表示條形圖的橫軸height:表示條形圖的縱軸zdir:多組條形圖的排列方向,即哪個軸zs:多組條形圖在排列方向上的位置
"""
# 由此可知沿y軸排列會較為美觀
ax2
= fig
.add_subplot(2,1,2,projection
= "3d")
for color
,z
in zip(["r","g","b","k","y"],[0,10,20,30,40]):x
= np
.arange(10)y
= np
.abs(np
.random
.randn(10))ax2
.bar(left
= x
,height
= y
,zs
= z
,zdir
= "y",color
= color
)"""left
:表示條形圖的橫軸height:表示條形圖的縱軸zdir:多組條形圖的排列方向,即哪個軸zs:多組條形圖在排列方向上的位置
"""
ax1
.set_xlabel("x",size
= 20)
ax2
.set_xlabel("x",size
= 20)
ax1
.set_ylabel("y",size
= 20)
ax2
.set_ylabel("y",size
= 20)
ax1
.set_zlabel("z",size
= 20)
ax2
.set_zlabel("z",size
= 20)plt
.show()
沿z軸排列圖形:
沿y軸排列圖形:(更為美觀)
by CyrusMay 2020 05 07
你是一種感覺
寫在夏夜晚風里面
——————五月天(瘋狂世界)——————
總結
以上是生活随笔為你收集整理的可视化篇(二)———使用matplotlib绘制常用3D图形及案例的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。