可视化篇(二)———使用matplotlib绘制常用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 np
fig = 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
你是一种感觉
写在夏夜晚风里面
——————五月天(疯狂世界)——————