Страница 10 из 37
Вывод на экран простых графиков Применение графиков в статистике позволяет просто и точно передать смысл данных. График позволяет сразу же понять, как распределены данные и как изменяются их значения. Здесь рассмат- риваются только двумерные графики, использующие двумерную систему координат X-Y. /Получение трехмерных графиков является отдельной дисциплиной и выходит за рамки данной книги/. Имеется две распространенные формы двумерных графиков: стол- биковые диаграммы и точечные графики. В столбиковой диаграмме каждое значение представляется заштри{ованным столбиком. На то- чечном графике каждый элемент изображается точкой с координатами X и Y. Примеры графиков показаны на рис.23.
¦ ¦ ¦ -¬ ¦ ¦ -¬ ¦¦ ¦ ¦ -¬ ¦¦ ¦¦ ¦ ¦ ¦¦ ¦¦ -¬ ¦¦ ¦ ¦ ¦¦ ¦¦ ¦¦ ¦¦ ¦ L-++-++-++-++---- L----------------- 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" не делается этих вычислений, а минимальное и максимальное значения передаются самой процедуре. Это позволяет выводить сразу несколько графиков на один экран без изменения масштаба, накладывая таким образом один график на другой.
|