Hi Gökhan, Hi list, On Tuesday 21 April 2009 19:44:18 Gökhan SEVER wrote: > Hi Matthias, > > Thanks for your reply again. Unfortunately I can't read x_new or y_new > after I kill the figures (nor when they are active). I don't know what > exactly wrong in my configuration or IPython. I use IPython 0.10.bzr.r1163 > on Fedora 10. With "kill" you mean just closing the figures with button "X", isn't it?
What about adding the line print x_new, y_new after the show() in your rect.py-script? Does this give some output in ipython or if you run the script using "python rect.py" ? best regards Matthias > Hopefully, I will solve the masked array riddle by reading more (although > haven't seen a specific example similar to my question on the numpy > reference pages), if not getting some insight from a numpy expert or like > you said from an expert on masked arrays :) > > Have a good Tuesday to all. > > Gökhan > > > On Tue, Apr 21, 2009 at 3:21 AM, Matthias Michler > > <matthiasmich...@gmx.net>wrote: > > Hi Gökhan, > > Hi list, > > Hi experts on masked arrays, > > > > I run the attached script (copied from your last two emails) and I can > > use x_new, y_new after closing the figures (where x_new and y_new are the > > values > > selected in the last selection). > > > > I don't know, what is going wrong with your script on your system. > > > > ### my output ########################## > > In [1]: run rect.py > > startposition : (0.276210, 0.592969) > > endposition : (0.542339, 0.309375) > > used button : 1 > > startposition : (0.745968, 0.747656) > > endposition : (0.745968, 0.747656) > > used button : 1 > > startposition : (0.645161, 0.761719) > > endposition : (0.806452, 0.609375) > > used button : 3 > > startposition : (0.808468, 0.607031) > > endposition : (0.808468, 0.604688) > > used button : 3 > > startposition : (0.086694, 0.166406) > > endposition : (0.137097, 0.070313) > > used button : 1 > > startposition : (0.921371, 0.850781) > > endposition : (0.987903, 0.728906) > > used button : 1 > > > > In [2]: x_new > > Out[2]: > > array([ 0.92929293, 0.93939394, 0.94949495, 0.95959596, 0.96969697, > > 0.97979798]) > > > > In [3]: y_new > > Out[3]: > > array([ 0.80119703, 0.8072005 , 0.81312162, 0.81895978, 0.82471437, > > 0.83038482]) > > > > In [4]: > > ############# > > > > Please see my comments below. > > > > On Monday 20 April 2009 23:16:37 Gökhan SEVER wrote: > > > Thanks for elegant trick Matthias. > > > > > > I have modified onselect function following your suggestions, and it is > > > working as I wanted it to be. Select a portion and get a zoomed view in > > > a new figure. > > > > > > def onselect(eclick, erelease): > > > # eclick and erelease are matplotlib events at press and release > > > global x_new > > > global y_new > > > print ' startposition : (%f, %f)' % (eclick.xdata, eclick.ydata) > > > print ' endposition : (%f, %f)' % (erelease.xdata, > > > erelease.ydata) print ' used button : ', eclick.button > > > xmin = min(eclick.xdata, erelease.xdata) > > > xmax = max(eclick.xdata, erelease.xdata) > > > ymin = min(eclick.ydata, erelease.ydata) > > > ymax = max(eclick.ydata, erelease.ydata) > > > indices = (x >= xmin) & (x <= xmax) & (y >= ymin) & (y <= ymax) > > > x_new = x[indices] > > > y_new = y[indices] > > > fig_new = figure() > > > plot(x_new, y_new) > > > fig_new.show() > > > > > > There is still a minute point, that I would like mention again. Even > > > > though > > > > > I used global style variables I can't still see them when I quit the > > > program. > > > > > > What I do is run the file within IPython by run command. In my case the > > > file is 'rect.py.' and I do run rect.py. When I quit and do whos > > > querry, > > > > I > > > > > can't see global x_new nor y_new at the resulting lines: > > > > > > In [13]: whos > > > Variable Type Data/Info > > > -------------------------------------------- > > > RectangleSelector classobj matplotlib.widgets.RectangleSelector > > > ax AxesSubplot Axes(0.125,0.1;0.775x0.8) > > > fig function <function figure at 0xa752c6c> > > > onselect function <function onselect at 0xac0ec34> > > > toggle_selector function <function toggle_selector at > > > > 0xac0ef0c> > > > > > x ndarray 100: 100 elems, type `float64`, 800 > > > bytes y ndarray 100: 100 elems, type > > > `float64`, 800 bytes > > > > > > > > > For the masking, I was planning to use a masking scheme as given below. > > > > Let > > > > > say I have an array which "a" > > > > > > In [14]: a = arange(5) > > > > > > In [15]: a > > > Out[15]: array([0, 1, 2, 3, 4]) > > > > > > and my secondary array is "b" > > > > > > In [16]: b = array([2,3]) > > > > > > What I want to do is to mask a with b values and get an array of: > > > > > > [array([False, False, True, True, False], dtype=bool)] > > > > > > That is just an manually created array. I still don't know how to do > > > this programmatically in Pythonic fashion. > > > > As I mentioned before I'm not familiar with numpys masked arrays. In this > > list > > I read several comments on them, but I never used them. But I think they > > are > > what you are after. Maybe someone else can give you a hint or you try > > numpys > > online documentation. > > All I could provide is again a little manually work using a for-loop. So > > something like > > > > mask = zeros(len(a), dtype=bool) > > for index in xrange(len(a)): # run through array a > > if a[index] in b: > > mask[index] = True > > print mask # gives array([False, False, True, True, False], > > dtype=bool) > > > > Furthermore I'm not a Python expert and therefore I'm not the guy to ask > > for > > programing in "Pythonic fashion". Maybe some else can give a comment? > > > > best regards Matthias > > > > > Again thanks for your help. > > > > > > Gökhan > > > > > > > > > On Mon, Apr 20, 2009 at 4:09 AM, Matthias Michler > > > > > > <matthiasmich...@gmx.net>wrote: > > > > Hi Gökhan, > > > > > > > > On Friday 17 April 2009 20:21:00 Gökhan SEVER wrote: > > > > > Thanks for the pointer Matthias, > > > > > > > > > > That is exactly what I have been looking for. > > > > > > > > > > I use the code from the RectangleSelector class help with your > > > > > suggested code. I know that I have to update y-axis accordingly to > > > > > x values such > > > > > > > > that > > > > > > > > > their positions and sizes must much so that I can plot them in a > > > > > new > > > > > > > > plot. > > > > > > > > > And I know that the answer lies in a mask; I have to create a mask > > > > from > > > > > > > x_new and apply it to y. Do you have any hint on this? > > > > > > > > Unfortunately I'm not familiar with numpy masks, but what I would do > > > > is: > > > > xmin = min(eclick.xdata, erelease.xdata) > > > > xmax = max(eclick.xdata, erelease.xdata) > > > > ymin = min(eclick.ydata, erelease.ydata) > > > > ymax = max(eclick.ydata, erelease.ydata) > > > > # indices inside x-range > > > > indices = (x>= xmin) & (x <= xmax) > > > > # OR: indices for data inside the selected rectangle > > > > #indices = (x>= xmin) & (x <= xmax) & (y>=ymin) & (y<=ymax) > > > > xnew = x[indices] > > > > ynew = y[indices] > > > > > > > > > Another point is do you have any idea how to save values from > > > > > inside onselect action? > > > > > > > > What do you mean by saving? > > > > Saving to disk? > > > > # for ascii format I use: > > > > from scipy.io import write_array > > > > > > > > # for numpy arrays you can use > > > > import numpy as np > > > > a = np.arange(10) > > > > a.tofile # Write array to a file as text or binary. > > > > > > > > and I think there is also some Matplotlib function for this. In the > > > > module matplotlib.mlab, which also allows reading different types of > > > > formatted data. > > > > > > > > If you think of saving inside the program. You need a global variable > > > > (statement "global x" at the beginning of onselect) otherwise all > > > > variables are deleted at the end of each onselect call. > > > > > > > > > For some reason my ipython session doesn't remember values after I > > > > run > > > > > > the > > > > > > > > > given script: > > > > > > > > see three lines above, please. > > > > > > > > best regards Matthias > > > > > > > > > from matplotlib.widgets import RectangleSelector > > > > > from pylab import * > > > > > > > > > > def onselect(eclick, erelease): > > > > > # eclick and erelease are matplotlib events at press and release > > > > > print ' startposition : (%f, %f)' % (eclick.xdata, > > > > > eclick.ydata) print ' endposition : (%f, %f)' % (erelease.xdata, > > > > > erelease.ydata) print ' used button : ', eclick.button > > > > > xmin = min(eclick.xdata, erelease.xdata) > > > > > xmax = max(eclick.xdata, erelease.xdata) > > > > > ymin = min(eclick.ydata, erelease.ydata) > > > > > ymax = max(eclick.ydata, erelease.ydata) > > > > > x_new = x[(x>= xmin) & (x <= xmax)] > > > > > #mask = [x == x_new[i] for i in range(len(x_new))] > > > > > #print mask > > > > > #print len(x_new) > > > > > #print len(y_new) > > > > > #fig_new = figure() > > > > > #plot(x_new, y_new) > > > > > #fig_new.show() > > > > > > > > > > def toggle_selector(event): > > > > > print ' Key pressed.' > > > > > if event.key in ['Q', 'q'] and toggle_selector.RS.active: > > > > > print ' RectangleSelector deactivated.' > > > > > toggle_selector.RS.set_active(False) > > > > > if event.key in ['A', 'a'] and not toggle_selector.RS.active: > > > > > print ' RectangleSelector activated.' > > > > > toggle_selector.RS.set_active(True) > > > > > > > > > > x = arange(100)/(99.0) > > > > > y = sin(x) > > > > > fig = figure > > > > > ax = subplot(111) > > > > > ax.plot(x,y) > > > > > > > > > > toggle_selector.RS = RectangleSelector(ax, onselect, > > > > > drawtype='box') connect('key_press_event', toggle_selector) > > > > > show() > > > > > > > > > > Gökhan > > > > > > > > > > > > > > > On Fri, Apr 17, 2009 at 2:31 AM, Matthias Michler > > > > > > > > > > <matthiasmich...@gmx.net>wrote: > > > > > > Hi Gökhan, > > > > > > > > > > > > I recommend you to use matplotlib.widgets.RectangleSelector > > > > > > instead of the zoom functionality to select the data (An example > > > > > > can be > > > > found > > > > > > > > at > > > > http://matplotlib.sourceforge.net/examples/widgets/rectangle_selector.htm > > > > > > > >l). This will return you the x and y-coordinate of button press > > > > > > and > > > > > > > > button > > > > > > > > > > release > > > > > > event and with that you can take a portion of your data. > > > > > > Something like the following could be a starting point: > > > > > > x_min = min(eclick.xdata, erelease.xdata) > > > > > > x_max = max(eclick.xdata, erelease.xdata) > > > > > > x_new = x[(x>= x_min) & (x <= x_max)] > > > > > > > > > > > > where eclick and erelease correspond to the click and release > > > > > > event of the rectangle selection (see the example below). > > > > > > > > > > > > Opening a new figure after show can be achieved by: > > > > > > > > > > > > fig_new = plt.figure() > > > > > > # some plotting > > > > > > fig_new.show() # show up the new figure > > > > > > > > > > > > > > > > > > best regards Matthias > > > > > > > > > > > > > > > > > > yet another example for the usage of the RectangleSelector copied > > > > > > from its class documentation: > > > > > > > > > > > > """ > > > > > > Select a min/max range of the x axes for a matplotlib Axes > > > > > > > > > > > > Example usage:: > > > > > > > > > > > > from matplotlib.widgets import RectangleSelector > > > > > > from pylab import * > > > > > > > > > > > > def onselect(eclick, erelease): > > > > > > 'eclick and erelease are matplotlib events at press and > > > > > > > > release' > > > > > > > > > > print ' startposition : (%f, %f)' % (eclick.xdata, > > > > > > > > eclick.ydata) > > > > > > > > > > print ' endposition : (%f, %f)' % (erelease.xdata, > > > > > > erelease.ydata) > > > > > > print ' used button : ', eclick.button > > > > > > > > > > > > def toggle_selector(event): > > > > > > print ' Key pressed.' > > > > > > if event.key in ['Q', 'q'] and > > > > toggle_selector.RS.active: > > > > > > print ' RectangleSelector deactivated.' > > > > > > toggle_selector.RS.set_active(False) > > > > > > if event.key in ['A', 'a'] and not > > > > > > > > toggle_selector.RS.active: > > > > > > print ' RectangleSelector activated.' > > > > > > toggle_selector.RS.set_active(True) > > > > > > > > > > > > x = arange(100)/(99.0) > > > > > > y = sin(x) > > > > > > fig = figure > > > > > > ax = subplot(111) > > > > > > ax.plot(x,y) > > > > > > > > > > > > toggle_selector.RS = RectangleSelector(ax, onselect, > > > > > > drawtype='line') > > > > > > connect('key_press_event', toggle_selector) > > > > > > show() > > > > > > """ > > > > > > > > > > > > On Friday 17 April 2009 02:26:51 Gökhan SEVER wrote: > > > > > > > Hello, > > > > > > > > > > > > > > A quick question: > > > > > > > > > > > > > > I am using two numpy arrays to plot the figure shown in > > > > attachment. > > > > > > Is > > > > > > > > > > > it possible to get array indices of selected X-axes while using > > > > the > > > > > > > > > zoom function? Later I can create a new figure from this > > > > > > > selected portion instead of the same figure and/or apply an > > > > > > > analysis. > > > > > > > > > > > > > > Thank you. ------------------------------------------------------------------------------ Stay on top of everything new and different, both inside and around Java (TM) technology - register by April 22, and save $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco. 300 plus technical and hands-on sessions. Register today. Use priority code J9JMT32. http://p.sf.net/sfu/p _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users