|
From: hari j. <ha...@gm...> - 2012-10-17 22:07:08
|
Hi Sterling , Thanks for your email. I definitely think I was running into issues with the figure updating while it was trying to draw , constantly. I experimented with sleep ..but didnt try hard enough to get it to work. That said, I have a very nice solution to my problem using the wx.aui.AuiNotebook borrowed from example wx5 ( http://matplotlib.org/examples/user_interfaces/embedding_in_wx5.html) # MY SOLUTION I now have a single Plot wx.Panel which then encloses a wx.aui.Notebook just like in the wx5 example link above. Once I have finished processing the data . I initialize the plotter just like in the example above. I have a for loop that goes over all 384 data sets and then adds a page to the Notebook for every dataset. The result is a 384 , tabbed Notebook , where each tab is a fully interactive matplotlib plot , created like before. def do_my_plot(well_id, plotter_from_main): my_plotter = plotter_from_main # Here is where I add a page to the Notebook and get its current axis ax = plotter.add("figure %s" % well_id).gca() par1 = ax .twinx() par2 = ax.twinx() .............................................and -so on The neatest thing of the final Notebook is that , although it takes about a minute to appear at first call to frame.Show().. After that it is very performant. Importantly I can quickly scroll through all the 384 tabs ( or pages in the notebook) using CTRL-TAB to go forward and CTRL-Shift_TAB to go backward. This ability to navigate is a huge plus for me. The Navigation is actually very fast and "redraws" are nearly instantaneous. I will still try and get the "single figure that refreshed " approach as I originally wanted, using the techniques you , Ben and Damon suggested . In many cases I dont need to have a 384 tabbed frame..and can do with a plot that refreshes every few seconds so I know that everything went right. Thanks everyone for all your help..Ill get back to the group once I get the repaint within a single frame to work.. Hari On Wed, Oct 17, 2012 at 5:38 PM, Sterling Smith <sm...@fu...>wrote: > Hari, > > While I am not intimately acquainted with the inner working of the > interactive matplotlib functionality, I have seen that it tries to not > update the figure if you ask for some change to it while it is trying to > update the figure. That sounds circular, but oh well. > > Perhaps you could have each analysis open a new figure, and have an if > statement to close 5 (or 10...) figures ago. > > Another subtlety that I have noticed (and perhaps read somewhere) is that > there could be a difference in behavior between having interactivity set in > the matplotlibrc file and using the ion() call after having set > interactive: False in the matplotlibrc file. > > Another solution might be a time.sleep after each update of the figure. > > (Note that with ion(), the command for updating the figure is pylab.draw, > which may need to be issued after each case - the pylab/pyplot functions > usually have a draw_if_interactive call in them.) > > -Sterling > > PS If I am causing more confusion than help, please let me know. > > > On Oct 17, 2012, at 10:54AM, hari jayaram wrote: > > > Thanks Benjamin, Sterling and Damon for your prompt help > > > > However I am still not able to achieve what I wanted . > > > > I can get the headless script to work just great where it saves all the > figures and I can view them after the script is done running. > > > > But somehow when I try the figure number method that Sterling suggested > , along with the axis clear and redraw method (Damon) , or the decouple and > clear and then plot method (Benjamin Root) : I get the plot just spinning > with a blue circle on Windows 7 and the script just chugs merrily along. > > > > > > I think part of the problem was that I was wrong in the way I stated my > application. Each of the 384 data processing steps takes a few seconds..and > not a minute as I had indicated. I tried with both ion() and ioff() and > giving the figure a number , which stays constant and clearing the axis > everytime before plotting. But I get a spiining blue circle in Windows. > > > > I will try and cookup a test case , and send to the list , to reproduce > what I am seeing. it may still be that I am calling pylab , pyplot > incorrectly and hence not getting the continuously changing figure that > your suggestions should give me. > > > > hari > > > > > > > > > > Using plt.ion() or plt.ioff() causes a spinning blue-ball on > windows..while the rest of the script continues. > > If I use the figure number trick. I get the first figure displayed. > > > > On Tue, Oct 16, 2012 at 12:15 PM, Benjamin Root <ben...@ou...> wrote: > > > > > > On Tue, Oct 16, 2012 at 11:25 AM, hari jayaram <ha...@gm...> > wrote: > > Hi > > I am a relative newbie to matplotlib. > > > > I have a python script that handles a dataset that comprises 384 sets of > data. > > > > At the present moment , I read in a set of data - process it - and the > create a figure using code shown below. > > I am using windows with the default backend ( I think I set it to wx). > > > > When I run the program, figure after figure shows up..the program > continues from well to well plotting the figure. I can close the figure > window using the X on the right -hand side..while the program chugs along. > > > > Is there a way to just recycle the figure object , so that the plot > shows up for a brief second and refreshes when the next calculation is > complete. Each process_data function , takes a few minutes. > > > > Alternatively I just want to close the figure object I show after a > brief lag. I am OK if that happens instantaneously..but I dont know how to > achieve this. > > Do I have to use the matplotlib.Figure object to achieve this > functionality > > > > Thanks > > Hari > > > > > > > > Hari, > > > > To recycle the figure, try the following: > > > > > > > > import matplotlib.pyplot as plt > > > > def do_my_plot(par1, par2, well_id): > > processed_data_object = processed_dict[well_id] > > # Plot all the data > > par1.plot(processed_data_object.raw_x,processed_data_object.raw_y). > > par2.plot(.... > > # finally > > plt.show() > > # I tried fig.clf() > > > > > > def plot_and_process_data(): > > plt.ion() # Turn on interactive mode > > fig = plt.figure(figsize=(7,7) > > ax = fig.add_subplot(1,1,1) > > par1 =ax.twinx() > > par2 = ax.twinx() > > > > for well_id in list_of_384_well_ids: > > par1.cla() > > par2.cla() > > process_data(well_id) > > do_my_plot(par1, par2, well_id) > > > > Note, this is completely untested, but it would be how I would go about > it at first. The "plt.ion()" turns on interactive mode to allow your code > to continue running even after the plot window appears (but does not end > until the last window is closed.). Of course, another approach would > simply be to do "fig.savefig()" after every update to the figure and never > use show() and ion() (essentially, a non-interactive head-less script). > > > > Hopefully, this helps. > > Ben Root > > > > > > > ------------------------------------------------------------------------------ > > Everyone hates slow websites. So do we. > > Make your web apps faster with AppDynamics > > Download AppDynamics Lite for free today: > > > http://p.sf.net/sfu/appdyn_sfd2d_oct_______________________________________________ > > Matplotlib-users mailing list > > Mat...@li... > > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |