Requesting advice on multi-threaded matplotlib session + grids displaying data

Hello, I am fairly new to matplotlib in particular and

    > using gui's in general and don't have much experience yet
    > with threading. From a python command prompt, I want to
    > be able to use python to create and work with data sets,
    > while simultaneously be able to chart the data with
    > matplotlib. Since I would like to display more than one
    > matplotlib chart at a time, I presume this involves
    > working with threads. Furthermore, I would like to also
    > display the data sets in a grid-like table, and since I
    > want to see more than one such grid-like table at a time
    > (and of course see grid-like tables and matplotlib charts
    > at the same time too), I think this will also involve
    > threading.

Have you had a chance to read
http://matplotlib.sourceforge.net/interactive.html? This gives a
little background on using matplotlib interactively.

As stated on that page, the best approach with the current matplotlib
(0.61) is to set

  backend : TkAgg
  interactive : True

in your matplotlibrc file
(http://matplotlib.sourceforge.net/faq.html#MATPLOTLIBRC). If you do
this, you will not need to call show.

Fernando Perez, author of ipython, is working on a much improved
interactive shell for matplotlib + GTK. He plans eventually to
support all the backends, but right now is focusing on GTK (tkagg
already works with ipython). You will need CVS ipython and CVS
matplotlib to try this out, but it is very nice. See his earlier post

  http://sourceforge.net/mailarchive/forum.php?thread_id=5323260&forum_id=33405

As for the grids, if I understand you correctly, the best way to do
this is create multiple axes with the subplot command, eg,

    from matplotlib.matlab import *
    subplot(221) # upper left
    plot(range(10), 'go')

    subplot(222)
    pcolor(rand(10,10)) # upper right

    subplot(223)
    scatter(rand(12), rand(12)) # lower left

    subplot(224)
    hist(randn(10000), 100) # lower right

    show()

Is this what you are looking for? [You can embed multiple matplotlib
figure canvases into a wx grid or a gtk.Table if you want to use the
GUI API, but I'm assuming you're looking for something simpler, as
above].

JDH

John,

Many thanks for your reply. I had seen the interactive.html page before but
I didn't realize I had to drop the "show()" statement in order to accomplish
interactivity. Iow, I had set my matplotlibc file to have interactive be
true, but when I wrote scripts, I kept on using the "show()" command. Oops.
Tks for clearing that up.

Btw, what does "TkAgg sets interactive mode to True when you issue the show
command" mean exactly? Should it say False instead? Anyway, I kept using
"show()" in my scripts, which "hid" interactivity from me. I got that now.

My explanation of what I meant by displaying data in grid-like tables was
not good. Pls let me try again. Your example is v informative and useful,
but it doesn't get at what I had in mind. I did not mean displaying
multiple charts in one window in a grid-like orientation. By displaying the
data set in a grid-like table, I want to see the underlying numerical data
(ie, the actualy numbers) displayed in a grid window.

Perhaps I can better explain what I mean by continuing with your example.
When I run it, upon entering the line that reads "hist(randn(10000), 100)
# lower right", my python prompt prints out the following:

hist(randn(10000), 100) # lower right

(array([ 3, 0, 3, 5, 4, 10, 3, 5, 11, 2, 17, 9, 7,
        17, 24, 31, 29, 38, 42, 36, 53, 57, 70, 79, 78, 84,
       105, 103, 132, 158, 141, 164, 177, 172, 181, 217, 223, 243, 254,
       258, 286, 276, 279, 279, 300, 312, 333, 280, 305, 270, 278, 278,
       273, 257, 239, 223, 204, 216, 216, 174, 169, 142, 136, 120, 118,
       102, 89, 79, 69, 60, 48, 55, 42, 37, 27, 31, 30, 25,
        14, 12, 19, 12, 10, 5, 2, 5, 2, 2, 2, 1, 1,
         3, 2, 2, 1, 2, 0, 0, 0, 1]), array([-3.35781891
57051, -3.21132211, -3.13807372, -3.06482532,
       -2.99157693, -2.91832853, -2.84508014, -2.77183174, -2.69858334,
       -2.62533495, -2.55208655, -2.47883816, -2.40558976, -2.33234137,
       -2.25909297, -2.18584457, -2.11259618, -2.03934778, -1.96609939,
       -1.89285099, -1.8196026 , -1.7463542 , -1.6731058 , -1.59985741,
       -1.52660901, -1.45336062, -1.38011222, -1.30686383, -1.23361543,
       -1.16036703, -1.08711864, -1.01387024, -0.94062185, -0.86737345,
       -0.79412506, -0.72087666, -0.64762826, -0.57437987, -0.50113147,
       -0.42788308, -0.35463468, -0.28138629, -0.20813789, -0.13488949,
       -0.0616411 , 0.0116073 , 0.08485569, 0.15810409, 0.23135248,
        0.30460088, 0.37784928, 0.45109767, 0.52434607, 0.59759446,
        0.67084286, 0.74409125, 0.81733965, 0.89058805, 0.96383644,
        1.03708484, 1.11033323, 1.18358163, 1.25683002, 1.33007842,
        1.40332682, 1.47657521, 1.54982361, 1.623072 , 1.6963204 ,
        1.76956879, 1.84281719, 1.91606558, 1.98931398, 2.06256238,
        2.13581077, 2.20905917, 2.28230756, 2.35555596, 2.42880435,
        2.50205275, 2.57530115, 2.64854954, 2.72179794, 2.79504633,
        2.86829473, 2.94154312, 3.01479152, 3.08803992, 3.16128831,
        3.23453671, 3.3077851 , 3.3810335 , 3.45428189, 3.52753029,
        3.60077869, 3.67402708, 3.74727548, 3.82052387, 3.89377227])...

To me, that isnt a fun way to look at (or attempt to edit) the numbers in my
data set. I think it would be much more useful to display the numbers such
as those above in a separate window. What if I have 5,000 data
observations? A scrollable data grid window would make a much nicer
display. The picture at http://freshmeat.net/screenshots/36907/39220/ gives
the basic idea of what I mean by a data grid (though what I need is much
more basic than that picture).

Wx has such a grid widget which can be used for displaying/editing data,
which is what I was hoping to use. However, I am not sure if one should mix
different gui's. Iow, if I use tkagg or gtk as my interactive matplotlib
gui, can I also display and interact with wxpython grid widgets in the same
script smoothly? Am I asking for trouble having the same script display
interactive matplotlib charts using one gui type and then display these grid
widgets using another gui type? Or should I just stick with one gui type
throughout the entire script so that the interactive matplotlib charts use
say gtk and the same script also uses gtk for its grid widgets?

I hope that makes more sense.

Thanks again,

Tom

···

-----Original Message-----
From: John Hunter [mailto:jdhunter@…4…]
Sent: Tuesday, August 17, 2004 12:59 PM
To: Thomas Barket
Cc: matplotlib-users@lists.sourceforge.net
Subject: Re: [Matplotlib-users] Requesting advice on multi-threaded
matplotlib session + grids displaying data

    > Hello, I am fairly new to matplotlib in particular and
    > using gui's in general and don't have much experience yet
    > with threading. From a python command prompt, I want to
    > be able to use python to create and work with data sets,
    > while simultaneously be able to chart the data with
    > matplotlib. Since I would like to display more than one
    > matplotlib chart at a time, I presume this involves
    > working with threads. Furthermore, I would like to also
    > display the data sets in a grid-like table, and since I
    > want to see more than one such grid-like table at a time
    > (and of course see grid-like tables and matplotlib charts
    > at the same time too), I think this will also involve
    > threading.

Have you had a chance to read
http://matplotlib.sourceforge.net/interactive.html? This gives a little
background on using matplotlib interactively.

As stated on that page, the best approach with the current matplotlib
(0.61) is to set

  backend : TkAgg
  interactive : True

in your matplotlibrc file
(http://matplotlib.sourceforge.net/faq.html#MATPLOTLIBRC). If you do this,
you will not need to call show.

Fernando Perez, author of ipython, is working on a much improved interactive
shell for matplotlib + GTK. He plans eventually to support all the
backends, but right now is focusing on GTK (tkagg already works with
ipython). You will need CVS ipython and CVS matplotlib to try this out, but
it is very nice. See his earlier post

http://sourceforge.net/mailarchive/forum.php?thread_id=5323260&forum_id=3340
5

As for the grids, if I understand you correctly, the best way to do this is
create multiple axes with the subplot command, eg,

    from matplotlib.matlab import *
    subplot(221) # upper left
    plot(range(10), 'go')

    subplot(222)
    pcolor(rand(10,10)) # upper right

    subplot(223)
    scatter(rand(12), rand(12)) # lower left

    subplot(224)
    hist(randn(10000), 100) # lower right

    show()

Is this what you are looking for? [You can embed multiple matplotlib figure
canvases into a wx grid or a gtk.Table if you want to use the GUI API, but
I'm assuming you're looking for something simpler, as above].

JDH