Plotting



3. Plotting

Producing plots and graphics is a very common task for analysing data and creating reports. Scilab offers many ways to create and customize various types of plots and charts. In this section, we present how to create 2D plots and contour plots. Then we customize the title and the legend of our graphics. We finally export the plots so that we can use it in a report.



3.1 Overview

Scilab can produce many types of 2D and 3D plots. It can create x-y plots with the plot function, contour plots with the contour function, 3D plots with the surf function, histograms with the histplot function and many other types of plots. The most commonly used plot functions are presented in figure 19.

plot 2D plot
surf 3D plot
contour  contour plot
pie pie chart
histplot histogram
bar bar chart
barh horizontal bar chart
hist3d 3D histogram
polarplot plot polar coordinates
Matplop 2D plot of a matrix using colors
Sgrayplot smooth 2D plot of surface using colors
grayplot 2D plot of a surface using colors

Figure 19: Scilab plot functions

In order to get an example of a 3D plot, we can simply type the statement surf() in the Scilab console.

-->surf()
During the creation of a plot, we use several functions in order to create the data or to configure the plot. The functions presented in figure 20 will be used in the examples of this section.

linspace linearly spaced vector
feval     evaluates a function on a grid
legend     configure the legend of the current plot
title     configure the title of the current plot
xtitle     configure the title and the legends of the current plot

Figure 20: Scilab functions used when creating a plot.



3.2 2D plot

In this section, we present how to produce a simple x-y plot. We emphasize the use of vectorized functions, which produce matrices of data in one function call.

We begin by defining the function which is to be plotted. The myquadratic function squares the input argument x with the ”ˆ”operator.

function f = myquadratic ( x )
f = x^2
endfunction
We can use the linspace function in order to produce 50 values in the interval [1,10].

xdata = linspace ( 1 , 10 , 50 );
The xdata variable now contains a row vector with 50 entries, where the first value is equal to 1 and the last value is equal to 10. We can pass it to the myquadratic function and get the function value at the given points.

ydata = myquadratic ( xdata );
This produces the row vector ydata, which contains 50 entries. We finally use the plot function so that the data is displayed as an x-y plot.

plot ( xdata , ydata )
Figure 21 presents the associated x-y plot.

Figure 21: A simple x-y plot.

Notice that we could have produced the same plot without generating the intermediate array ydata. Indeed, the second input argument of the plot function can be a function, as in the following session.

plot ( xdata , myquadratic )
When the number of points to manage is large, using functions directly saves significant amount of memory space, since it avoids generating the intermediate vector ydata.



3.3 Contour plots

In this section, we present the contour plots of a multivariate function and make use of the contour function. This type of graphic is often used in the context of numerical optimization because it draws functions of two variables in a way that shows the location of the optimum.

The Scilab function contour plots contours of a function f. The contour function has the following syntax

contour(x,y,z,nz)
where

• x (resp. y) is a row vector of x (resp. y) values with size n1 (resp. n2),

• z is a real matrix of size (n1,n2), containing the values of the function or a Scilab function which defines the surface z=f(x,y),

• nz the level values or the number of levels.

In the following Scilab session, we use a simple form of the contour function, where the function myquadratic is passed as an input argument. The myquadratic function takes two input arguments x1 and x2 and returns f(x1,x2) = x1^2 + x2^2. The linspace function is used to generate vectors of data so that the function is analyzed in the range [−1,1]^2.

function f = myquadratic2arg ( x1 , x2 )
f = x1**2 + x2**2;
endfunction
xdata = linspace ( -1 , 1 , 100 );
ydata = linspace ( -1 , 1 , 100 );
contour ( xdata , ydata , myquadratic2arg , 10)
This produces the contour plot presented in figure 22.

Figure 22: Contour plot of the function f(x1,x2) = x1^2 + x2^2.

In practice, it may happen that our function has the header z = myfunction ( x ), where the input variable x is a row vector. The problem is that there is only one single input argument, instead of the two arguments required by the contour function. There are two possibilities to solve this little problem:

 • provide the data to the contour function by making two nested loops,

• provide the data to the contour function by using feval,

• define a new function which calls the first one.

These three solutions are presented in this section. The first goal is to let the reader choose the method which best fits the situation. The second goal is to show that performances issues can be avoided if a consistent use of the functions provided by Scilab is done.

In the following Scilab naive session, we define the function myquadratic1arg, which takes one vector as its single input argument. Then we perform two nested loops to compute the zdata matrix, which contains the z values. The z values are computed for all the combinations of points (x(i),y(j)) ∈ R^2, for i = 1,2,…,nx and j = 1,2,…,ny, where nx and ny are the number of points in the x and y coordinates. In the end, we call the contour function, with the list of required levels (instead of the previous number of levels). This gets exactly the levels we want, instead of letting Scilab compute the levels automatically.

function f = myquadratic1arg ( x )
f = x(1)**2 + x(2)**2;
endfunction
xdata = linspace ( -1 , 1 , 100 );
ydata = linspace ( -1 , 1 , 100 );
// Caution ! Two nested loops , this is bad.
for i = 1:length(xdata)
for j = 1:length(ydata)
x = [xdata(i) ydata(j)].’;
zdata ( i , j ) = myquadratic1arg ( x );
end
end
contour ( xdata , ydata , zdata , [0.1 0.3 0.5 0.7])
The contour plot is presented in figure 23.

Figure 23: Contour plot of the function f(x1,x2) = x1^2+x2^2 – The levels are explicitly configured.

The previous script works perfectly. Still, it is not efficient because it uses two nested loops and this should be avoided in Scilab for performance reasons. Another issue is that we had to store the zdata matrix, which might consume a lot of memory space when the number of points is large. This method should be avoided since it is a bad use of the features provided by Scilab.

In the following script, we use the feval function, which evaluates a function on a grid of values and returns the computed data. The generated grid is made of all the combinations of points (x(i),y(j)) ∈ R^2. We assume here that there is no possibility to modify the function myquadratic1arg, which takes one input argument. Therefore, we create an intermediate function myquadratic3, which takes 2 input arguments. Once done, we pass the myquadratic3 argument to the feval function and generate the zdata matrix.

function f = myquadratic1arg ( x )
 f = x(1)**2 + x(2)**2;
 endfunction
 function f = myquadratic3 ( x1 , x2 )
 f = myquadratic1arg ( [x1 x2] )
 endfunction
 xdata = linspace ( -1 , 1 , 100 );
 ydata = linspace ( -1 , 1 , 100 );
 zdata = feval ( xdata , ydata , myquadratic3 );
 contour ( xdata , ydata , zdata , [0.1 0.3 0.5 0.7])
The previous script produces, of course, exactly the same plot as previously. This method should be avoided when possible, since it requires storing the zdata matrix, which has size 100×100.

Finally, there is a third way of creating the plot. In the following Scilab session, we use the same intermediate function myquadratic3 as previously, but we pass it directly to the contour function.

function f = myquadratic1arg ( x )
 f = x(1)**2 + x(2)**2;
 endfunction
 function f = myquadratic3 ( x1 , x2 )
 f = myquadratic1arg ( [x1 x2] )
 endfunction
 xdata = linspace ( -1 , 1 , 100 );
 ydata = linspace ( -1 , 1 , 100 );
 contour ( xdata , ydata , myquadratic3 , [0.1 0.3 0.5 0.7])
The previous script produces, of course, exactly the same plot as previously. The major advantage is that we did not produce the zdata matrix. We have briefly outlined how to produce simple 2D plots.

We are now interested in the configuration of the plot, so that the titles, axis and legends corresponds to our data.



3.4 Titles, axes and legends

In this section, we present the Scilab graphics features which configure the title, axes and legends of an x-y plot.

In the following example, we define a quadratic function and plot it with the plot function.

function f = myquadratic ( x )
f = x.^2
endfunction
xdata = linspace ( 1 , 10 , 50 );
ydata = myquadratic ( xdata );
plot ( xdata , ydata )
We now have the plot which is presented in figure 21.

Scilab graphics system is based on graphics handles. The graphics handles provide an object-oriented access to the fields of a graphics entity. The graphics layout is decomposed into sub-objects such as the line associated with the curve, the x and y axes, the title, the legends, and so forth. Each object can be in turn decomposed into other objects if required. Each graphics object is associated with a collection of properties, such as the width or color of the line of the curve. These properties can be queried and configured simply by getting or setting their values, like any other Scilab variables. Managing handles is easy and very efficient.

But most basic plot configurations can be done by simple function calls and, in this section, we will focus in these basic features.

In the following script, we use the title function in order to configure the title of our plot.

title ( "My title" );
We may want to configure the axes of our plot as well. For this purpose, we use the xtitle function in the following script.

xtitle ( "My title" , "X axis" , "Y axis" );
Figure 24 presents the produced plot.

Figure 24: The x-y plot of a quadratic function – This is the same plot as in figure 21, with title and x-y axes configured.

It may happen that we want to compare two sets of data in the same 2D plot, that is, one set of x data and two sets of y data. In the following script, we define the two functions f(x) = x^2 and f(x) = 2*x^2 and plot the data on the same x-y plot. We additionally use the ”+-” and ”o-” options of the plot function, so that we can distinguish the two curves f(x) = x^2 and f(x) = 2*x^2.

function f = myquadratic ( x )
 f = x^2
 endfunction
 function f = myquadratic2 ( x )
 f = 2 * x^2
 endfunction
 xdata = linspace ( 1 , 10 , 50 );
 ydata = myquadratic ( xdata );
 plot ( xdata , ydata , "+-" )
 ydata2 = myquadratic2 ( xdata );
 plot ( xdata , ydata2 , "o-" )
 xtitle ( "My title" , "X axis" , "Y axis" );
Moreover, we must configure a legend so that we can know what curve is associated with f(x) = x^2 and what curve is associated with f(x) = 2*x^2. For this purpose, we use the legend function in order to print the legend associated with each curve.

legend ( "x^2" , "2x^2" );
Figure 25 presents the produced x-y plot.

xyplot_legend

Figure 25: The x-y plot of two quadratic functions – We have configured the legend so that we can distinguish the two functions f(x) = x^2 and f(x) = 2*x^2.

We now know how to create a graphics plot and how to configure it. If the plot is sufficiently interesting, it may be worth putting it into a report. To do so, we can export the plot into a file, which is the subject of the next section.



3.5 Export

In this section, we present ways of exporting plots into files, either interactively or automatically with Scilab functions.

Bitmap

Vectorial  
xs2png     export into PNG
xs2pdf  export into PDF
xs2svg     export into SVG
xs2eps     export into Encapsulated Postscript
xs2ps     export into Postscript
xs2emf     export into EMF (only for Windows)
Bitmap      
xs2fig     export into FIG
xs2gif     export into GIF
xs2jpg     export into JPG
xs2bmp     export into BMP
xs2ppm export into PPM

Figure 26: Export functions.

We can alternatively use the xs2* functions, presented in figure 26. All these functions are based on the same calling sequence:

xs2png ( window_number , filename )
where window_number is the number of the graphics window and filename is the name of the file to export. For example, the following session exports the plot which is in the graphics window number 0, which is the default graphics window, into the file foo.png.

xs2png ( 0 , "foo.png" )
If we want to produce higher quality documents, the vectorial formats are preferred. For example, LATEX documents may use Scilab plots exported into PDF files to improve their readability, whatever the size of the document.