Bootstrap

可视化篇(二)———使用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) # XY需要是二维数组
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) # XY需要是二维数组
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) # XY需要是二维数组
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

你是一种感觉
写在夏夜晚风里面
——————五月天(疯狂世界)——————

;