Применение графиков в статистике позволяет просто и точно
передать смысл данных. График позволяет сразу же понять, как
распределены данные и как изменяются их значения. Здесь рассмат-
риваются только двумерные графики, использующие двумерную систему
координат X-Y. /Получение трехмерных графиков является отдельной
дисциплиной и выходит за рамки данной книги/.
Имеется две распространенные формы двумерных графиков: стол-
биковые диаграммы и точечные графики. В столбиковой диаграмме
каждое значение представляется заштри{ованным столбиком. На то-
чечном графике каждый элемент изображается точкой с координатами
X и Y. Примеры графиков показаны на рис.23.
¦ ¦
¦ ++ ¦
¦ ++ ¦¦ ¦
¦ ++ ¦¦ ¦¦ ¦
¦ ¦¦ ¦¦ ++ ¦¦ ¦
¦ ¦¦ ¦¦ ¦¦ ¦¦ ¦
+---------------- +-----------------
a б
Рис.23. Примеры столбиковой диаграммы (а) и точечного графика
(б)
Столбиковая диаграмма обычно используется при относительно
небольшом количестве данных, например, при представлении валового
национального продукта за последние десять лет или ежемесячного
выпуска на предприятии в процентном отношении. Точечные графики
обычно используются при выводе большого числа данных, например,
для вывода ежедневного курса акций некоторой фирмы в течение го-
да. Применение получила также модификация точечного графика, ког-
да соседние точки соединяют линией.
Разработанные в этой главе графические функции требуют при-
менения ПЭВМ фирмы IBM (или совместимых с ними ПЭВМ) с графичес-
ким адаптером CGA или EGA. Эти подпрограммы рассчитаны на приме-
нении четвертого режима вывода графиков. Графические подпрограммы
используют графические функции Турбо Паскаля версии 4, которые
отличаются от графических функций предыдущих версий. Если вы ис-
пользуете предыдущую версию Турбо Паскаля, то вам потребуется
сделать соответствующие изменения.
Используются следующие графические функции:
Название Назначение
---------------- ----------------------------------------------
InitGraph Инициирует графическое оборудование
SetColor Устанавливает цвет рисунка для большинства
графических программ
SetLine Определяет тип линий, выводимых посредством
процедуры "Line"
Line Выводит линии на экран с текущим цветом
PupPixel Выводит элемент изображения в заданном цвете
RestoreCrtMode Восстанавливает режим работы видеотерминала
в состояние до вызова "InitGraph"
OutTextXY Записывает строку в заданную позицию,
нахoдясь в графическом режиме работы
Эти подпрограммы используют блок "Graph". Подробное описание
этих и других графических функций дается в справочном руководстве
по языку Турбо Паскаль версии 4.
Ниже приводится простая графическая функция, формирующая
столбиковую диаграмму на ПЭВМ фирмы IBM:
uses
crt, graph;
const
MAX = 100;
type
DataItem = real;
DataArray = array [1..MAX] of DataItem;
var
data: DataArray;
procedure Simpleplot(data: DataArray; num: integer);
var
t, incr:integer;
a: real;
ch: char;
GraphDriver, Craphmode : ineger;
x, y : integer;
begin
{ установка режима 4 для адаптеров EGA и CGA }
GraphDriver := CGA ;
Craphmode := CGAC1 ;
InitGraph(GraphDriver, Craphmode, '');
SetColor(1);
SetLineStyle(Solid, 0, NormWidth);
{ вычерчивание сетки }
OutTextXY(0, 191, '0'); { минимум }
OutTextXY(0, 0, '190'); { максимум }
OutTextXY(290, 191, '300'); { число }
for t := 1 to 19 do PutPixel(0, t*10, 1);
SetColor(3);
Line(x, 190, x, 190-y);
SetColor(2);
for t := 1 to num do
begin
a := data[t];
y := trunc(a);
incr := 10;
x := ((t-1)*incr)+20
Line(x, 190, x, 190-y);
end;
ch:= ReadKey;
RestoreCrtMode;
end; { конец процедуры вывывода простого графика }
Для ПЭВМ фирмы IBM режим с максимальной разрешающей способ-
ностью в 320х200 точек устанавливается с помощью процедуры
"InitGraph". Процедура "OutTextXy" устанавливает курсор в позицию
с требуемыми координатами Х и Y и делает вывод заданной строки.
Процедура "Line" имеет следующую общую форму:
Line (начало_Х, начало_Y, конец_Х, конец_Y), где все значе-
ния задаются целыми числами. При выводе строки используется теку-
щий цвет, определенный при вызове процедуры "SetColor". Дополни-
тельные сведения вы можете найти в справочном руководстве по
языку Турбо Паскаль.
В этом примере процедура вывода графика обладает серьезным
недостатком. Предполагается, что все данные находятся в диапазоне
от нуля до 190, поскольку только эти значения можно задавать при
вызове графической функции "Line". Это предположение хорошо сра-
ботает в маловероятном случае, когда ваши данные точно будут ле-
жать в этом диапазоне. Для вывода данных в любом диапазоне значе-
ний эти данные должны быть нормализованы перед выводом так, чтобы
не выходить за допустимый диапазон значений. Нормализация заклю-
чается в поиске коэффициента отношения действительного диапазона
значений данных и физического диапазона разрешающей способности
экрана. Значение каждого данного затем должно быть умножено на
этот коэффициент и получено число, попадающее в диапазон экрана.
Нормализация по оси Y должна делаться по следующей формуле:
250
Y = Y* ---------
(max-min)
где Y является тем значением, которое передается процедуре вывода
графика. Та же формула должна использоваться для расширения шка-
лы, когда диапазон значений данных очень маленький. В таком слу-
чае экран дисплея будет использоваться наиболее рационально.
Функция "BarPlot" масштабирует оси Х и Y и выводит столбико-
вый график для 300 элементов. Предполагается, что по оси Х зада-
ется время с единичным шагом. Процедура нормализации находит ми-
нимальное и максимальное значение в выборке и затем вы - числяет
их разницу. Это число, которое представляет разброс между мини-
мальным и максимальным значениями, затем делится на разрешающую
способность экрана,. Для графического режима 4 это число равно
190 для оси Y и 300 для оси Х /поскольку требуется место для гра-
ничных полей и основной строки/. Полученный коэффициент затем ис-
пользуется для масштабирования данных выборки.
{ вывод столбиковой диаграммы }
procedure BarPlot(data: DataArray; num: integer);
var
x, y, max, min, incr, t:integer;
a, norm, spread: real;
ch: char;
value: string[80];
begin
{ установка режима 4 для адаптеров EGA и CGA }
GraphDriver := CGA ;
Craphmode := CGAC1 ;
InitGraph(GraphDriver, Craphmode, '');
SetColor(1);
SetLineStyle(Solid, 0, NormWidth);
{ сначала для нормализации находится минимальное и
максимальное значение }
max := getmax(data, num)
min := getmin(data, num)
if min>0 then min := 0;
spread := max - min;
norm := 190/spread;
{ вычерчивание сетки }
str(min, value);
OutTextXY(0, 191, value); { минимум }
str(max, value);
OutTextXY(0, 0, value); { максимум }
str(num, value);
OutTextXY(300, 191, value); { число }
for t := 1 to 19 do PupPixel(0, t*10, 1);
SetColor(3);
Line(0, 190, 320, 190);
SetColor(2);
{ вывод данных }
for t := 1 to num do
begin
a := data[t]-min;
a := a*norm;
y := trunc(a);
incr := 300 div num;
x := ((t-1)*incr)+20
Line(x, 190, x, 190-y);
end;
ch := Readkey;
RestoreCrtMode;
end; { BarPlot }
Эта версия программы кроме того делает вывод точек по оси Y.
Расстояние между точками равно 1/20 разнице между максимальным и
минимальным значением. На рис.24 приводится пример столбиковой
диаграммы для двадцати элементов, полученной с помощью процедуры
"BarPlot". Конечно, эта процедура не обладает всеми желательными
свойствами, но она дает хороший вывод одной выборки. Эту процеду-
ру можно легко усовершенствовать и сделать ее более удобной для
конкретного случая.
.95 |
. | |
. | | |
. | | | | |
. | | | | | | |
. | | | | | | |
. | | | | | | | | |
. | | | | | | | | |
. | | | | | | | | | |
. | | | | | | | | | | |
. | | | | | | | | | | | | | |
. | | | | | | | | | | | | | |
. | | | | | | | | | | | | | | | |
. | | | | | | | | | | | | | | | | | | |
. | | | | | | | | | | | | | | | | | | | |
. | | | | | | | | | | | | | | | | | | | |
. | | | | | | | | | | | | | | | | | | | |
__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|
20
Рис 24. Пример столбиковой диаграммы, полученной с помощью
процедуры "BarPlot"
Для получения процедуры по выводу точечных графиков требует-
ся сделать только небольшие изменения в процедуре "BarPlot" Ос-
новное изменение связано с заменой функции "Line" на функцию вы-
вода одной точки. Для этого используется функция "PutPixel" В
общем виде она записывается в следующей форме:
PutPixel(x,y,цвет)
где все аргументы являются целыми числами. Цвет каждой выводимой
точки задается параметром "цвет". Для режима 4 он должен прини-
мать значения от 0 до 3. Ниже приводится функция "ScatterPlot":
{ вывод точечного графика }
procedure ScatterPlot(data: DataArray; num, ymin,
ymax, xmax, xmin: integer);
var
x, y, incr, t:integer;
a, norm, spread: real;
ch: char;
value: string[80];
begin
{ сначала для нормализации находится минимальное и
максимальное значение }
if ymin>0 then ymin := 0;
spread := ymax - ymin;
norm := 190/spread;
{ вычерчивание сетки }
str(ymin, value);
OutTextXY(0, 191, value); { минимум }
str(ymax, value);
OutTextXY(0, 0, value); { максимум }
str(xmax, value);
OutTextXY(300, 191, value); { число }
SetColor(3);
for t := 1 to 19 do PutPixel(0, t*10, 1);
Line(0, 190, 320, 190);
SetColor(2);
{ вывод данных }
for t := 1 to num do
begin
a := data[t]-ymin;
a := a*norm;
y := trunc(s);
incr := 300 div xmax;
x := ((t-1)*incr)+20;
PutPixel(x, 190-y, 2);
end;
end; { конец процедуры вывода точечного графика}
В процедуре "BarPlot" минимальное и максимальное значение
вычисляется внутри процедуры. В отличие от этой процедуры в про-
цедуре "ScatterPlon" не делается этих вычислений, а минимальное и
максимальное значения передаются самой процедуре. Это позволяет
выводить сразу несколько графиков на один экран без изменения
масштаба, накладывая таким образом один график на другой.