Two questions

1) (Simple) Is there a defined behavior for matplotlib

    > when it attempts to graph data containing NaN values?
    > (OK, I admit-- it's really, really late, and I have tried
    > it to see what happens. But even that wouldn't tell me
    > if that was the _defined_ behavior :-))

No, it's not defined. I don't know that NaN is defined across
platforms in python. See my recent question on comp.lang.python

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=mailman.141.1080681106.20120.python-list%40python.org&rnum=3&prev=/groups%3Fq%3Dtest%2Bnan%2Bgroup%3Apython%26ie%3DUTF-8%26oe%3DUTF-8%26hl%3Den%26btnG%3DGoogle%2BSearch

Perhaps Todd or Perry can comment on what the status of NaN vis-a-vis
Numeric and numarray. This has come up a number of times before, and
would be nice to be able to handle it. As always, these ease of use
features imply a performance cost that the typical user may not want
to pay....

    > 2) I expect to be using matplotlib quite a bit in the
    > future, and will likely be using it in a more
    > object-oriented mode (i.e. not through the matlab-style
    > interface), since that's what I like better. I haven't
    > seen any "howto" documents for using the OO API. Do any
    > exist? I'd be happy to make notes and write a tutorial as
    > I learn, but don't want to duplicate work that already
    > exists.

I wrote a little example which I'll include below. The pure OO API is
not really designed to be too user friendly. Eg to instantiate a
line, you do

        vline = Line2D(
            dpi, bbox,
            xdata=x, ydata=y,
            color=color,
            antialiased=False, # no need to antialias vert lines
            transx = ax.xaxis.transData,
            transy = ax.yaxis.transData)

It's useful if you want to have total control of the lines
transformations, bounding boxes and so on, but is overkill for making
most plots. Likewise, instantiating your own Axes and Figures
requires a extra overhead. This is addressed more in the example
below, which recommends a hybrid approach.

If you want to take some of this and extend it into a guide of sorts,
that would be great. If what you are looking for is a developer's
guide which describes the process of Figure, Axes, Line2D, Text, etc,
creation and how to use them together, that doesn't exist yet.

However, matplotlib is undergoing rapid development and changes. One
nice thing about having people use the matlab interface is that it
frees me to refactor the OO API. There have been several major
refactorings to date. If a lot of people are using this API, and it's
documented, it is more difficult to change. I am not totally happy
with the current design (eg it us cumbersome to have to pass all those
objects just to create a line) so for now I prefer not to have too
many people creating lots of code with the OO API. I think the
overall design is stable (Figures contain Axes which contain Text,
Axis and Lines, etc) but some of the constructor signatures may
change.

The hybrid approach I recommend below keeps you safely at the
interface level and insulated from any API changes, which can be
painful for application developers. It does, however, enable you to
write more pythonic code.

Here is the new examples/pythonic_matplotlib.py:

"""
Some people prefer to use the python object oriented face rather than
the matlab interface to matplotlib. This example show you how.

Unless you are an application developer, I recommend using part of the
matlab interface, particularly the figure, close, subplot, axes, and
show commands. These hide a lot of complexity from you that you don't
need to see in normal figure creation, like instantiating DPI
instances, managing the bounding boxes of the figure elements,
creating and reaslizing GUI windows and embedding figures in them.

If you are an application developer and want to embed matplotlib in
your application, follow the lead of examples/embedding_in_wx.py,
examples/embedding_in_gtk.py or examples/embedding_in_tk.py. In this
case you will want to control the creation of all your figures,
embedding them in application windows, etc.

If you seen an example in the examples dir written in matlab
interface, and you want to emulate that using the true python method
calls, there is an easy mapping. Many of those examples use 'set' to
control figure properties. Here's how to map those commands onto
instance methods

The syntax of set is

  set(object or sequence, somestring, attribute)

if called with an object, set calls

  object.set_somestring(attribute)

if called with a sequence, set does

  for object in sequence:
       object.set_somestring(attribute)

So for your example, if a is your axes object, you can do

  a.set_xticklabels([])
  a.set_yticklabels([])
  a.set_xticks([])
  a.set_yticks([])
"""

from matplotlib.matlab import figure, close, axes, subplot, show
from matplotlib.numerix import arange, sin, pi

t = arange(0.0, 1.0, 0.01)

fig = figure(1)

ax1 = subplot(211)
ax1.plot(t, sin(2*pi*t))
ax1.grid(True)
ax1.set_ylim( (-2,2) )
ax1.set_ylabel('1 Hz')
ax1.set_title('A sine wave or two')

for label in ax1.get_xticklabels():
    label.set_color('r')

ax2 = subplot(212)
ax2.plot(t, sin(2*2*pi*t))
ax2.grid(True)
ax2.set_ylim( (-2,2) )
l = ax2.set_xlabel('Hi mom')
l.set_color('g')
l.set_fontsize(15)

show()

I'm not aware of any functionality in Numeric for dealing with IEEE
special values. (Looking in the Numeric manual suggests that problems
with these values lead to the development of the Masked Array capability
as an alternative.) Lack of support for IEEE special values in Numeric
makes it difficult to provide a unified approach in matplotlib.

numarray has a module (ieeespecial) for dealing with different IEEE
special values, including NaN. In numarray.ieeespecial are functions
for identifying the locations of and setting IEEE special values to some
other value. My thought was that you could use these functions in your
own code to define whatever behavior you want. This is perhaps more
work than is convenient but has the advantage that you can do it now
yourself.

Regards,
Todd

···

On Thu, 2004-04-22 at 08:48, John Hunter wrote:

    > 1) (Simple) Is there a defined behavior for matplotlib
    > when it attempts to graph data containing NaN values?
    > (OK, I admit-- it's really, really late, and I have tried
    > it to see what happens. But even that wouldn't tell me
    > if that was the _defined_ behavior :-))

No, it's not defined. I don't know that NaN is defined across
platforms in python. See my recent question on comp.lang.python

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=mailman.141.1080681106.20120.python-list%40python.org&rnum=3&prev=/groups%3Fq%3Dtest%2Bnan%2Bgroup%3Apython%26ie%3DUTF-8%26oe%3DUTF-8%26hl%3Den%26btnG%3DGoogle%2BSearch

Perhaps Todd or Perry can comment on what the status of NaN vis-a-vis
Numeric and numarray.

--
Todd Miller <jmiller@...86...>

    > 1) (Simple) Is there a defined behavior for matplotlib
    > when it attempts to graph data containing NaN values?
    > (OK, I admit-- it's really, really late, and I have tried
    > it to see what happens. But even that wouldn't tell me
    > if that was the _defined_ behavior :-))

I guess the question I have is what would you expect to happen?
My impression is that different people want to treat "missing"
data different ways. I'd say it should be a mistake to try to
plot NaNs. But taking the concept further, and generalizing
these to missing values, I'd be open to plotting functions
that accept masks if there was a common consensus as to what
those functions should do with those masks.

No, it's not defined. I don't know that NaN is defined across
platforms in python. See my recent question on comp.lang.python

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&thread

m=mailman.141.1080681106.20120.python-list%40python.org&rnum=3&prev=/groups%

3Fq%3Dtest%2Bnan%2Bgroup%253A*python*%26ie%3DUTF-8%26oe%3DUTF-8%26
hl%3Den%26btnG%3DGoogle%2BSearch

Perhaps Todd or Perry can comment on what the status of NaN vis-a-vis
Numeric and numarray. This has come up a number of times before, and
would be nice to be able to handle it. As always, these ease of use
features imply a performance cost that the typical user may not want
to pay....

Todd has already explained that numarray can easily generate masks
from NaNs or other ieee special values.

···