Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trim data outside 3d plot in matplotlib

I have a set of PDF that I need to plot for a certain section of the PDF domain. However, when I plot my lines on a 3d plot I get tails for each PDF,

enter image description here

Is there a clean way to not plot the tails that happen outside my plot limits? I know I can change the data to NaNs to achieve the same effect but I want to do this in matplotlib. Here is my current workaround code,

`# trim the data
y = np.ones(PDF_x.shape)*PDF_x
y[y>95]= np.nan
y[y<75]= np.nan


# plot the data
fig = plt.figure()
ax = fig.gca(projection='3d')
for i in range(PDF_capacity.shape[1]):
    ax.plot(life[i]*np.ones((PDF_x.shape)),y,PDF_capacity[:,i], label='parametric curve')

# set the axis limits
ax.set_ylim(75,95)

# add axis labels
ax.set_xlabel('charge cycles to failure point of 75% capacity')
ax.set_ylabel('capacity at 100 charge cycles')
ax.set_zlabel('probability')`

After trimming I can make the following plot,

enter image description here

like image 609
Austin Downey Avatar asked Oct 17 '22 12:10

Austin Downey


1 Answers

Masking the data with nan in the way you're doing it is a good and practical solution.

Since matplotlib 3D plots are projections into 2D space, it would be hard to implement automatic clipping. While I do think it would be possible, I'm not convinced that it's worth the effort. First, because you would need to treat different kinds of plots differently, second, because at least in some cases it would probably turn out that masking the data is still the best choice. Now, doing a complex subclassing of the plotting objects just to do the same thing that can be manually done in one or two lines is probably overkill.

My clear recommendation would therefore be to use the solution you already have. Especially since it does not seem to have any drawbacks so far.

like image 114
ImportanceOfBeingErnest Avatar answered Oct 20 '22 10:10

ImportanceOfBeingErnest