• 技术文章 >头条

    超好看的3D绘图方式,Python厉害了!

     Ly Ly2020-06-11 16:57:20转载6565

    【01x01】Axes3D 对象创建方法一:Axes3D(fig)

    在 Matplotlib 1.0.0 版本中,绘制 3D 图需要先导入 Axes3D 包,获取 figure 画布对象 fig 后,通过 Axes3D(fig) 方法来创建 Axes3D 对象,具体方法如下:

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    # 获取 figure 画布并创建 Axes3D 对象
    fig = plt.figure()
    ax = Axes3D(fig)
    # 数据坐标
    z = np.linspace(0, 15, 1000)
    x = np.sin(z)
    y = np.cos(z)
    # 绘制线性图
    ax.plot(x, y, z)
    plt.show()

    【01x02】Axes3D 对象创建方法二:add_subplot

    在 Matplotlib 3.2.0 版本中,绘制 3D 图可以通过创建子图,然后指定 projection 参数 为 3d 即可,返回的 ax 为 Axes3D 对象,以下两种方法均可:

    import numpy as np
    import matplotlib.pyplot as plt
    # 获取 figure 画布并通过子图创建 Axes3D 对象
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    # 数据坐标
    z = np.linspace(0, 15, 1000)
    x = np.sin(z)
    y = np.cos(z)
    # 绘制线性图
    ax.plot(x, y, z)
    plt.show()
    import numpy as np
    import matplotlib.pyplot as plt
    # 通过子图创建 Axes3D 对象
    ax = plt.subplot(111, projection='3d')
    # 数据坐标
    z = np.linspace(0, 15, 1000)
    x = np.sin(z)
    y = np.cos(z)
    # 绘制线性图
    ax.plot(x, y, z)
    plt.show()

    【01x03】Axes3D 对象创建方法三:gca

    除了以上两种方法以外,还可以先获取画布对象 fig,再通过 fig.gca() 方法获取当前绘图区(gca = Get Current Axes),然后指定 projection 参数 为 3d 即可,返回的 ax 为 Axes3D 对象。

    import numpy as np
    import matplotlib.pyplot as plt
    # 依次获取画布和绘图区并创建 Axes3D 对象
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    # 数据坐标
    z = np.linspace(0, 15, 1000)
    x = np.sin(z)
    y = np.cos(z)
    # 绘制线性图
    ax.plot(x, y, z)
    plt.show()

    以上三种方法运行结果均为下图:

    p3.jpg

    【02x00】cmap 与 colorbar

    默认情况下,散点图、线性图、曲面图等将以纯色着色,但可以通过提供 cmap 参数支持颜色映射。cmap 参数用于设置一些特殊的颜色组合,如渐变色等。

    如果使用了 cmap 参数,则可以使用 pyplot.colorbar() 函数来绘制一个色条,即颜色对照条。

    基本语法:matplotlib.pyplot.colorbar([mappable=None, cax=None, ax=None, **kw])

    部分参数解释如下表,其他参数,如长度,宽度等请参考官方文档。

    参数 描述
    mappable 要设置色条的图像对象,该参数对于 Figure.colorbar 方法是必需的,但对于 pyplot.colorbar 函数是可选的
    cax 可选项,要绘制色条的轴
    ax可选项,设置色条的显示位置,通常在一个画布上有多个子图时使用
    **kw 可选项,其他关键字参数,参考官方文档

    【03x00】3D 线性图:Axes3D.plot

    基本方法:Axes3D.plot(xs, ys[, zs, zdir='z', *args, **kwargs])

    参数 描述
    xs 一维数组,点的 x 轴坐标
    ys 一维数组,点的 y 轴坐标
    zs一维数组,可选项,点的 z 轴坐标
    zdir

    可选项,在 3D 轴上绘制 2D 数据时,数据必须以 xs,ys 的形式传递

    ,若此时将 zdir 设置为 ‘y’,数据将会被绘制到 x-z 轴平面上,默认为 ‘z’

    **kwargs
    其他关键字参数,可选项,可参见 matplotlib.axes.Axes.plot
    import numpy as np
    import matplotlib.pyplot as plt
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 依次获取画布和绘图区并创建 Axes3D 对象
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    # 第一条3D线性图数据
    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线性图数据
    z2 = np.linspace(-3, 3, 100)
    x2 = np.sin(z2)
    y2 = np.cos(z2)
    # 绘制3D线性图
    ax.plot(x1, y1, z1, color='b', label='3D 线性图一')
    ax.plot(x2, y2, z2, color='r', label='3D 线性图二')
    # 设置标题、轴标签、图例,也可以直接使用 plt.title、plt.xlabel、plt.legend...
    ax.set_title('绘制 3D 线性图示例', pad=15, fontsize='12')
    ax.set_xlabel('x 轴', color='r', fontsize='12')
    ax.set_ylabel('y 轴', color='g', fontsize='12')
    ax.set_zlabel('z 轴', color='b', fontsize='12')
    ax.legend()
    plt.show()

    p2.jpg

    【04x00】3D 散点图:Axes3D.scatter

    基本方法:Axes3D.scatter(xs, ys[, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs])

    参数 描述
    xs一维数组,点的 x 轴坐标
    ys一维数组,点的 y 轴坐标
    zs 一维数组,可选项,点的 z 轴坐标
    zdir

    可选项,在 3D 轴上绘制 2D 数据时,数据必须以 xs,ys 的形式传递

    若此时将 zdir 设置为 ‘y’,数据将会被绘制到 x-z 轴平面上,默认为 ‘z’,

    s 标量或数组类型,可选项,标记的大小,默认 20
    c

    标记的颜色,可选项,可以是单个颜色或者一个颜色列表

    支持英文颜色名称及其简写、十六进制颜色码等,更多颜色示例参见官网 Color Demo

    depthshadebool 值,可选项,默认 True,是否为散点标记着色以提供深度外观
    **kwargs 其他关键字参数,可选项,可参见 scatter
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 依次获取画布和绘图区并创建 Axes3D 对象
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    n = 100
    def randrange(n, vmin, vmax):
        return (vmax - vmin)*np.random.rand(n) + vmin
    '''
    定义绘制 n 个随机点,设置每一组数据点的样式和范围
    x轴数据位于[23,32]区间,y轴数据位于[0,100]区间,z轴数据位于[zlow,zhigh]区间
    '''
    for m, zlow, zhigh in [('o', -50, -25), ('^', -30, -5)]:
        xs = randrange(n, 23, 32)
        ys = randrange(n, 0, 100)
        zs = randrange(n, zlow, zhigh)
        ax.scatter(xs, ys, zs, marker=m)
    # 设置标题、轴标签、图例,也可以直接使用 plt.title、plt.xlabel...
    ax.set_title('绘制 3D 散点图示例', pad=15, fontsize='12')
    ax.set_xlabel('x 轴', color='b')
    ax.set_ylabel('y 轴', color='b')
    ax.set_zlabel('z 轴', color='b')
    plt.show()

    p1.jpg

    【05x00】3D 线框图:Axes3D.plot_wireframe

    基本方法:Axes3D.plot_wireframe(X, Y, Z[, *args, **kwargs])

    参数 描述
    X二维数组,x 轴数据
    Y 二维数组,y 轴数据
    Z 二维数组,z 轴数据
    **kwargs 其他关键字参数,可选项,如线条样式颜色等,可参见 Line3DCollection
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 获取 figure 画布并通过子图创建 Axes3D 对象
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    # 定义Z轴坐标的生成方法
    def f(m, n):
        return np.sin(np.sqrt(m ** 2 + n ** 2))
    # 设置3D线框图数据
    x = np.linspace(-6, 6, 30)
    y = np.linspace(-6, 6, 30)
    # 生成网格点坐标矩阵,该方法在系列文章八中有具体介绍
    X, Y = np.meshgrid(x, y)
    Z = f(X, Y)
    # 绘制3D线框图
    ax.plot_wireframe(X, Y, Z, color='c')
    # 设置标题、轴标签、图例,也可以直接使用 plt.title、plt.xlabel...
    ax.set_title('绘制 3D 线框图示例', pad=15, fontsize='12')
    ax.set_xlabel('x 轴')
    ax.set_ylabel('y 轴')
    ax.set_zlabel('z 轴')
    plt.show()

    p1.jpg

    专题推荐:python
    上一篇:曾经迷恋的坦克大战,自己动手试试吧! 下一篇:Python中的垃圾回收机制!惊艳了!

    相关文章推荐

    • python怎么表示范围• python有少儿编程吗• python如何爬取网页数据• python如何开始编辑

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网