From: Eric Firing <efiring@ha...>  20060712 23:19:58

Darren Dale wrote: > On Wednesday 12 July 2006 16:16, Mark Bakker wrote: > >>I am following up on the discussion of passing a single 2D array to plot. >>Wouldn't it make more sense that, in Python array style, >>if you give it a single N x K argument you plot rows against the first row? > > > That's not the behavior I would have expected. I would have expected each row > to be plotted as a funtion of the column index, just like plot([1,2,3,4]) is > done now, but with each row in a different color. I would like > plot([1,2,3,4], array([[1,2,3,4],[2,3,4,5]])) to plot two lines as a function > of the single xlist, and I would like plot(array([[1,2,3,4],[2,3,4,5]]), > array([[1,2,3,4],[2,3,4,5]])) to take the next obvious step. I *think* matlab > does this, but its been so long since I used it... I was afraid someone would bring up these possibilities... One of the problems with fancy argument handling is that there are many ways it can be done, so we have to decide on the behavior we want; and inevitably this will surprise (and probably irritate) some people just as it pleases others. (Other problems include complex code, complex documentation, and runtime overhead. For interactive use, however, fancy argument handling may be worth the trouble.) We are going to have some tradeoffs among matlab compatibility, internal consistency, and adherence to the underlying data storage model. Here is what Matlab does (and in one respect it is not what I thought I remembered): 1) Given a single NxK matrix, it plots each column against the row index. 2) Given a vector and an NxK, it plots each column against the vector. 3) Given an NxK and a vector, it plots the vector against each column. 4) Given an NxK and an NxK it plots each column from the second against the corresponding column of the first. I think this is a good model: fairly simple, consistent, intuitive, and covers a good range of reallife situations. It differs from what I thought I remembered, and from what I think Stefan requested, in that, given an Nx2, it does not plot the second column against the first. That behavior, however, does not generalize nicely to NxK for any K!=2, so I now think we should choose either one or the other. A virtue of Stefan's Nx2 proposal is that it is consistent with the changes I made to elsewhere so that paths can be specified as Nx2 arrays; this, in turn, was consistent with the original specification as sequences of (x,y) tuples. But plot has never used sequences of (x,y) tuples, so the argument for the Nx2 form is weaker here. I don't know whether the reason Matlab chooses the columns as the data vectors is because of the Fortran storage order Matlab uses, or whether there is some other reason. Personally I am very comfortable with it, perhaps simply because of my Matlab experience. I think part of it is that columns in a table seem more natural as data vectors than rows, however; tables are usually oriented so that columns (fields) are different variables, and the row index is the sample number, or time, or a spatial coordinate. 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 2D. 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 