passing 1D or 2D arrays to contour, pcolor, image, plot

Eric -

To be honest, I think the native array storage order matters a lot.

When you have a large dataset, transposing the matrix is not a cheap command.

But I also understand the logic of plotting column against column.

However, a 1D vector in Python is by default a row, while in Matlab it is a column.

What are you going to do if a 1D row is given as first argument and a matrix as second???

I don’t like the Matlab model when one matrix is passed. It should really plot the first column along

the x-axis and all the other columns along y. Like your 2nd option below, but with NxM array.

It would then be very nice to have an optional argument to the function
to plot all rows against the first row. That would be very easy to
implement and keep everybody happy.

As you said, there will be many more opinions,

Mark

···

To summarize, the options seem to be:

  1. Leave plot argument parsing alone.

  2. Accept an Nx2 array in place of a pair of arguments containing x and y.

  3. Implement the Matlab model.

  4. Implement the Matlab model, but taking rows instead of columns in an
    X or Y array that is 2-D.

I am open to arguments, but my preference is the Matlab model. I don’t
think that the difference in native array storage order matters much.
It is more important to have the API at the plot method and function

level match the way people think.

Eric

If you use numpy, transposing is cheap. You see it when you try

import numpy as N
z = N.random.random([1000,1000])
print "Transposing..."
for x in range(10000): z.transpose()

in the latest SVN of numpy, they also have the convencience-shorthand
of z.T (which calls z.transpose()).

Regards
Stéfan

···

On Thu, Jul 13, 2006 at 10:34:11AM +0200, Mark Bakker wrote:

To be honest, I think the native array storage order matters a lot.
When you have a large dataset, transposing the matrix is not a cheap
command.

To be honest, I think the native array storage order matters a lot.

[...]

However, a 1D vector in Python is by default a row, while in Matlab it is a
column.
What are you going to do if a 1D row is given as first argument and a
matrix as second???

matplotlib's load command returns a row vector, regardless of whether the data
is Mx1 or 1xM.

···

On Thursday 13 July 2006 4:34 am, Mark Bakker wrote:

Stefan van der Walt wrote:

···

On Thu, Jul 13, 2006 at 10:34:11AM +0200, Mark Bakker wrote:

To be honest, I think the native array storage order matters a lot.
When you have a large dataset, transposing the matrix is not a cheap
command.

If you use numpy, transposing is cheap. You see it when you try

import numpy as N
z = N.random.random([1000,1000])
print "Transposing..."
for x in range(10000): z.transpose()

in the latest SVN of numpy, they also have the convencience-shorthand
of z.T (which calls z.transpose()).

It is especially cheap in comparison to everything else that happens when one plots with matplotlib! Utterly negligible.

Eric

Mark Bakker wrote:

Eric -

To be honest, I think the native array storage order matters a lot.
When you have a large dataset, transposing the matrix is not a cheap command.

No, in this context it is very cheap relative to the rest of the plotting.

But I also understand the logic of plotting column against column.
However, a 1D vector in Python is by default a row, while in Matlab it is a column.
What are you going to do if a 1D row is given as first argument and a matrix as second???

No problem. It is easy to treat a 1D array as either a column or a row, depending on whether one has chosen option 3 or option 4. This could even be controlled by an rc option and/or a kwarg, but I think this is a bad idea. Better to just pick 3 or 4 and stick with it, using transpose when needed. Keep things simple and explicit.

I don't like the Matlab model when one matrix is passed. It should really plot the first column along
the x-axis and all the other columns along y. Like your 2nd option below, but with NxM array.
It would then be very nice to have an optional argument to the function to plot all rows against the first row. That would be very easy to implement and keep everybody happy.

To make sure I understand you: you are suggesting a kwarg that tells the plot command to plot subsequent rows (or it could be columns) against the first? Something like

plot(Z, xvec='row')
plot(Z, xvec='column')
plot(Z, xvec=None) #default: present behavior

But why is this better than the following?

plot(Z[0,:], Z[1:,:])

The latter would accomplish the same, be completely consistent with option 4, be completely explicit and unambiguous, require no more typing than using a kwarg, require no extra logic in the plot code, and require no extra documentation for the plot command.

Eric

···

As you said, there will be many more opinions,

Mark

    To summarize, the options seem to be:

    1) Leave plot argument parsing alone.
    2) Accept an Nx2 array in place of a pair of arguments containing x
    and y.

    3) Implement the Matlab model.
    4) Implement the Matlab model, but taking rows instead of columns in an
    X or Y array that is 2-D.

    I am open to arguments, but my preference is the Matlab model. I don't
    think that the difference in native array storage order matters much.
    It is more important to have the API at the plot method and function
    level match the way people think.

    Eric

------------------------------------------------------------------------

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

You are right, concerning your comment below.
That will work just fine,
Mark

···

On 7/13/06, Eric Firing <efiring@…202… > wrote:

But why is this better than the following?

plot(Z[0,:], Z[1:,:])

The latter would accomplish the same, be completely consistent with
option 4, be completely explicit and unambiguous, require no more typing
than using a kwarg, require no extra logic in the plot code, and require

no extra documentation for the plot command.

Eric

As you said, there will be many more opinions,

Mark

To summarize, the options seem to be:
1) Leave plot argument parsing alone.
2) Accept an Nx2 array in place of a pair of arguments containing x
and y.

3) Implement the Matlab model.
4) Implement the Matlab model, but taking rows instead of columns in an
X or Y array that is 2-D.

I am open to arguments, but my preference is the Matlab model.  I don't
think that the difference in native array storage order matters much.
It is more important to have the API at the plot method and function
level match the way people think.

Eric


Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1
based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642



Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Below is the last (or nearly so) message of a thread from last summer. I have now implemented option 3 in svn, so:

If y is 2-D, plot(y) plots the columns of y against the row-index.

If x is 1-D and y is 2-D, plot(x,y) plots the columns of y against x. (In this case, x can also be 2-D if it is a single column.)

If x is 2-D and y is 1-D, plot(x,y) plots y against each successive column of x. (Again, y can also be a single column.)

If x and y are both 2-D, plot(x,y) plots columns of y against the corresponding columns of x. They must have the same number of columns.

All of this is consistent with Matlab, as far as I know. Apart from this compatibility aspect, the design tradeoff is between the appeal of plotting rows, on the grounds that they correspond to C storage order, versus the appeal of plotting columns, on the grounds that one tends to think of columns in a table as the natural vectors to be plotted. I don't think it makes much difference in efficiency; transposing is cheap in numpy. It is possible that plotting non-contiguous values triggers an additional array copy somewhere in the chain of operations. I have not tried to figure out whether it does, or what the time penalty would be if it does, but I strongly doubt it would be a noticeable fraction of the total plot generation time.

The changes are only very lightly tested so far, so please look for bugs.

Eric

Mark Bakker wrote:

···

You are right, concerning your comment below.
That will work just fine,
Mark

On 7/13/06, *Eric Firing* <efiring@...202... > <mailto:efiring@…202…>> wrote:

    But why is this better than the following?

    plot(Z[0,:], Z[1:,:])

    The latter would accomplish the same, be completely consistent with
    option 4, be completely explicit and unambiguous, require no more typing
    than using a kwarg, require no extra logic in the plot code, and
    require
    no extra documentation for the plot command.

    Eric
     >
     > As you said, there will be many more opinions,
     >
     > Mark
     >
     > To summarize, the options seem to be:
     >
     > 1) Leave plot argument parsing alone.
     > 2) Accept an Nx2 array in place of a pair of arguments
    containing x
     > and y.
     >
     > 3) Implement the Matlab model.
     > 4) Implement the Matlab model, but taking rows instead of
    columns in an
     > X or Y array that is 2-D.
     >
     > I am open to arguments, but my preference is the Matlab
    model. I don't
     > think that the difference in native array storage order
    matters much.
     > It is more important to have the API at the plot method and
    function
     > level match the way people think.
     >
     > Eric