美文网首页
【matploblib教程】一文带你码遍各种类型三维图

【matploblib教程】一文带你码遍各种类型三维图

作者: _我是_ | 来源:发表于2020-03-29 11:16 被阅读0次

    相信许多使用过python的小伙伴都知道matplotlib是个强大的数据可视化工具,但是大部分小伙伴都只用其绘制平面图形,本系列将会教大家如何利用matplotlib来绘制3D图像
    @[toc]

    一、简介

    相较于之前的版本,最新版的matplotlib只需要通过将关键字参数projection="3d" 传递给来创建(Axes3D类的)Figure.add_subplot即可创建创建3维画布,其具体使用同2D相差无几:

    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    

    在Matplotlib 1.0.0之前,Axes3D需要先实例化 。

    from mpl_toolkits.mplot3d import Axes3D
    ax = Axes3D(fig)
    

    而Matplotlib在版本3.2.0中进行了更改:在Matplotlib 3.2.0之前,需要显式导入 mpl_toolkits.mplot3d模块,才能将“ 3d”参数传进 Figure.add_subplot。下面我们就来绘制各种图像:

    二、图像

    1、线图

    函数点击可以查看该函数源码

    Axes3D.plot(self,xs,ys,* args,zdir ='z',** kwargs )
    
    参数
    xs 数据点的x坐标
    ys 数据点的y坐标
    zs 数据点的z坐标
    zdir {'x','y','z'}绘制2D数据时,用作z的方向(“ x”,“ y”或“ z”);默认为“ z”。
    **kwargs 其他

    代码

    import matplotlib.pyplot as plt
    import numpy as np
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    t = np.linspace(0, 20, 100)
    x = np.sin(t)
    y = np.cos(t)
    
    plt.plot(x, y, t)
    plt.show()
    

    效果图

    线图

    2、散点图

    函数点击可以查看该函数源码

    Axes3D.scatter(self,xs,ys,zs = 0,zdir ='z',s = 20,c = None,depthshade = True,* args,** kwargs )
    
    参数
    xs,ys 数据点阵列的位置
    zs float类型或类似数组的参数,可选,默认值:0。表示 Z位置。长度与xs和 ys相同的数组,或者是将所有点放置在同一平面上的单个值。
    zdir {'x','y','z','-x','-y','-z'},可选,默认值:'z'。zs的轴方向。在3D上绘制2D数据时,这很有用。数据必须作为xs,ys传递。然后将zdir设置 为“ y”,将数据绘制到xz平面上。
    s 标量或阵列状,可选的,默认值:20。标记大小(以磅为单位)** 2。长度与xs和ys相同的数组或单个值可使所有标记的大小相同。
    c 颜色,序列或颜色序列,可选
    depthshade bool,可选,默认值:True。是否为散射标记着色以提供深度外观。每次调用scatter()都会独立执行深度着色。

    代码

    import matplotlib.pyplot as plt
    import numpy as np
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    x = np.random.randint(0, 10, size=50)
    y = np.random.randint(0, 10, size=50)
    z = np.random.randint(0, 10, size=50)
    # 颜色
    c = np.random.randint(0, 20, 50)
    # 大小
    s = np.abs(np.random.randn(50) * 80)
    plt.scatter(x, y, zs=z, s=s, c=c)
    plt.show()
    

    效果图:

    散点图

    3、线框图

    函数点击可以查看该函数源码

    Axes3D.plot_wireframe(self,X,Y,Z,* args,** kwargs )
    
    参数
    x,y,z 数据
    rcount,ccount int类型。每个方向上使用的最大样本数。如果输入数据较大,则会将其下采样(通过切片)到这些点数。将计数设置为零会导致不在相应方向上对数据进行采样,从而生成3D线图而不是线框图。默认为50。
    rstride,cstride int类型。下采样在每个方向上都迈出大步。这些参数与rcount和ccount互斥。如果仅将 rstride或cstride中的一个设置,则其他默认设置为1。将stride设置为零会导致不在相应方向上采样数据,从而生成3D线图而不是线框图。

    代码

    import matplotlib.pyplot as plt
    import numpy as np
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    x, y = np.mgrid[-1:1:10j, -1:1:10j]
    z = x * np.exp(-x ** 2 - y ** 2)
    ax.plot_wireframe(x, y, z)
    plt.show()
    

    效果

    线框图

    4、表面图

    函数点击可以查看该函数源码

    Axes3D.plot_surface(self,X,Y,Z,* args,norm = None,vmin = None,vmax = None,lightsource = None,** kwargs )
    
    参数
    xyz 数组
    rcount,ccount int类型。每个方向上使用的最大样本数。如果输入数据较大,则会将其下采样(通过切片)到这些点数。默认为50。
    rstride,cstride int类型。下采样在每个方向上都迈出大步。这些参数与rcount和ccount互斥。如果仅设置rstride或cstride中的一个 ,则其他默认值为10。“经典”模式使用默认值而不是新的默认值。rstride = cstride = 10rcount = ccount = 50
    color 表面补丁的颜色
    cmap 表面补丁的颜色图
    facecolors 每个补丁的颜色
    norm 归一化。色彩图的标准化
    vmin, vmax 浮动标准化的界限
    shade 布尔类型是否着色。默认为True。cmap指定时,始终禁用阴影。
    lightsource 当shadeTrue 时使用的光源

    代码

    import matplotlib.pyplot as plt
    import numpy as np
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='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)
    
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')
    plt.show()
    

    效果

    表面图

    5、三角网格图

    该示例官方文档里面有提供与下方示例有细微差别

    函数点击可以查看该函数源码

    Axes3D.plot_trisurf(self,* args,color = None,norm = None,vmin = None,vmax = None,lightsource = None,** kwargs )
    
    参数
    X, Y, Z 数组
    color 表面补丁的颜色
    cmap 表面补丁的颜色图
    norm 一个Normalize实例,用于将值映射到颜色。
    vmin, vmax 标量,可选,默认值:无要映射的最小值和最大值。
    shade 是否着色。默认为True。指定cmap时,始终禁用阴影。
    lightsource 阴影为True 时使用的光源

    代码

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.tri as mtri
    
    
    fig = plt.figure()
    
    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()
    
    # triple
    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)
    
    # Plot the surface.  The triangles in parameter space determine 
    ax = fig.add_subplot(1, 1, 1, projection='3d')
    ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap=plt.cm.Spectral)
    ax.set_zlim(-1, 1)
    

    效果

    莫比乌斯带

    6、等高线图

    函数点击可以查看该函数源码

    Axes3D.contour(self,X,Y,Z,* args,extend3d = False,stride = 5,zdir ='z',offset = None,** kwargs )
    
    参数
    XYZ 输入数组
    extend3d 布尔类型。是否以3D延伸轮廓;默认为False
    stride 延伸轮廓的步长
    zdir {'x','y','z'}。基准轴;默认为“ z”
    offset 标量。如果指定,则在垂直于zdir的平面上的此位置绘制轮廓线的投影

    代码

    import matplotlib.pyplot as plt
    import numpy as np
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='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)
    
    ax.contour(X, Y, Z)
    plt.show()
    

    效果

    等高线

    7、填充等高线图

    函数点击可以查看该函数源码

    Axes3D.contourf(self,X,Y,Z,* args,zdir ='z',offset = None,** kwargs )
    
    参数
    X,Y,Z 输入数据
    zdir {'x','y','z'}。使用说明;默认为“ z”。
    offset 标量。如果指定,则在垂直于zdir的平面上的此位置绘制轮廓线的投影

    代码:

    import matplotlib.pyplot as plt
    import numpy as np
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='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)
    
    ax.contourf(X, Y, Z)
    plt.show()
    

    效果:

    填充等高线

    未完待续……


    \color{#2d7dcd}{如果觉得ok}\color{#FFDEAD}{点个赞}\color{#FFDEAD}{点个关注}\color{#2d7dcd}{也欢迎给个} \color{#FFDEAD}{打赏} \color{#2d7dcd}{支持一下编者的工作}

    相关文章

      网友评论

          本文标题:【matploblib教程】一文带你码遍各种类型三维图

          本文链接:https://www.haomeiwen.com/subject/dupyuhtx.html