Vertically fill 3d matplotlib plot

前端 未结 1 1628
盖世英雄少女心
盖世英雄少女心 2020-12-18 10:12

I have a 3d plot made using matplotlib. I now want to fill the vertical space between the drawn line and the x,y axis to highlight the height of the line on the z axis. On a

相关标签:
1条回答
  • 2020-12-18 10:37

    You're right. It seems that there is no equivalent in 3D plot for the 2D plot function fill_between. The solution I propose is to convert your data in 3D polygons. Here is the corresponding code:

    import math as mt
    import matplotlib.pyplot as pl
    import numpy as np
    import random as rd
    
    from mpl_toolkits.mplot3d import Axes3D
    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    
    
    # Parameter (reference height)
    h = 0.0
    
    # Code to generate the data
    n = 200
    alpha = 0.75 * mt.pi
    theta = [alpha + 2.0 * mt.pi * (float(k) / float(n)) for k in range(0, n + 1)]
    xs = [1.0 * mt.cos(k) for k in theta]
    ys = [1.0 * mt.sin(k) for k in theta]
    zs = [abs(k - alpha - mt.pi) * rd.random() for k in theta]
    
    # Code to convert data in 3D polygons
    v = []
    for k in range(0, len(xs) - 1):
        x = [xs[k], xs[k+1], xs[k+1], xs[k]]
        y = [ys[k], ys[k+1], ys[k+1], ys[k]]
        z = [zs[k], zs[k+1],       h,     h]
        #list is necessary in python 3/remove for python 2
        v.append(list(zip(x, y, z))) 
    poly3dCollection = Poly3DCollection(v)
    
    # Code to plot the 3D polygons
    fig = pl.figure()
    ax = Axes3D(fig)
    ax.add_collection3d(poly3dCollection)
    ax.set_xlim([min(xs), max(xs)])
    ax.set_ylim([min(ys), max(ys)])
    ax.set_zlim([min(zs), max(zs)])
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_zlabel("z")
    
    pl.show()
    

    It produces the following figure:

    I hope this will help you.

    0 讨论(0)
提交回复
热议问题