mplot3D fill_between延伸超过轴限制

时间:2016-04-20 07:44:06

标签: python matplotlib mplot3d

我有一些问题涉及使用mplot3D在Python中创建一个简单的线图,其中填充了图下的区域。我在RedHatEnterprise 7.2,matplotlib 1.2.0和numpy 1.7.2上使用Python 2.7.5。

使用下面的代码,我可以生成一个线图。这将按预期显示,绘图的开头/结尾由导入数据集的限制设置。

然后我尝试使用Bart从Plotting a series of 2D plots projected in 3D in a perspectival way给出的答案填充线图和-0.1之间的区域。然而,这是有效的,填充区域继续超出数据集的限制。从链接运行示例时也是如此。

此屏幕截图显示了填充区域超出设定轴限制而生成的图。 Generated plot with filled area extending beyond the set axis limits.

  1. 如何实现填充区域只是数据集的范围或轴限制哪个更小?
  2. 如何在图上添加这些图的图例?
  3. 代码如下:

    from numpy import *
    import matplotlib.pylab as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    x,y = genfromtxt("data.dat",unpack=True)
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    ax.add_collection3d(plt.fill_between(x,y,-0.1, color='orange', alpha=0.3,label="filled plot"),1, zdir='y')
    
    ax.plot(x,y,1,zdir="y",label="line plot")
    ax.legend()
    
    ax.set_xlim3d(852.353,852.359)
    ax.set_zlim3d(-0.1,5)
    ax.set_ylim3d(0,2)
    ax.get_xaxis().get_major_formatter().set_useOffset(False)
    
    plt.show()
    

1 个答案:

答案 0 :(得分:3)

我不知道如何让fill_between以您希望的方式工作,但我可以使用3D polygon提供替代方案:

from numpy import *
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection # New import

#x,y = genfromtxt("data.dat",unpack=True)
# Generated some random data
w = 3
x,y = np.arange(100), np.random.randint(0,100+w,100)
y = np.array([y[i-w:i+w].mean() for i in range(3,100+w)])
z = np.zeros(x.shape)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

#ax.add_collection3d(plt.fill_between(x,y,-0.1, color='orange', alpha=0.3,label="filled plot"),1, zdir='y')
verts = [(x[i],z[i],y[i]) for i in range(len(x))] + [(x.max(),0,0),(x.min(),0,0)]
ax.add_collection3d(Poly3DCollection([verts],color='orange')) # Add a polygon instead of fill_between

ax.plot(x,z,y,label="line plot")
ax.legend()
ax.set_ylim(-1,1)
plt.show()

上面的代码会生成一些随机数据。从中构建顶点并绘制具有这些顶点的多边形。这将为您提供您想要的情节(但不使用fill_between)。结果是:

Polygon 3D mimicking fill_between in matplotlib