I am a matplotlib noob, but I have searched the documentation, lists etc and cannot find a simple way to stop a curve being drawn once it crosses another curve. In the attached example, I am trying to draw the solid curve only until it intersects the dashed one. I have tried using the numpy.where() method, but it does not seem to be the right way to go about it- I end up having to write FOR loops and so on, and that does not make use of the vectorization advantages of numpy. Seems like there ought to be a simple way to do this. Gordon mport numpy as np import matplotlib.pyplot as plt def ig_CRM(vg,V,L,Ts): return ((Ts*vg/(2*L))*(1-(vg/V))) def ig_CCM(vg,V,L,Ts,d): return (Ts*vg*d**2/(2*L))/(1-vg/V) L= 110*10**-6 Ts= 10**-5 V= 400 vg= np.arange(0.0,400.0,1.0) ig_bdry= ig_CRM(vg,V,L,Ts) plt.plot(vg,ig_bdry,'--') ig_d2=ig_CCM(vg,V,L,Ts,0.2) plt.plot(vg,ig_d2) plt.axis([0, 400, 0, 20]) plt.show()
Gordon Hardmant : > I ...cannot find a simple way to stop a curve being drawn once it crosses > another curve. In the attached example, I am trying to draw the solid > curve only until it intersects the dashed one. I have tried using the > numpy.where() method, but it does not seem to be the right way to go > about it- I end up having to write FOR loops and so on, and that does > not make use of the vectorization advantages of numpy. Try to insert just before plot(...) the following two lines: igc=np.sign(ig_bdry-ig_d2) ig_d2[igc!=igc[1] ]=np.nan This [1] is a place which discriminates where the difference sign is "good". Of course this will produce some bedlam if there are many intersections. You didn't say whether you want to plot the dashed curve entirely. If not, just truncate all three, the solid, the dashed and the abscissa, where the sign is OK. Good luck. Jerzy Karczmarczuk Caen, France
> From: Jerzy Karczmarczuk [mailto:jer...@un...] > Sent: Sunday, May 27, 2012 12:56 > > Gordon Hardmant : > > I ...cannot find a simple way to stop a curve being drawn once it crosses > > another curve. In the attached example, I am trying to draw the solid > > curve only until it intersects the dashed one. I have tried using the > > numpy.where() method, but it does not seem to be the right way to go > > about it- I end up having to write FOR loops and so on, and that does > > not make use of the vectorization advantages of numpy. > Try to insert just before plot(...) the following two lines: > > igc=np.sign(ig_bdry-ig_d2) > ig_d2[igc!=igc[1] ]=np.nan Or, if you want to preserve the original data, index it with a boolean array: under = (ig_d2 <= ig_bdry) plt.plot(vg[under], ig_d2[under]) If you need to determine the intersection more precisely, you could define a function of vg, V, L, Ts, and d that returns the difference between ig_CRM and ig_CCM for those parameters, then use a root-finding routine [1] to numerically find the vg for which that function returns essentially zero. [1] http://docs.scipy.org/doc/scipy/reference/optimize.html#root-finding