代码之家  ›  专栏  ›  技术社区  ›  niko

另一种颜色的形状内部

  •  4
  • niko  · 技术社区  · 6 年前

    考虑 曳物线的回转面 通过以下代码获得(仅以下蓝色形状)

        from mpl_toolkits.mplot3d import Axes3D
        import matplotlib.pyplot as plt
        import numpy as np
    
        '''
        ==========================================
        Ploting S^n_1
        '''
    
        fig = plt.figure(figsize=plt.figaspect(1))  
        ax = fig.add_subplot(111, projection='3d')
    
        r=1
        u=np.linspace(-2,2,200)
        v=np.linspace(0,2*np.pi,60)
        [u,v]=np.meshgrid(u,v)
    
        a = 1
        b = 1
        c = 1
    
        x = a*np.cosh(u)*np.cos(v)
        y = b*np.cosh(u)*np.sin(v)
        z = c*np.sinh(u)
    
        ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='#428bca')
        ax.set_axis_off()
        plt.show()
    

    enter image description here

    我发现要找出形状的内部和外部之间的区别并不是那么容易。因此,我想换一种颜色的内饰。有什么办法可以做到吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   swatchai    6 年前

    因为Matplotlib3D不能进行很多真实的3D操作。这里使用简单的技巧。表面被分成两部分,用不同的颜色绘制。最后,仔细设置视角来渲染图像。

    以下是工作代码(基于您的代码):

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure(figsize=plt.figaspect(1))
    fig.set_size_inches([8,8])
    ax = fig.add_subplot(111, projection='3d')
    
    #r=1
    
    # values for extents of meshes
    begp = 0.25
    endp = 1+begp
    extp = endp+1
    
    u = np.linspace(-2, 2, 200)
    #v = np.linspace(0, 2*np.pi, 60)
    v = np.linspace(begp*np.pi, endp*np.pi, 30)
    [u,v] = np.meshgrid(u,v)
    
    u2 = np.linspace(-2, 2, 200)
    v2 = np.linspace(endp*np.pi, extp*np.pi, 30)
    [uu2, vv2] = np.meshgrid(u2, v2)
    
    a = 1
    b = 1
    c = 1
    
    # surface 1
    x = a*np.cosh(u)*np.cos(v)
    y = b*np.cosh(u)*np.sin(v)
    z = c*np.sinh(u)
    
    # surface 2
    x2 = a*np.cosh(uu2)*np.cos(vv2)
    y2 = b*np.cosh(uu2)*np.sin(vv2)
    z2 = c*np.sinh(uu2)
    
    # plot surface 1 in red / surface 2 in blue
    ax.plot_surface(x, y, z, rstride=4, cstride=4, color='red', edgecolor='gray')
    ax.plot_surface(x2, y2, z2, rstride=4, cstride=4, color='blue', edgecolor='lightgray')
    
    # set viewing angle + perspactive to get best image
    ax.azim = 313   # z rotation (default=270)
    ax.elev = 16    # x rotation (default=0)
    ax.dist = 8    # zoom (define perspective)
    ax.set_axis_off()
    plt.show()
    

    生成的图像:

    enter image description here

        2
  •  3
  •   niko    6 年前

    应用@guimoute的建议,我想出了一些更容易阅读的东西。这是上面代码中唯一修改过的一行

    ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='#428bca', edgecolor='#003366')
    

    我在那里添加了论点 edgecolor 为了在网格和形状面之间有更多的对比。结果是:(我还把双曲线的蓝色/绿色改为红色)

    enter image description here

    聚苯乙烯

    我还不接受这一点作为回答,以防有人提出问题。