1.2.2. Построение графиков и визуализация вычислений в системе Scilab
Самый простой способ для построения графика функции одной переменной y=f(x), это предварительное формирование двух векторов одинаковой длины: вектор значений аргументов x и вектор соответствующих им значений функции у, а затем выполнение команды plot(x, y). Выполнение команды plot(x, y) открывает графическое окно и отображает в нем график функции y(x). Создать новое графическое окно можно и путем выполнения команды scf(n), где n – номер графического окна.
Рассмотрим пример построения графика функции на отрезке [-1.5;1.5] (рис.1.2.2-1).
Рис. 1.2.2-1. Команды построения графика функции
В результате выполнения команды plot(x,y) появляется графическое окно с номером (рис. 1.2.2-2).
Рис. 1.2.2-2. Графическое окно с изображением графика функции
Переход между окнами (от командного окна к графическому окну и обратно) осуществляется с помощью комбинации клавиш <Alt+Tab> или с помощью мыши.
В общем случае, число аргументов у функции plot() не ограничивается двумя. Эта функция имеет следующий формат:
plot(x1,y1,x2,y2. ).
Таким образом, в одном графическом окне можно построить не один, а несколько графиков. Рассмотрим два способа построения в одном графическом окне 3-х графиков (рис.1.2.2-3):
Рис. 1.2.2-3. Использование векторов значений функций
для построения графиков 3-х функций
Рис. 1.2.2-4. Использование матрицы значений функций для построения графиков 3-х функций
Приведенные в первом и втором случаях наборы команд позволяют получить один и тот же результат (рис. 1.2.2-5.) Разница в том, что в первом примере формируется три вектора значений функций (y1, y2, y3), а во втором – матрица y, содержащая значения функций в виде столбцов.

Рис 1.2.2-5. Графики функций y1=sin(x); y2=sin(2*x);y3=sin(4*x)
График, выведенный в графическое окно Scilab, может быть снабжен заголовком, именами осей, дополнительным текстом, сеткой и другой поясняющей информацией. Аргументами команд, управляющими пояснениями, являются текстовые строки. Например, команда xtitle(‘title‘, ‘xstr‘, ‘ystr‘) добавит к графику заголовок и подписи осей. Команда xgrid() позволяет отобразить координатную сетку.
В случаях, когда в одной координатной плоскости изображаются графики нескольких функций, как в нашем примере, возникает необходимость в выводе обозначений («легенде»). Имена созданных кривых можно вывести с помощью команды legend:
legend(leg1, leg2, . legn, [pos]),
где: leg1 — имя первого графика;
leg2 — имя второго графика;
legn — имя n-го графика;
pos — числовой параметр, определяющий место расположения обозначений в графическом окне (табл. 1.2.2-7).
Таблица 1.2.2-1
Значение аргумента
Размещение легенды
В правом верхнем углу над областью графика
Место выбирается автоматически, чтобы не перекрывать область кривых
В правом верхнем углу (и по умолчанию)
В левом верхнем углу области графика
В левом нижнем углу области графика
В правом нижнем углу области графика
При выводе в одно графическое окно нескольких графиков удобнее каждый график выводить с использованием своей команды plot(), однако в этом случае происходит создание нового графического окна. Для того, чтобы этого избежать используется команда mtlb_hold(‘on‘). Эта команда позволяет расположить все в дальнейшем выводимые графики в одном окне.
При выводе графика можно сменить принятый по умолчанию Scilab цвет и тип точек, с помощью которых рисуется данный график (табл.1.2.2-2). Символы, указывающие на цвет и тип точки, заключаются в апострофы и указываются в команде plot() после имени функции.
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
• 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.
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.
| 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:
Построение графиков Scilab
Математический пакет Scilab располагает широким и гибко настраиваемым аппаратом для построения двумерных графиков и трёхмерных изображений.
Математический пакет Scilab располагает широким и гибко настраиваемым аппаратом для построения двумерных графиков и трёхмерных изображений.
Перечислим основные функции для оформления графика:
xgrid() — добавление сетки на график;
xtitle(«Название графика», «Название оси абсцисс», «Название оси ординат») — добавление подписей;
legend(. , .. ) — создание легенды с перечнем всех отображенных графиков в системе координат;
subplot(mnk) — функция разделения окна на матрицу, содержащую \( m \) строк, \(n столбцов\), а \(k \)- это номер ячейки, в которой будет отображен график.
Например, subplot(312) разобъёт графичекое окно на 3 строки, 1 столбец и нарисует график во второй ячейке:

Расположение графика в графическом окне subplot(312).
Например, subplot(234) разобъёт графичекое окно на 2 строки, 3 столбца и нарисует график в четвёртой ячейке:

Расположение графика в графическом окне subplot(234).
5.1 Двумерные графики
Для построения графиков, в которых положение точки задаётся двумя величинами, в Scilab нужно воспользоваться функцией plot(x, y , s). Здесь первая переменная \( х \) — массив абсцисс, \( у \) — массив ординат, \( s \) — необязательный параметр, отвечающий за цвет графика, толщину и начертание линии.
Установить желаемый вид и цвет графика можно, указав строковый параметр \( s \), который может состоять из одного, двух или трёх символов, определяющие соответственно: цвет линии, тип маркера, тип линии графика. Возможные значения перечислены в таблицах 2-4.

Таблица 2. Символы, определяющие цвет линии графика.

Таблица 3. Символы, определяющие тип линии графика.

Таблица 4. Символы, определяющие тип маркера
Для демонстрации работы функции plot() построим графики траектории движения точки по заданным уравнениям \( x(t), y(t) \) на плоскости и в заданном диапазоне времени T (таблица 5). Определим внешний вид каждого из графиков, а также оформим систему координат со всеми необходимыми подписями (листинг 13). Результат работы программы представлен на рис. 7.

Таблица 5. Уравнения движения материальной точки и промежуток времени.

Рисунок 7. Построение графиков движения материальной точки.
5.2 Построение трёхмерных изображений
Для построения поверхности в Scilab используются функции plot3d( plot3d1) и plot3d2(plot3d3). Их отличие состоит в том, что первая пара функций plot3d( plot3d1) строит поверхность из отдельно стоящих друг от друга грани (залитую одним цветом и залитую различными цветами соответсвенно), а вторая пара plot3d2(plot3d3) — цельное геометрическое тело.
Процесс построения графика функции вида \( Z(x,y) \) можно разделить на 3 этапа:
1. Создание прямоугольной сетки с помощью функции linspace();
2. Вычисление значений функции \( Z(x,y) \) в узлах сетки;
3. Вызов функции plot3d() или plot3d2().
В качестве примера, построим сферу в трехмерной системе координат с помощью функций plot3d1 и plot3d2.

Рисунок 8. Сфера, заданная параметрически, построенная с помощью функции plot3d1 (слева) и plot3d2 (справа).
Поверхность сферы в декартовых координатах \( (x,y,z) \) параметрически задаётся системой уравнений: \( f(n) = \begin
независимые переменные \( u и v \) изменяются на промежутке \( [-\pi; \pi] \). Результат работы программы представлен на рис.8, исходный код на листинге 14.
Обратите внимание, что при построении графиков поверхностей заданных параметрически , \(x(u,v), y(u,v) и z(u,v) \), необходимо сформировать матрицы \( X, Y и Z\) одинакового размера. Для этого массивы \( u и v \) должны иметь одинаковый размер.
Кроме того, если какая-либо функция из \( X, Y или Z\) зависит только от одного параметра \( u или v \), необходимо провести векторное умножение на единичный вектор ones() размерности, равной размерности параметра, от которого эта функция не зависит (см. строку 10 листинга 14).
Scilab/Графики
Во время работы в Scilab, представлять результаты в виде графиков приходится также часто, как и писать сценарии. В этой главе мы рассмотрим способы построения разных видов графиков.
Содержание
Основные понятия [ править ]
Для начала определим то, с чем мы будем иметь дело. График — это графическое представление функции. В среде Scilab все графики строятся по точкам, при этом каждые две соседние точки соединяются друг с другом отрезком. Чем меньше расстояние между точками, тем меньше искажение графика за счет замены его реального образа кусочно-линейной функцией. К сожалению, координаты точек нужно где-то хранить, что является главным ограничивающим фактором в желании получить как можно более плавное представление.
Внешний вид графика определяют следующие факторы:
- Математическая функция и система координат:
- двухмерный график — график функции с одним аргументом, либо, если функция представлена неявно, одномерной функции;
- в прямоугольной системе координат;
- в полярной системе координат;
- в комплексной плоскости (например, годографы);
- в векторной плоскости;
- в пространственной прямоугольной системе координат;
- в сферической системе координат;
- в цилиндрической системе координат;
- в векторном пространстве.
- точечный график;
- линейный график (с учетом всевозможных представлений линии);
- полигональный график;
- градиентный график;
- контурный график
- гистограмма.
Все графики в Scilab строятся в так называемых графических окнах (англ. Figure ). Графические окна используются не только для построения графиков, но и для создания пользовательских интерфейсов, анимации и рисования, о чем подробнее будет рассказано в другом разделе. Каждое графическое окно имеет идентификатор, который называется дескриптором графического окна или просто дескриптором (англ. Handle ), когда опускание уточнения не вводит в заблуждение. В дальнейшем вы увидите, что дескриптор есть не только у графических окон.
Любое графическое окно в Scilab это отдельный объект, обладающий широким набором параметров, отвечающих за его внешний вид. При построении графиков пользователь неявно обращается к рабочей области графического окна, когда, например, чертит оси, сетку, отмечает точки и соединяет их прямыми. Построение графика на самом деле сложный процесс, связанный с рисованием линий на мониторе. К счастью для построения графиков в системе есть множество предопределенных функций, которые выполняют всю построительную работу в графическом окне. От пользователя лишь требуется знания всех этих функций и правил их применения.
Далее, говоря слово график, мы будем понимать график функции вместе со всеми дополнительными элементами, как оси, сетка подписи и т.п.
Создание графического окна [ править ]
Для того, чтобы создать графическое окно необходимо воспользоваться функцией
Данная функция ожидает в качестве аргумента целое число, которое будет определять номер окна в системе. Если пользователь ничего не передаст, то система присвоит окну последний не занятый порядковый номер, начиная с нуля. В ответ данная функция возвращает дескриптор окна, а также набор его параметров. Большая часть параметров заранее предопределена.
Давайте попробуем создать графическое окно
После вызова функции появится графическое окно с номером 0, а в командном окне вы увидите параметры данного окна.
Белая область графического окна, которую вы видите, называется рабочей и вы вольны рисовать на ней все, что вам захочется, в том числе и графики.
Давайте создадим еще одно графическое окно, но определим его номер самостоятельно. Для этого введем команду
Теперь у нас два графических окна под номерами 0 и 5, текущим из которых является окно 5. Чтобы посмотреть весь перечень открытых окон, необходимо вызвать макрос
который вернет вектор с номерами всех открытых графических окон. Давайте снова сделаем активным окно 0, для чего вызовем функцию scf()
Закрыть графическое окно можно двумя способами:
- Нажать на «крестик» в верхнем правом углу окна, при этом дескриптор окна удалится автоматически;
- Воспользоваться функцией xdel(), которой необходимо передать вектор номеров всех графических окон, которые вы желаете закрыть.
Последний способ обычно применяется в сценариях, когда управление окнами осуществляется программно. Закроем окно 5 и убедимся, что оно закрылось
Мы пока отвлечемся от настройки графических окон и перейдем непосредственно к построению графиков. Отметим также, что если за время сеанса не было создано ни одного графического окна, то функции рисования создают его автоматически. В любом случае, если вы желаете полностью управлять всем процессом, то рекомендуется создавать окна вручную.
Построение графиков [ править ]
Любой график имеет следующие элементы:
- Собственно сам график функции (один или несколько), включая параметры его отображения;
- Оси системы координат, включая внешний вид, масштаб отсчета и подписи осей;
- Координатная сетка;
- Подпись графика;
- Легенда;
- Надписи на самом графике.
При вызове непосредственно функций построения, многие второстепенные элементы строятся автоматически по заранее заготовленным шаблонам, однако, всеми этими элементами можно управлять.
Построение графиков одномерных функций [ править ]
Как было сказано ранее, все графики строятся по точкам, а сам массив точек иногда называют точечной функцией. У одномерной функции точка характеризуется двумя координатами — значением аргумента и значением функции. Обычно множество значений аргумента и функции записываются в векторы, которые передаются уже в качестве аргументов для строящих функций.
Для построения одномерных функций в прямоугольной системе координат служат следующие функции:
- семейство функций plot2d*(), выполняющих построение по точечной функции, где символ звездочки кодирует заранее определенный шаблон:
- plot2d — строит график по форматам, определяемым пользователем;
- plot2d2 — строит график в виде ступенчатой функции;
- plot2d3 — строит график в виде вертикальных полосок;
- plot2d4 — строит график с указанием направления;
Для начала попробуем построить параболу через точечную функцию. Для этого определим квадратичную функцию
Теперь нам нужны точки. Для примера определим два вектора в один из которых мы запишем значения аргументов в диапазоне от -10 до 10, а во второй вектор — значения функции от этих аргументов.
Самый простой вызов функции plot2d() заключается в передаче именно этих векторов в качестве аргументов. Если до этого ни одного графического окна не было создано, то оно будет создано автоматически. Вызовите функцию
Вы увидите самый простой график, на котором будут нарисованы две оси с подобранным масштабом. Сам график будет черного цвета. Все остальные элементы графика считаются опциональными и могут быть включены различными способами.
Давайте построим второй график на той же плоскости и множестве аргументов, но введем уже другую функцию, например, кубическую. Вы можете не объявлять функцию отдельно и не заготавливать точки, а передать в качестве аргумента алгебраическое выражение. В этом случае вектор значений функций до построения будет приготовлен за вас на основе тех значений аргумента, которые вы передали.
При таком способе вызова множество значений функции было рассчитано автоматически. Сам график кубической параболы был построен поверх и также черным цветом. Обратите внимание, что масштаб осей изменился так, чтобы было видно точки обеих функций. Множество точек на экране ограниченных квадратом, в который помещаются все точки всех графиков, образует особую область, которую можно масштабировать, уменьшать и увеличивать так, как это нужно пользователю.
Сделайте активным графическое окно. Затем попробуйте покрутить колесико мыши. Таким образом, вы можете управлять масштабом в пределах множества определенных заранее аргументов. Если вы зажмете левую кнопку мыши и попробуете перетащить курсор, то увидите как передвигается область. При этом оси перестраиваются автоматически.
График в графическом окне также является объектом и может быть стерт. Этот процесс может показаться сложным, но на начальном этапе попробуем показать всю суть объектно-ориентированной парадигмы.
Рисование графика — сложный процесс, который заключается в создании объектов в понимании объектно-ориентированного программирования. Например, сначала было создано графическое окно «Figure» (объект), которое затем породило потомков (англ. Children ) «Axes» (оси, которые вы видите на экране). У осей тоже есть потомки и это как раз сами линии графика, которые к ним привязываются.
Любой объект в Scilab является типизованным списком, указатель на который мы и называем дескриптором. Для извлечения параметров графических объектов служит функция get(). Для примера, давайте посмотрим сколько потомков у наших осей
В данном примере функция вернула дескриптор осей текущего графического окна с полным перечнем свойств. Мы можем наблюдать, что оси текущего графического окна имеют два потомка, отраженных в строке children. Чтобы удалить потомков, а следовательно стереть график, необходимо воспользоваться функцией delete(). Давайте удалим график параболы, для чего нужно просто правильно передать дескриптор интересующего нас объекта.
Обратите внимание на то, что дескриптор потомка-параболы имеет индекс 2, так как каждый новый созданный объект занимает позицию (1), тем самым смещая все остальные вверх. Если все сделано правильно, то вы увидите, что график параболы пропал. Если вы обратитесь снова к списку потомков, то увидите, что удаление прошло успешно
Из этого примера, вы должны вынести то, что для успешной работы с внутренними объектами среды достаточно знать их устройство и функции-примитивы (называемые также методами), работающие с этими объектами.
Теперь предлагаем читателю самостоятельно построить график с помощью функции fplot2d(). Напомним, что ей не нужны сами координаты, а нужна формула, по которой значения функции будут рассчитаны. Это удобно, когда вы работаете не с экспериментальными данными, где обычно имеют дело с точечными функциями, а с аналитически определенными функциями. Чтобы функция fplot2d() сработала, ей нужно передать два аргумента: вектор значений аргумента и имя заранее определенной функции (без аргументов).
В рамках данного упражнения, выполните следующие шаги:
- Закройте все графические окна, если они есть.
- Создайте графическое окно.
- Обратитесь к свойству figure_name созданного вами окна (помните что дескриптор сохраняется в ans) и присвойте ему новое значение ‘Мое графическое окно’. Найдите в самом окне изменения.
- Объявите функцию y = g ( x ) = s i n ( x ) 2 + x 2 . <\displaystyle y=g(x)=sin(x)^<2>+x^<2>.>
- Постройте график функции g ( x ) <\displaystyle g(x)>с помощью fplot2d() на множестве от 1 до 10 с шагом 0,1.
- Создайте второе графическое окно и выполните процедуру из предыдущего пункта, но с шагом 1.
- Запишите дескриптор текущего окна в переменную и сделайте вновь активным графическое окно с номером 0.
- Теперь через полученный дескриптор из предыдущего пункта очистите графическое окно 1 от графика и осей (помните, что оси это потомки графического окна).
- Закройте программно все графические окна за один вызов.
Для построения графиков в полярной системе координат служит функция polarplot(). Полный прототип функции выглядит так
Очевидно, что самый простой вызов этой функции схож с вызовом plot2d, а разница лишь в том, как определяется координата каждой следующей точки. Настройка внешнего вида графиков для всего семейства функций-построителей одномерных функций в целом одинаковая, поэтому основные принципы мы рассмотрим ниже.
Построения функций в комплексной плоскости по смыслу похожи на построение в прямоугольной системе координат, где по оси абсцисс отсчитывается действительная часть функции, а по оси ординат — мнимая. Для некоторых частных примеров существуют готовые функции-построители. Некоторые из них(например, построение годографа Найквиста) мы рассмотрим чуть позже.
Опираясь на предыдущий материал самостоятельно постройте графики показанные на рисунке.
Двумерное построение графиков [ править ]
В предыдущих упражнениях мы показали, что по внутренней организации график является объектом (в понимании объектно-ориентированной парадигмы), а точнее говоря существует предопределенный класс, который является формой для создания графиков как объектов. Вы могли видеть полный перечень параметров этого класса, которые определяют поведение конкретного экземпляра этого класса (или того, что мы называем объектом). Также один объект может порождать потомков — экземпляры подмножества классов, для которых данный класс является родительским. Таким образом, зная назначения тех или иных параметров, вы можете полностью управлять объектом как вам нужно. Однако, вы наверное заметили как этих параметров много, а держать их в голове становится не практичным.
К счастью, ручное редактирование параметров в большинстве случаев не нужно, потому что часть параметров заложено в функции-построители, а внешний вид самого графика может быть изменен через встроенный редактор. Кроме того, многие функции для построения графиков имеют похожие прототипы и разница зачастую обусловлена только системой координат.
Полный прототип функции plot2d() имеет следующий вид (квадратные скобки означают необязательные аргументы или флаги)
Здесь мы отметим, что некоторые параметры имеют большое количество возможных значений, что порождает еще большее количество возможных комбинаций. Обычное их перечисление здесь не поспособствует быстрого освоения ими, поэтому мы рекомендуем вам поэкспериментировать самостоятельно со всеми этими параметрами. Для начала мы приведем несколько поучительных примеров. Возможные значения этих параметров мы специально вынесли в приложение к учебнику. Также вы всегда можете воспользоваться справкой Scilab, воспользовавшись командой help.
- цвет графика — синий
- стиль линии — штрих-пунктир
- сетка — включена
- легенда — включена
- подпись графика — имеет надпись «Мой график»
- подписи осей — имеют надписи «Ось абсцисс» и «Ось ординат» соответственно
На рисунке вы видите результат примера 1. Очевидно, что подписи с установками по умолчанию мелковаты, однако их размеры тоже можно увеличить с помощью все того же дескриптораЕсли все сделано правильно, то вы должны увидеть результат показанный на рисунке. Обратите внимание на то, что у осей два потомка: график и легенда. Именно поэтому при обращении к потомкам осей мы указали индекс, указывающий на график. Функция color() возвращает внутренний код цвета по его имени или RGB коду (color(r,g,b)). Никакой ошибки не будет, если ввести код сразу, например, для синего это 2.
На «своей шкуре» вы только что почувствовали как это трудоемко производить настройку вручную. К счастью, разработчики подумали о пользователе и внедрили в среду графический редактор (англ. Graphic Editor ), который сам обращается ко всем параметрам. Пользователю же нужно просто правильно выбрать параметр и ввести в поле значение. Окно редактора строится также как и любое графическое окно с помощью интерфейса Tcl/Tk. Данный интерфейс поддерживается только в версиях для Windows и Unix-подобных систем, т.е. пользователи Mac OS не смогут воспользоваться редактором. В будущей версии 6 разработчики обещали исправить это недоразумение.
Чтобы открыть редактор нужно:
- Сделать активным интересующее вас графическое окно;
- В раскрывающемся меню Правка выбрать пункт Свойства осей….
После этого откроется окно редактора в котором вы увидите слева дерево объектов данного графического окна. Переключаясь по пунктам этого дерева вы будете видеть справа параметры этого окна. Некоторые из них вводятся в поля, некоторые переключаются с помощью ползунков, а некоторые имеют раскрывающееся меню. Если вы не знаете, что делает тот или иной параметр, вы можете поэкспериментировать, так как результат меняется на ваших глазах. Следует помнить, что подписи в окне могут не соответствовать истинным названиям параметров в самом типизованном списке класса.
Пример 2
Построить одновременно графики параболы и кубической параболы разными цветами на множестве от -10 до 10. Настроить разлиновку осей так, чтобы между двумя крупными делениями было 4 маленьких. Оси расчертить крест-накрест
Результат вызова функции из примера 2. Очевидно число 5 кодирует красный цвет, а 6 — фиолетовый. Также видно, что выбранные нами настройки сетки неудачные, так как нарушена эстетическая красота. Настраивать оси лучше через графический редакторДействия над графиками [ править ]
Как вы уже знаете, все функции-построители, вызванные в командном окне, будут рисовать в текущем графическом окне. Это означает, что все объекты, которые будут ими создаваться, будут накладываться поверх уже созданных. Для удаления объектов в графическом окне служит функция delete(), однако, если вы хотите очистить графическое окно сразу, проще воспользоваться функцией
Для получения дескрипторов различных графических объектов существует универсальная функция get(), а также несколько макросов на нее.
Если вы помните номер графического окна, то получить его дескриптор можно с помощью функции
Для установки значения параметра объекта вы, как мы это делали раньше, можете обратиться к параметру, как к полю типизованного списка, однако, есть еще специальная для этого функция set(). Преимущество функции перед простым обращением состоит в том, что вы можете использовать для получения дескрипторов макросы функции get() и не хранить дескрипторы в отдельных переменных.
Управление дескрипторами возможно через функции, реализующие следующие операции:
- copy() — копирование. Позволяет полностью скопировать параметры объекта для записи их в другой дескриптор.
- delete() — удаление. Позволяет удалить любой графический объект вместе с его потомками.
- glue() — объединение. Позволяет объединить несколько графических объектов в один, на который будет ссылаться единственный дескриптор. Это бывает полезным при большом количестве потомков, когда форматирование их по отдельности занимает много времени — в этом случае их можно объединить в объект типа Compound.
- unglue() — разъединение. Операция противоположная glue(). Работает с объектами типа Compound.
- swap_handles() — помена местами. Позволяет поменять местами два объекта на одном уровне иерархии в дереве объектов графического окна.
Управлять графиками можно также с помощью мыши и инструментов графического окна. Все необходимые функции дублируются в раскрывающемся и контекстном меню. Например, чтобы очистить графическое окно, достаточно сделать активным, а затем в раскрывающемся меню Правка выбрать пункт Очистить графическое окно. Кроме того, вы также можете выделять построенные объекты и нажимая правой кнопкой мыши на них, вызывать контекстное меню, в котором доступны такие команды как Удалить, Копировать, Вставить и др. Все эти возможности на самом деле неявный вызов встроенных функций, позволяющие уменьшить количество рутинной работы. Однако, вам не стоит расслабляться по этому поводу, ведь без умения работать с этими функциями из командной строки или сценария, вы не сможете полноценно работать в среде.
В рамках данного упражнения выполним один из приемов и построим на одной графической области два графика. Для построения нескольких графиков на одном графическом окне служит функция xsetech(), которая назначает области построения внутри графического окна (создает подокна). Для примера разместим график параболы в верхней половине окна; в нижней половине разместим график в полярной системе координат для функции ρ = s i n ( 7 ⋅ ϕ ) <\displaystyle \rho =sin(7\cdot \phi )>.
Вы увидите два графика. Для построения, первым вызовом функции xsetech() мы передали позицию (в относительных единицах) на которой будет размещен верхний график. Первые два числа означают позицию верхнего левого угла подокна. Вторые два числа означают длину и высоту в относительных единицах, т.е. 1 означает, что подокно должно растянуться по всей длине, 0.5 — растягивание на половину высоты всего графического окна. Второй вызов xsetech() аналогичен первому, за исключением того, что верхний левый угол второго подокна должен занять позицию на половине высоты всего графического окна.
Очевидно, что полярный график занимает меньше места и плохо просматривается, поэтому давайте перенесем его на другое окно. Операция переноса складывается из трех более мелких: копирование дескриптора осей, регистрация скопированного дескриптора как потомка нового графического окна, удаление дескриптора осей из старого окна. Для примера, провернем эту операцию вручную, через командную строку.
Обратите внимание, что функции copy() мы первым аргументом передали источник, а вторым — место назначение. Сделав видимым окно 1, вы увидите, что график был скопирован с тем же форматированием и занимает ровно нижнюю половину окна, что не являлось первоначальной задумкой. Вообще говоря, функция скопировала разбивку окна 0 целиком, просто не скопировала наш график параболы. Давайте поправим внешний вид графика.
Теперь нарисуем в графическом окне 0 еще один график
Новый график был построен на осях, созданных автоматически с графическим окном, однако на него визуально накладывается график параболы, который существует в подокне. При этом в дереве объектов графического окна график кубической параболы лежит как бы на фоновом слое, а график параболы на внешнем слое. Введите следующие команды
После ввода второй инструкции выделите графическое окно 0 и вы увидите, как два графика поменялись местами: теперь график кубической параболы накладывается поверх графика параболы. Все дело в том, что мы поменяли дескрипторы осей местами, а графическая отрисовка потомков происходит послойно так, что потомок с меньшим индексом оказывается сверху. Так как фоны обоих графиков не являются прозрачными (а это можно всегда настроить), они и перекрывают друг друга.
Вы уже знаете, что за масштабирование осей отвечает параметр axes_bounds. Настроим график кубической параболы.
Хотя формально слой с кубической параболой никуда не делся, мы настроили параметр отрисовки осей так, чтобы они не пересекались с верхним графиком.
Наконец, продемонстрируем функцию glue(), название которой переводится как «клей», что намекает на ее назначение. Склеим оба графика.
Теперь оба графика формально имеют один дескриптор. Применительно к графикам такая группировка редко бывает полезной, так как из-за нее блокируются некоторые операции. Обычно склеивание используется в программируемом рисовании.
Построение графиков трехмерных функций [ править ]
Каждая точка графика трехмерной функции имеет три координаты, одна из которых обычно является функцией от оставшихся двух. Множество этих точек образует поверхность.
В целом построение поверхностей мало отличается от построения графиков одномерных функций и все, что было рассказано ранее, применимо и здесь. Разница главным образом заключается в структуре типизованного списка, в котором добавляется дополнительная ось OZ.
- двухмерный график — график функции с одним аргументом, либо, если функция представлена неявно, одномерной функции;