Ploting solid of revolution in Python 3 (matplotlib maybe)

后端 未结 2 1220
长发绾君心
长发绾君心 2020-12-18 07:24

Greetings the problem:

R is a region in the xy plane bounded by the parabola y=x^2+1 and line y=x+3. A solid of revolution is formed by rotating R around the x axi

2条回答
  •  悲&欢浪女
    2020-12-18 07:59

    Piggybacking on above, you can make these dynamic with widgets or gifs.

    Make a gif: Use the gif package:

    import gif
    
    @gif.frame
    def plot_volume(angle):
        fig = plt.figure(figsize = (20, 15))
    
        ax2 = fig.add_subplot(1, 1, 1, projection = '3d')
        angles = np.linspace(0, 360, 20)
        x = np.linspace(-1, 2, 60)
        v = np.linspace(0, 2*angle, 60)
    
        U, V = np.meshgrid(x, v)
        Y1 = (U**2 + 1)*np.cos(V)
        Z1 = (U**2 + 1)*np.sin(V)
        Y2 = (U + 3)*np.cos(V)
        Z2 = (U + 3)*np.sin(V)
        X = U
        ax2.plot_surface(X, Y1, Z1, alpha = 0.2, color = 'blue', rstride = 6, cstride = 6)
        ax2.plot_surface(X, Y2, Z2, alpha = 0.2, color = 'red', rstride = 6, cstride = 6)
        ax2.set_xlim(-3,3)
        ax2.set_ylim(-5,5)
        ax2.set_zlim(-5,5)
        ax2.view_init(elev = 50, azim = 30*angle)
        ax2.plot_wireframe(X, Y2, Z2)
        ax2.plot_wireframe(X, Y1, Z1, color = 'black')
        ax2._axis3don = False
    
    frames = []
    for i in np.linspace(0, 2*np.pi, 20):
        frame = plot_volume(i)
        frames.append(frame)
    
    gif.save(frames, 'images/vol1.gif', duration = 500)
    
    from IPython.display import Image
    
    Image('images/vol1.gif')
    

    Make Interactive: Use ipywidgets.

    def three_d_plotter(angle, rotate, turn):
        fig = plt.figure(figsize = (13, 6))
        ax = fig.add_subplot(1, 1, 1, projection='3d')
    
        u = np.linspace(-1, 2, 60)
        v = np.linspace(0, angle, 60)
        U, V = np.meshgrid(u, v)
    
        X = U
        Y1 = (U**2 + 1)*np.cos(V)
        Z1 = (U**2 + 1)*np.sin(V)
    
        Y2 = (U + 3)*np.cos(V)
        Z2 = (U + 3)*np.sin(V)
    
        ax.plot_surface(X, Y1, Z1, alpha=0.3, color='red', rstride=6, cstride=12)
        ax.plot_surface(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)
        ax.plot_wireframe(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)
        ax._axis3don = False
        ax.view_init(elev = rotate, azim = turn)
    
        plt.show()
    
    from ipywidgets import interact
    import ipywidgets as widgets
    
    interact(three_d_plotter, angle = widgets.FloatSlider(0, min = 0, max = 2*np.pi, step = np.pi/10),
            rotate = widgets.FloatSlider(0, min = 0, max = 360, step = 5),
             turn = widgets.FloatSlider(0, min = 0, max = 500, step = 5))
    

提交回复
热议问题