From: Kenneth M. <kmm...@wi...> - 2004-04-22 08:41:30
|
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 :-)) 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. Thanks, Ken |
From: John H. <jdh...@ac...> - 2004-04-22 13:10:40
|
>>>>> "Kenneth" == Kenneth McDonald <kmm...@wi...> writes: Kenneth> 1) (Simple) Is there a defined behavior for matplotlib Kenneth> when it attempts to graph data containing NaN values? Kenneth> (OK, I admit-- it's really, really late, and I have tried Kenneth> it to see what happens. But even that wouldn't tell me Kenneth> 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%253A*python*%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.... Kenneth> 2) I expect to be using matplotlib quite a bit in the Kenneth> future, and will likely be using it in a more Kenneth> object-oriented mode (i.e. not through the matlab-style Kenneth> interface), since that's what I like better. I haven't Kenneth> seen any "howto" documents for using the OO API. Do any Kenneth> exist? I'd be happy to make notes and write a tutorial as Kenneth> I learn, but don't want to duplicate work that already Kenneth> 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() |
From: Todd M. <jm...@st...> - 2004-04-22 16:57:32
|
On Thu, 2004-04-22 at 08:48, John Hunter wrote: > >>>>> "Kenneth" == Kenneth McDonald <kmm...@wi...> writes: > > Kenneth> 1) (Simple) Is there a defined behavior for matplotlib > Kenneth> when it attempts to graph data containing NaN values? > Kenneth> (OK, I admit-- it's really, really late, and I have tried > Kenneth> it to see what happens. But even that wouldn't tell me > Kenneth> 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%253A*python*%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. 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 -- Todd Miller <jm...@st...> |
From: Perry G. <pe...@st...> - 2004-04-23 16:45:30
|
> >>>>> "Kenneth" == Kenneth McDonald <kmm...@wi...> writes: > > Kenneth> 1) (Simple) Is there a defined behavior for matplotlib > Kenneth> when it attempts to graph data containing NaN values? > Kenneth> (OK, I admit-- it's really, really late, and I have tried > Kenneth> it to see what happens. But even that wouldn't tell me > Kenneth> 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. > |