【问题标题】:Vertically fill 3d matplotlib plot垂直填充 3d matplotlib 图
【发布时间】:2020-08-11 05:58:24
【问题描述】:

我有一个使用 matplotlib 制作的 3d 图。我现在想填充绘制的线和 x,y 轴之间的垂直空间,以突出显示 z 轴上线的高度。在 2d 绘图上,这将使用 fill_between 完成,但 3d 绘图似乎没有任何类似的东西。有人可以帮忙吗?

这是我当前的代码

from stravalib import Client
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt

... code to get the data ....

mpl.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')
zi = alt
x = df['x'].tolist()
y = df['y'].tolist()
ax.plot(x, y, zi, label='line')
ax.legend()
plt.show()     

和当前的情节

为了清楚起见,我想要一个垂直填充到 x,y 轴交点而不是这个...

【问题讨论】:

    标签: python matplotlib plot 3d


    【解决方案1】:

    你是对的。 2D 绘图函数 fill_between 在 3D 绘图中似乎没有等效项。我建议的解决方案是将您的数据转换为 3D 多边形。下面是对应的代码:

    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()
    

    生成如下图:

    希望对你有所帮助。

    【讨论】:

    • 对于 python 3 你需要将 v.append(zip(x,y,z)) 更改为 v.append(list(zip(x,y,z)))
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2014-06-08
    • 2010-11-23
    相关资源
    最近更新 更多