* Bug #12880 fixed - Graphics: issue a warning when transposing 08/12408/12
Paul BIGNIER [Mon, 2 Sep 2013 15:14:04 +0000 (17:14 +0200)]
Display warnings when the function checkXYPair() transposes input data.
Destined to function plot().
Consequently modified plot() demo to not display warnings.

Change-Id: Ibbc4deee746b98edb949b8ed8f146ac288d776cc

scilab/CHANGES_5.5.X
scilab/modules/graphics/help/en_US/2d_plot/plot.xml
scilab/modules/graphics/macros/checkXYPair.sci
scilab/modules/graphics/macros/plot.sci

index b615a38..0290b30 100644 (file)
@@ -184,6 +184,8 @@ Scilab Bug Fixes
 
 * Bug #12785 fixed - plot did not allow int data as first argument.
 
+* Bug #12880 fixed - Added a warning when transposing arguments of plot().
+
 * Bug #12882 fixed - Some help pages were not clear.
 
 * Bug #12910 fixed - Some typos fixed.
index cc057b3..4f4778f 100644 (file)
@@ -2,11 +2,11 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Fabrice Leray
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
@@ -30,7 +30,7 @@
                 <term>x</term>
                 <listitem>
                     <para>a real matrix or vector. If omitted, it is assumed to be the
-                        vector <literal>1:n</literal> where <literal>n</literal> is the number of curve
+                        vector <literal>(1:n)'</literal> where <literal>n</literal> is the number of curve
                         points given by the <literal>y</literal> parameter.
                     </para>
                 </listitem>
@@ -49,7 +49,7 @@
                 <listitem>
                     <para>This optional argument must be a string that will be used as a
                         shortcut to specify a way of drawing a line. We can have one
-                        <literal>LineSpec</literal> per<literal> y</literal> or <literal>{x,y}</literal>
+                        <literal>LineSpec</literal> per <literal> y</literal> or <literal>{x,y}</literal>
                         previously entered. <literal>LineSpec</literal> options deals with
                         LineStyle, Marker and Color specifiers (see <link linkend="LineSpec">LineSpec</link>).
                         Those specifiers determine the line style, mark style and color of
         </para>
         <para>
             If <literal>y</literal> is a vector, plot(y) plots vector <literal>y</literal>
-            versus vector <literal>1:size(y,'*')</literal>.
+            versus vector <literal>(1:size(y,'*'))'</literal>.
         </para>
         <para>
             If <literal>y</literal> is a matrix, plot(y) plots each columns of
-            <literal>y</literal> versus vector <literal>1:size(y,1)</literal>.
+            <literal>y</literal> versus vector <literal>(1:size(y,1))'</literal>.
         </para>
         <para>
             If <literal>x</literal> and <literal>y</literal> are vectors, plot(x,y) plots
             rather than lines (see examples below).
         </para>
         <para>
+            <warning>
+                When it is necessary and possible, <literal>plot</literal> transposes <literal>x</literal> and <literal>y</literal>,
+                to get compatible dimensions; a warning is then issued. For instance,
+                when <literal>x</literal> has as many rows as <literal>y</literal> has columns.
+                Row vectors are always tranposed, and if <literal>y</literal> is square, it is never transposed.
+            </warning>
+        </para>
+        <para>
             <literal>y</literal> can also be a function defined as a macro or a
             primitive. In this case, <literal>x</literal> data must be given (as a vector or
             matrix) and the corresponding computation <literal>y(x)</literal> is done
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
-// x initialisation 
+        <programlisting role="example"><![CDATA[
+// x initialisation
 x=[0:0.1:2*%pi]';
 //simple plot
 plot(sin(x))
@@ -269,7 +277,7 @@ plot(sin(x))
             x=[0:0.1:2*%pi]';
             plot(sin(x))
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf()
 x=[0:0.1:2*%pi]';
 plot(x,sin(x))
@@ -278,7 +286,7 @@ plot(x,sin(x))
             x=[0:0.1:2*%pi]';
             plot(x,sin(x))
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf()
 //multiple plot
 x=[0:0.1:2*%pi]';
@@ -288,38 +296,38 @@ plot(x,[sin(x) sin(2*x) sin(3*x)])
             x=[0:0.1:2*%pi]';
             plot(x,[sin(x) sin(2*x) sin(3*x)])
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf()
 x=[0:0.1:2*%pi]';
-// axis on the right 
-plot(x,sin(x)) 
-a=gca(); // Handle on current axes entity 
-a.y_location ="right"; 
+// axis on the right
+plot(x,sin(x))
+a=gca(); // Handle on current axes entity
+a.y_location ="right";
 clf()
  ]]></programlisting>
         <scilab:image>
             x=[0:0.1:2*%pi]';
-            plot(x,sin(x)) 
+            plot(x,sin(x))
             a=gca();
-            a.y_location ="right"; 
+            a.y_location ="right";
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 x=[0:0.1:2*%pi]';
 // axis centered at (0,0)
 plot(x-4,sin(x),x+2,cos(x))
 a=gca(); // Handle on axes entity
-a.x_location = "origin"; 
-a.y_location = "origin"; 
+a.x_location = "origin";
+a.y_location = "origin";
 
 // Some operations on entities created by plot ...
 a=gca();
-a.isoview='on'; 
-a.children // list the children of the axes : here it is an Compound child composed of 2 entities 
-poly1= a.children.children(2); //store polyline handle into poly1 
+a.isoview='on';
+a.children // list the children of the axes : here it is an Compound child composed of 2 entities
+poly1= a.children.children(2); //store polyline handle into poly1
 poly1.foreground = 4; // another way to change the style...
 poly1.thickness = 3;  // ...and the tickness of a curve.
 poly1.clip_state='off' // clipping control
-a.isoview='off'; 
+a.isoview='off';
  ]]></programlisting>
         <scilab:image>
             x=[0:0.1:2*%pi]';
@@ -327,7 +335,7 @@ a.isoview='off';
             a=gca();
             a.x_location = "origin";
             a.y_location = "origin";
-            
+
             a=gca();
             a.isoview='on';
             a.children
@@ -336,9 +344,9 @@ a.isoview='off';
             poly1.thickness = 3;
             poly1.clip_state='off'
             a.isoview='off';
-            
+
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 
 //LineSpec and GlobalProperty examples:
 clf();
@@ -362,7 +370,7 @@ xdel(winsid())
             scf(4) // should remain blank
             plot(axfig3,[t ;t],[sin(t) ;cos(t)],'zdat',[1:2],'marker','d','markerfac','green','markeredg','yel')
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 //Data specification
 t=-%pi:0.1:%pi;
 size(t)
@@ -373,7 +381,7 @@ plot(t) // simply plots y versus t vector size
             size(t)
             plot(t)
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf(); // clear figure
 t=-%pi:0.1:%pi;
 plot(t,sin(t)); // plots sin(t) versus t
@@ -383,7 +391,7 @@ plot(t,sin(t)); // plots sin(t) versus t
             t=-%pi:0.1:%pi;
             plot(t,sin(t));
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf();
 t=[1     1     1     1
    2     3     4     5
@@ -397,10 +405,10 @@ plot(t) // plots each t column versus row size
             2     3     4     5
             3     4     5     6
             4     5     6     7];
-            
+
             plot(t) // plots each t column versus row size
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf();
 t=[1     1     1     1
    2     3     4     5
@@ -428,7 +436,7 @@ xtitle("sin(t)'' versus t''")
             2     3     4     5
             3     4     5     6
             4     5     6     7];
-            
+
             subplot(221)
             plot(t,sin(t)); // plots sin(t) versus t column by column this time
             xtitle("sin(t) versus t")
@@ -444,7 +452,7 @@ xtitle("sin(t)'' versus t''")
             plot(t',sin(t)')
             xtitle("sin(t)'' versus t''")
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 
 clf();
 t=[1     1     1     1
@@ -463,12 +471,12 @@ plot(x',t); // idem, x is automatically transposed to match t (here the columns)
             2     3     4     5
             3     4     5     6
             4     5     6     7];
-            
+
             x=[5 6 7 8]
             plot(x,t);
             plot(x',t);
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf()
 x=[5 6 7 8]
 
@@ -490,12 +498,12 @@ plot(x',[t [8;9;10;12]]');
  ]]></programlisting>
         <scilab:image>
             x=[5 6 7 8]
-            
+
             t=[1     1     1     1
             2     3     4     5
             3     4     5     6
             4     5     6     7];
-            
+
             // Only one matching possibility case : how to make 4 identical plots in 4 manners...
             // x is 1x4 (vector) and y is 4x5 (non square matrix)
             subplot(221);
@@ -507,7 +515,7 @@ plot(x',[t [8;9;10;12]]');
             subplot(224);
             plot(x',[t [8;9;10;12]]');
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf()
 
 t=[1     1     1     1
@@ -526,14 +534,14 @@ plot(t,[1;2;3;4]) // the same plot
             2     3     4     5
             3     4     5     6
             4     5     6     7];
-            
+
             //Special case 2
             // Case where only x or y is a square matrix
             //x : matrix (t) and y  : vector ([1 2 3 4])
             plot(t,[1 2 3 4]) // equivalent to plot(t,[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4])
             plot(t,[1;2;3;4]) // the same plot
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 t=[1     1     1     1
    2     3     4     5
    3     4     5     6
@@ -541,8 +549,8 @@ t=[1     1     1     1
 clf();
 
 // t is transposed : notice the priority given to the columns treatment
-plot(t',[1 2 3 4]) // equivalent to plot(t',[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]) 
-plot(t',[1 2 3 4]') // the same plot 
+plot(t',[1 2 3 4]) // equivalent to plot(t',[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4])
+plot(t',[1 2 3 4]') // the same plot
  ]]></programlisting>
         <scilab:image>
             t=[1     1     1     1
@@ -550,12 +558,12 @@ plot(t',[1 2 3 4]') // the same plot
             3     4     5     6
             4     5     6     7];
             clf();
-            
+
             // t is transposed : notice the priority given to the columns treatment
-            plot(t',[1 2 3 4]) // equivalent to plot(t',[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]) 
-            plot(t',[1 2 3 4]') // the same plot 
+            plot(t',[1 2 3 4]) // equivalent to plot(t',[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4])
+            plot(t',[1 2 3 4]') // the same plot
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf();
 // y is a function defined by..
 // ..a primitive
@@ -565,7 +573,7 @@ plot(1:0.1:10,sin) // equivalent to plot(1:0.1:10,sin(1:0.1:10))
         <scilab:image>
             plot(1:0.1:10,sin)
         </scilab:image>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 clf();
 // ..a macro:
 deff('[y]=toto(x)','y=x.*x')
index 6d1eef6..a7c833d 100644 (file)
@@ -57,8 +57,11 @@ function [X,Y]=checkXYPair(typeOfPlot,x,y,current_figure,cur_draw_mode)
         X=x;
         Y=y;
 
-        if size(X,1)==1, X=X', end;  // si l'un des vecteurs est une ligne
-        if size(Y,1)==1, Y=Y', end;  // on le transpose.
+        XScal = isscalar(X);
+        YScal = isscalar(Y);
+
+        if size(X,1)==1 & ~XScal, X=X', warning(_("Transposing row vector to get column vector")), end; // If one of the vectors is a row, transpose it,
+        if size(Y,1)==1 & ~YScal, Y=Y', warning(_("Transposing row vector to get column vector")), end; // but no need to transpose scalars.
 
         if (size(X)==[0 0])
             ok=%F
@@ -87,9 +90,14 @@ function [X,Y]=checkXYPair(typeOfPlot,x,y,current_figure,cur_draw_mode)
 
             return;
         end
+
         if (size(X,2)==1) & (size(Y,2)==size(X,1))
-            // X is a vector
-            Y=Y';
+            // X is a column vector and Y has as many columns as X has rows.
+            // Y cannot be a square matrix here, because it would have fallen in the previous case (above) and returned.
+            if ~YScal then
+                warning(_("Transposing data matrix to get compatible dimensions"));
+                Y=Y';
+            end
             ok=%T;
 
             return;
@@ -109,9 +117,13 @@ function [X,Y]=checkXYPair(typeOfPlot,x,y,current_figure,cur_draw_mode)
         if or(size(Y) == 1) then
             if size(X,1) == size(Y,1) then
                 y=Y;
-            elseif size(X,1) == size(Y,2) then
+            elseif size(X,1) == size(Y,2) & ~YScal then
+                // Y has as many columns as X has rows. Transpose Y to fit X.
+                warning(_("Transposing data matrix to get compatible dimensions"));
                 y=Y(:);
-            elseif size(X,2) == size(Y,1) then
+            elseif size(X,2) == size(Y,1) & ~YScal & ~XScal then
+                // Y has as many rows as X has columns. Transpose Y to fit X.
+                warning(_("Transposing column vector to get row vector"));
                 X=X';
                 y=Y(:);
             elseif size(X,2) == size(Y,2) then
@@ -140,4 +152,3 @@ function [X,Y]=checkXYPair(typeOfPlot,x,y,current_figure,cur_draw_mode)
 
     // end of checkXYPair
 endfunction
-
index 5b7621b..6265ebc 100644 (file)
@@ -9,20 +9,21 @@
 
 function plot(varargin)
     // Try to build a new better parser that could manage things like:
-    // plot(x,y,'X',1:10); // where X stands for Xdata (Matlab recognize
-    //it and treats it well...
+    // plot(x,y,'X',1:10); // where X stands for Xdata (Matlab recognizes
+    //it and treats it well...)
 
     [lhs,rhs]=argn(0);
 
     if ~rhs
         //LineSpec and PropertySpec examples:
         t = 0:%pi/20:2*%pi;
+        tt = t';
         clf();
         drawlater();
         subplot(211);
-        plot(t,sin(t),"ro-.",t,cos(t),"cya+",t,abs(sin(t)),"--mo");
+        plot(tt, sin(tt), "ro-.", tt, cos(tt), "cya+", tt, abs(sin(tt)), "--mo");
         subplot(212);
-        plot([t ;t],[sin(t) ;cos(t)],"xdat",[1:2]);
+        plot([t ;t],[sin(t); cos(t)],"xdat",[1:2]);
         drawnow();
         return;
     end
@@ -245,10 +246,11 @@ function plot(varargin)
             [X,Y] = checkXYPair(typeOfPlot,ListArg(xyIndexLineSpec(i,1)),ListArg(xyIndexLineSpec(i,2)),current_figure,cur_draw_mode)
         else
             if or(size(ListArg(xyIndexLineSpec(1,2)))==1)  // If this is a vector
-                X=1:length(ListArg(xyIndexLineSpec(1,2))); // insert an abcsissa vector of same length,
+                X=(1:length(ListArg(xyIndexLineSpec(1,2))))'; // insert an abcsissa vector of same length,
             else                                  // if this is a matrix,
-                X=1:size(ListArg(xyIndexLineSpec(1,2)),1); // insert an abcsissa vector with
+                X=(1:size(ListArg(xyIndexLineSpec(1,2)),1))'; // insert an abcsissa vector with same size
             end
+            // In both cases (matrix/vector), transpose it now so no warning is issued in checkXYPair().
             [X,Y] = checkXYPair(typeOfPlot,X,ListArg(xyIndexLineSpec(1,2)),current_figure,cur_draw_mode)
         end
 
@@ -448,5 +450,3 @@ function plot(varargin)
     ResetFigureDDM(current_figure, cur_draw_mode)
 
 endfunction
-
-