Sign in Join
Wiki copytemporary

TAChart documentation/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Обзор
22
33[[TAChart/ru|TAChart]] - это пакет для рисования графиков, схем и других диаграмм. Он [[Comparing TAChart with Delphi's TeeChart Standard|сопоставим по функциям]], но не полностью [[TAChart documentation|совместим]] с Delphi'йским TeeChart. Одно существенное отличие состоит в том, что некоторые функции (например, источники данных и преобразования осей) реализуются через отдельные компоненты, а не через простые свойства диаграммы. Такая конструкция обеспечивает повышенную гибкость и возможность повторного использования кода, но за счет немного более сложного API.
44
55Этот документ предоставляет краткий, но всесторонний обзор концепций, функций и компонентов TAChart. Пошаговое изучение см. в [[TAChart Tutorial: Getting started]] и [[TAChart|других учебных пособиях]].
66
77В документации описан пакет TAChart, который можно найти в последней версии Lazarus для разработки. Некоторые функции могут быть недоступны в официальной версии Lazarus. Мы рекомендуем вам использовать эту последнюю версию документа, поскольку в ней исправлены и улучшены более старые описания в предыдущих версиях, а также тот факт, что в нее включены сведения о новейших функциях.
88
99Тем не менее, вы можете посмотреть \[ старую версию\] этого документа, чтобы увидеть состояние документации на момент выпуска Lazarus 1.0.
1010
1111## Серии
1212
1313![](/wiki-images/5/56/Series_hierarchy.png)Серии (графики, диаграммы) являются центральной частью TAChart. Их иерархия проиллюстрирована на рисунке. Серии, наследуемые от TCustomChartSeries, представляют данные, взятые из [[TAChart documentation/ru|ChartSource]] графическим способом, таким как линии или столбцы; другие серии получают свои данные по-другому.
1414
1515### Диаграмма со сплошной линией
1616
1717Это самый простой тип графика, представляющий «бесконечную» вертикальную или горизонтальную линию. Его можно использовать в качестве «центральной оси» в графиках функций или в качестве перетаскиваемой линии маркера.
1818
1919Кроме того, установив `Active` = true, `Pen.Style = psClear` и `UseBounds = true` и соответствующий `AxisIndexX`, он становится «расширителем оси», гарантируя, что данное значение `Position` всегда будет включена в диапазон оси.
2020
2121### Основные виды диаграмм
2222
2323Основные виды графиков используются наиболее часто и включают в себя [[TAChart documentation/ru|line]], [[TAChart documentation/ru|bar]] и [[TAChart documentation/ru|area]] серии. Все основные серии могут быть «сложены» с помощью [[TAChart documentation/ru|источников со множеством значений]]. Также все базовые серии полностью поддерживают вращение и 3-D рисунок.
2424
2525#### Line-диаграмма
2626
2727`TLineSeries` можно использовать для рисования заданного набора точек, опционально помечая каждую точку данных символом и/или соединяя точки данных линией. Цвет ряда линий определяется свойством `SeriesColor`.
2828
2929`ColorEach` позволяет управлять окраской отдельных точек данных и смежных сегментов линии (цвет точки данных предоставляется источником диаграммы):
3030
3131- `ceNone` - нет отдельной окраски, даже если цвета назначаются элементу данных диаграммы.
3232- `cePoint` - раскрасить только символ точки данных, но не отрезок.
3333- `ceLineAfter` - применить цвет точки данных к сегменту линии, следующему за точкой данных
3434- `ceLineBefore` - применить цвет точки данных к сегменту перед точкой данных
3535- `cePointAndLineAfter, cePointAndLineBefore` - как и раньше, но раскрашивает и символ точки данных.
3636
3737Вы можете получить «пошаговый» вид, установив для свойства `LineType` значение `ltStepXY` или `ltStepYX`.
3838
3939Используя [[TAChart documentation/ru|источник со множеством значений]], `TLineSeries` может обрабатывать несколько значений y для каждого значения x. Если для свойства `Stacked` установлено значение `true`, то отдельные значения y отображаются в виде ряда, то есть второе значение y добавляется к первому, а третье значение y ко второму значению и т.д. Обратите внимание, однако, что в отличие от серий bar или area, может быть неясно, что значения данных сгруппированы, и поэтому укладка в виде рядов обычно не рекомендуется в сериях line.
4040
4141##### Fast lines
4242
4343Некоторые графические пакеты включают в себя специальный график "fast line" для быстрого рисования серии линий из чрезвычайно больших наборов данных (более 10000 точек). TAChart, напротив, содержит оптимизированный быстрый путь внутри стандартного кода серии строк, который обеспечивает сопоставимую скорость рисования.
4444
4545Серия линий будет нарисована очень быстро, если все следующее верно:
4646
4747- Нет отметок.
4848- Нет указателей.
4949- `LineType` не установлено в значение `ltFromOrigin`.
5050
5151Некоторые операционные системы/наборы виджетов могут дополнительно требовать, чтобы свойствам были установлены следующие значения `LinePen.Style=psSolid` и `LinePen.Width=1`.
5252
5353Дополнительного быстродействия можно добиться, если установить `Source.Sorted=true`.
5454
5555Вы можете измерить скорость рисования линий на вашей платформе с помощью демо «line».
5656
5757##### Point-диаграмма
5858
5959`TLineSeries` можно нарисовать как «серию точек», показывающую только символы в позиции точек данных и скрывающую соединительные линии, установив для `ShowPoints` значение `True` и `LineType` для `ltNone`. Обратите внимание, что `SeriesColor` применяется только к соединительным линиям; чтобы указать цвет точек, измените `Pointer.Brush.Color` для заливки и/или `Pointer.Pen.Color` для цвета линии границы. Свойство `Pointer` также предоставляет доступ к фигурам (круг, рамка и т.д.) символов (`Style`).
6060
6161#### Bar-диаграмма
6262
6363`TBarSeries` представляет данные в виде набора полос, простирающихся от `ZeroLevel` до точек данных.
6464
6565Вы можете контролировать ширину полосы с помощью свойства `BarWidthPercent`. Обратите внимание, что оно измеряется относительно соседних полос. Если значения X не равноудалены, полосы будут иметь различную ширину. Чтобы предотвратить это, установите `BarWidthStyle=bwPercentMin`.
6666
6767Вы можете рисовать несколько полос бок о бок, используя свойство `BarOffsetPercent`.
6868
6969Используйте несколько значений Y для создания ряда полос с накоплением (`Stacked=true`). Начиная с Lazarus 2.0, несколько значений Y также могут отображаться в расположении рядом (`Stacked=false`).
7070
7171В дополнение к прямоугольным полосам данные могут быть представлены альтернативными формами: цилиндр, шестиугольная призма, пирамида или конус - см. свойство `BarShape`, которое поддерживает следующие значения: `bsRectangular, bsCylindrical, bsHexPrism, bsPyramid, bsConical`. Кроме того, событие `OnCustomDrawBar` позволяет рисовать столбцы любым заданным пользователем способом.
7272
7373#### Area-диаграмма
7474
7575`TAreaSeries` представляет данные в виде многоугольника, продолжающегося вниз от точек данных, либо до линии `ZeroLevel`, либо к бесконечности (если `UseZeroLevel=false`).
7676
7777Вы можете получить «пошаговый» вид, задав свойство `ConnectType`.
7878
7979Как и `TBarSeries` и `TLineSeries`, ряд областей может принимать несколько значений `Y` для одного и того же `X` из [[TAChart documentation/ru|источника данных со множеством значений]]. Эти значения y отображаются в стопке, если для свойства `Stacked` установлено значение `True` (его значение по умолчанию). Используйте компонент ChartStyles, чтобы определить внешний вид отдельных слоев. (Обратите внимание, что в версиях Lazarus 1.8.x или более ранних ChartStyles не окрашивают последовательно перекрывающиеся слои).
8080
8181Свойство `Banded` (доступно в Lazarus v2.0 +), если установлено в true, подавляет рисование самого низкого уровня стека. Таким образом, полоса значений данных может быть выделена: используйте источник диаграмм с двумя значениями Y - установите первое значение Y на минимум, а второе значение Y на максимальный уровень диапазона. В качестве альтернативы, ширина полосы может быть указана во втором значении Y, если оба свойства `Banded` и `Stacked` установлены в true.
8282
8383Поддержку нескольких значений Y следует применять с осторожностью: при суммировании НЕположительных значений могут получаться графики, которые трудно понять, а ряд непакетированных областей (`Stacked=false`) может пострадать от того, что данные покрываются другими значениями Y. Кроме того, `ZeroLevel` следует включать только в самый низкий уровень стека, чтобы избежать необычных результатов.
8484
8585Трехмерное представление серии может быть получено, если для `Depth` установлено положительное значение, например, 10 или 20. Обратите внимание, что алгоритм рисования очень прост и, скорее всего, даст неправильно отображение при пересечении кривых, или при отключенных свойствах укладки и объединения.
8686
8787### Диаграмма со множеством значений
8888
8989Для графика со множеством значений требуется [[TAChart documentation/ru|источник данных со множеством значений]] и использование дополнительных значений X и/или Y в качестве дополнительных параметров для рисования сложных фигур.
9090
9191#### Bubble-диаграмма
9292
9393`TBubbleSeries` представляет данные в виде окружностей переменного радиуса с центром в точках данных. Для этой серии требуется источник с `YCount` не менее 2, и в качестве радиуса пузырька используется первое дополнительное значение Y.
9494
9595Свойство `OverrideColor` позволяет установить цвет внутренней части или края каждого пузырька в отдельности.
9696
9797#### Диаграмма Box-and-whiskers
9898
9999`TBoxAndWhiskerSeries` представляет данные в виде прямоугольников с центральной линией и двумя Т-образными формами, выступающими в обоих направлениях. Хотя в статистике [ящик с усами (диаграмма размаха)](https://ru.wikipedia.org/wiki/%D0%AF%D1%89%D0%B8%D0%BA_%D1%81_%D1%83%D1%81%D0%B0%D0%BC%D0%B8) должен основываться на конкретных квартилях данных, TAChart не применяет это, позволяя пользователям рисовать произвольные графики.
100100
101101Иногда можно использовать серии блоков и усов, чтобы представить другие диаграммы другого значения, но схожего внешнего вида, такие как [диаграммы Гантта](https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%93%D0%B0%D0%BD%D1%82%D1%82%D0%B0).
102102
103103Для этой серии требуется источник с `YCount` не менее 5, и используются значения Y следующим образом:
104104
105105| Index | Usage |
106106|-------|-----------------------|
107107| 0 | Нижний ус |
108108| 1 | Нижняя граница ящика |
109109| 2 | Центральная линия |
110110| 3 | Верхняя граница ящика |
111111| 4 | Верхний ус |
112112| | |
113113
114114#### Диаграмма Open-high-low-close
115115
116116`TOpenHighLowCloseSeries` представляет данные в виде вертикальных линий с двумя галочками, как описано [здесь](https://en.wikipedia.org/wiki/Open-high-low-close_chart).
117117
118118Обычно требуется `YCount` не менее 4 и используются значения Y следующим образом:
119119
120120| Свойство | По умолчанию | Использование |
121121|-------------|--------------|--------------------------|
122122| YIndexLow | 0 | Нижняя точка линии |
123123| YIndexOpen | 1 | Положение галочки слева |
124124| YIndexClose | 2 | Положение галочки справа |
125125| YIndexHigh | 3 | Верхняя точка линии |
126126| | | |
127127
128128> **Note:** хотя предполагается, что значения Y упорядочены в порядке возрастания по приведенной выше таблице, ряды сами упорядочивания не сделают и будут отображать любые предоставленные данные.
129129
130130#### Field-диаграмма
131131
132132`TFieldSeries` отображает вектор в каждой точке данных. Вектор рисуется как отрезок с необязательной стрелкой. Линия центрируется по координатам X,Y, хранящимся в источнике диаграммы, ее направление задается дополнительными значениями, хранящимися в XList и YList источника диаграммы. Следовательно, для этого типа серии требуется источник с двумя значениями X и Y:
133133
134134| Поле элемента данных источника | Использование |
135135|--------------------------------|--------------------------------|
136136| X | X координата центра линии |
137137| Y | Y координата центра линии |
138138| XList\[0\] | X координата направления линии |
139139| YList\[0\] | Y координата направления линии |
140140| | |
141141
142142Метод `AddVector(x,y: Double; vectorx, vectory: Double; ALabel: String = ''; AColor: TColor = clTAColor)` помогает правильно назначить все значения внутреннему списку источника.
143143
144144Чтобы избежать наложения векторов, вызовите метод `Normalize Vector(Length: Double)`,дабы нормализовать их длины так, чтобы самый длинный вектор имел указанную длину.
145145
146146Параметры стрелки понимаются как проценты от длины вектора, то есть стрелка становится меньше для более коротких векторов.
147147
148148### Круговые диаграммы
149149
150150Радиальные серии игнорируют преобразования осей. Вы можете увидеть примеры радиальных рядов в demo "radial".
151151
152152#### Pie-диаграмма
153153
154154`TPieSeries` рисует круговые диаграммы.
155155
156156Для каждой точки данных круговая серия интерпретирует значение Y как относительный размер среза, а значение X как расстояние среза от центра круговой диаграммы (только если свойство `Exploded` имеет значение true).
157157
158158Начиная с `StartAngle`, круговая диаграмма вращается против часовой стрелки по всему кругу.
159159
160160Радиус круга можно установить вручную с помощью свойства `FixedRadius` или рассчитать автоматически, чтобы вся серия, включая все метки, точно соответствовала родительской диаграмме.
161161
162162Кольцо можно нарисовать вместо кругового фрагмента, задав свойству `InnerRadiusPercent` значение больше 0, но меньше 100 - это определяет радиус внутреннего круга в процентах от общего радиуса.
163163
164164Цвета кусочка определяются полем `Color` элементов данных или жестко закодированной палитрой. Контуры срезов отрисовываются с использованием свойства `EdgePen`.
165165
166166Существует несколько опций для позиционирования метки, управляемых свойством `MarkPositions`:
167167
168168- `pmpAround` -- отметки рисуются вне круговой диаграммы на продолжении или радиус-векторе для каждого кусочка
169169- `pmpInside` --отметки нарисованы внутри каждого кусочка
170170- `pmpLeftRight` -- отметки рисуются непосредственно слева или справа от кусочка
171171
172172`MarkDistance` определяет расстояние между начальной точкой метки и меткой. Начальная точка определяется `MarkPositionCentered` как периметр круговой диаграммы (`false`) или центр (`true`). `MarkDistancePercent`, если установлено значение `true`, интерпретирует `Marks.Distance` как процент от радиуса круговой диаграммы. В противном случае оно интерпретируется в единицах изображения.
173173
174174Если `RotateLabels` имеет значение true, каждая метка дополнительно поворачивается, чтобы (если `LabelFont.Orientation=0`) она была параллельна радиус-вектору своего кусочка.
175175
176176Если для значения Y элемента данных установлено значение NaN, он станет [[TAChart documentation/ru|скрытым]] элементом. Если значение X установлено в NaN, элемент не рисуется, но место для него все еще зарезервировано. Это позволяет рисовать «частичные» круговые диаграммы.
177177
178178Круговые диаграммы имеют ограниченную поддержку для трехмерного рисования. Свойство `Depth` определяет толщину круга. `Orientation` дополняет нормальный вид (`poNormal`) скошенным видом наклонной (`poHorHorizontal`) и вертикальной (`poVertical` ) круговой серии, последние две управляются свойством `ViewAngle` в градусах от 0 до 89. Поскольку TAChart не реализует алгоритм истинной скрытой линии/скрытой поверхности, в некоторых комбинациях могут быть некоторые изменения артефактов рисования параметров.
179179
180180#### Polar-диаграмма
181181
182182`TPolarSeries` представляет данные в виде точек в [полярной системе координат](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82).
183183
184184Начало полярной системы координат определяется в координатах графа свойствами `OriginX` и `OriginY`.
185185
186186Для каждой точки данных значение X интерпретируется как угол в радианах, а значение Y - как расстояние от центра.
187187
188188TPolarSeries не поддерживает преобразования осей.
189189
190190Некоторые дополнительные свойства:
191191
192192- `CloseCircle`: если имеет значение `true`, последняя точка связана с первой.
193193- `Filled`: если имеет зачение `true`, то многоугольник точек серии заполняется с использованием текущего значения `Brush`. Если `CloseCircle` равно false, заливка отправляется в начало координат.
194194- `ShowPoints`: если имеет значение `true`, то указатель серии рисуется в позиции каждой точки данных.
195195
196196### Диаграммы с пользовательской отрисовкой
197197
198198Предоставляет события `OnDraw` и `OnGetBounds`, чтобы разрешить произвольную пользовательскую отрисовку на TChart. Обратите внимание, что использование `TChart.Canvas` напрямую крайне нежелательно и часто не будет работать должным образом.
199199
200200### Диаграммы функций
201201
202202Диаграммы функций - это рекомендуемый способ рисования функциональных графиков, в отличие, например, от предварительного вычисления данных функций и использования [[TAChart documentation/ru|line-диаграмм]]. Они обеспечивают независимый от масштаба контроль плавности и скорости рисования.
203203
204204Вы можете увидеть примеры функциональных серий в демо "func".
205205
206206#### Диаграммы функций
207207
208208`TFuncSeries` представляет одномерную функцию, определенную событием `OnCalculate`. Функция рассчитывается для каждого свойства `Step` пикселя изображения, поэтому вы можете использовать его для увеличения «гладкости» или скорости рисования.
209209
210210Свойство `Extent` можно использовать для установки экстентов x и y с целью вычисления [[TAChart documentation/ru|полного экстента]] диаграммы. Однако во время рисования это свойство игнорируется, и функция будет отображаться в соответствии с текущим экстентом.
211211
212212Свойство `DomainExclusion` позволяет исключить некоторые интервалы из функциональной области. TFuncSeries правильно рисует точки разрыва, установленные `DomainExclusion`. В настоящее время `DomainExclusion` можно установить только во время выполнения, вызвав процедуры `AddRange` или `AddPoint`. Интервалы, определенные `DomainExclusion`, по умолчанию закрыты, то есть содержат конечные точки; это означает, что функция не рассчитывается в конечных точках. Если исключение домена должно содержать конечные точки (при необходимости для функции `y=sqrt(x)`) вызовите `AddRange` с соответствующим элементом набора `TIntervalOptions=(ioOpenStart,ioOpenEnd)` в качестве необязательного третьего параметра.
213213
214214Свойство `DomainExclusion.Epsilon` контролирует расстояние между конечной точкой и последней нарисованной точкой (конечно, в случае открытого интервала кривая начинается непосредственно в конечной точке). `Epsilon` можно настроить в тех редких случаях, когда значение по умолчанию 1E-6 не дает правильных результатов.
215215
216216#### Диаграммы метаматических выражений
217217
218218`TExpressionSeries` аналогичен `TFuncSeries`, но функция указана в виде строки математического выражения, например `'sin(1.23456*x)'` ( свойство `Expression`). Диаграмма создает экземпляр [[How To Use TFPExpressionParser|FPExpressionParser]] для анализа строки и вычисления значений функции. Таким образом, функции могут быть нанесены на график во время разработки.
219219
220220Свойство `Params` позволяет определять параметры для термина функции; в инспекторе объектов он открывает редактор коллекций, в котором каждый параметр может быть указан его именем (как используется в выражении) и его значением. Если, например, параметр `f` определен со значением `1.23456`, то приведенное выше выражение также можно записать как `'sin(f*x)'`.
221221
222222Аналогично `TFuncSeries`, исключения доменов поддерживаются для определения областей, в которых функция не может быть рассчитана. Но в соответствии с математическими соглашениями `TExpressionSeries` требует в свойстве `Domain` задавать регион, в котором функция **определена** (дополнение к исключениям домена). Регион задается строкой, такой как `'x >= 0'`. Если существует несколько условий, они должны быть разделены двоеточием, например `'x < -1; x > 1'`. Двоеточие имеет функцию логического выражения ИЛИ. Интервал определяется как `'-1 < x < 1'`. Постоянные части условий также могут быть математическими выражениями - в следующем примере точка pi/2 исключается из вычисления значений функции: `'x <> pi/2'`. Десятичные числа должны вводиться с точкой в ​​качестве десятичного разделителя, независимо от того, как он определен в системных настройках языка операционной системы.
223223
224224> **Note:** Параметры и домены должны быть определены до начала ввода выражения, в противном случае парсер сообщит об ошибке.
225225
226226#### Диаграммы B-spline
227227
228228`TBSplineSeries` рисует [B-сплайн](https://ru.wikipedia.org/wiki/B-%D1%81%D0%BF%D0%BB%D0%B0%D0%B9%D0%BD) с заданным свойством `Degree`, используя [Алгоритм Де Бора](https://en.wikipedia.org/wiki/De_Boor's_algorithm).
229229
230230Сегменты сплайнов короче пикселей `Step` представлены прямыми линиями.
231231
232232#### Диаграмма Cubic spline
233233
234234`TCubicSplineSeries` рисует кривую данных как [кубический сплайн](https://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%B1%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BF%D0%BB%D0%B0%D0%B9%D0%BD), используя стандартный пакет FPC *NumLib*.
235235
236236В Lazarus v2.0+ свойство `SplineType` позволяет выбирать между сплайнами [natural](https://en.wikipedia.org/wiki/Spline_interpolation) и [monotone Hermite](https://en.wikipedia.org/wiki/Monotone_cubic_interpolation), при этом последний избегает превышения интерполяции.
237237
238238Функция сплайна рассчитывается для каждого `Step` пикселя изображения, поэтому вы можете использовать это свойство для увеличения «сглаживания» или скорости рисования.
239239
240240Источник данных должен содержать не менее двух точек и строго увеличивать координаты X (старые версии Lazarus до версии 2.0 требуют, как минимум, 4 точки данных; для меньшего количества точек вместо сплайна рисуется многоугольник, с использованием свойства `BadDataPen`\>, если установлена опция `csoDrawFewPoints`.)
241241
242242Если значения X не упорядочены и установлена опция `csoDrawUnorderedX`, сплайн будет отрисован без учета проблемных точек с использованием `BadDataPen`.
243243
244244Параметры `csoExtrapolateLeft` и `csoExtrapolateRight` позволяют задавать естественную экстраполяцию слева и справа соответственно.
245245
246246#### Fit-диаграммы
247247
248248`TFitSeries` выполняет подгонку [методом наименьших квадратов](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%85_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BE%D0%B2), используя процедуры вычисления, содержащиеся в стандартном пакете [[numlib|Numlib]] из FPC. Основным соединительным элементом является TAFitLib, который является автономным и может применяться также без TAChart.
249249
250250Функция подбора выбирается через свойство `FitEquation`:
251251
252252- `fePolynomial`: *y* = *b*<sub>0</sub> + *b*<sub>1</sub>*x* + *b*<sub>2</sub>*x*<sup>2</sup> + … + *b*<sub>n</sub>*x*<sup>n</sup>, где значение *n* контроллируется свойством `ParamCount` (`ParamCount = n + 1`).
253253- `feLinear`: *y* = *a* + *bx*
254254- `feExp`: *y* = *a* * e*<sup>bx</sup>*
255255- `fePower`: *y* = *a* * *x*<sup>b</sup>
256256- `feCustom`: *y* = *b*<sub>0</sub>X<sub>0</sub>(*x*) + *b*<sub>1</sub>X<sub>1</sub>(*x*) + *b*<sub>2</sub>X<sub>2</sub>(*x*) + … + *b*<sub>n</sub>X<sub>n</sub>(*x*) где значение *n* контроллируется свойством `ParamCount` (`ParamCount = n + 1`), и X<sub>i</sub>(*x*), *i* = 0..*n*, являются «базовыми функциями», которые определяются методом `SetFitBasisFunc(AIndex: TFitFuncIndex; AFitFunc: TFitFunc; AFitFuncName: String)`.
257257 - `AIndex` - индекс *i* базовой функции, `1..MaxInt`.
258258 - `AFitFuncName` - текстовое представление функции, используемой для легенды по умолчанию.
259259 - `AFitFunc` - адрес базовой функции X<sub>i</sub>(*x*), которая имеет сигнатуру `function(x: ArbFloat; Param: Integer): ArbFloat` с `ArbFloat`, являющимся общим типом данных с плавающей точкой в FPC [[numlib|Numlib]] (unit typ). Некоторые базовые функции легко доступны в модуле *TAFitLib*:
260260
261261``` pascal
262262function FitBaseFunc_Const(x: ArbFloat; Param: Integer): ArbFloat; // константа
263263function FitBaseFunc_Linear(x: ArbFloat; Param: Integer): ArbFloat; // линейный член (x)
264264function FitBaseFunc_Square(x: ArbFloat; Param: Integer): ArbFloat; // квадратный член (x^2)
265265function FitBaseFunc_Cube(x: ArbFloat; Param: Integer): ArbFloat; // кубический член (x^3)
266266function FitBaseFunc_Poly(x: ArbFloat; Param: Integer): ArbFloat; // power term (x^Param)
267267function FitBaseFunc_Sin(x: ArbFloat; Param: Integer): ArbFloat; // sin(x*Param)
268268function FitBaseFunc_Cos(x: ArbFloat; Param: Integer): ArbFloat; // cos(x*Param)
269269```
270270
271271По умолчанию параметры `b`<sub>`0`</sub>`, b`<sub>`1`</sub>`, ..., a, b` варьируются в процессе подбора так, что среднее значение квадратичного отклонения между данными и подобранными кривыми было сведено к минимуму. Однако также возможно поддерживать один или несколько параметров подгонки постоянными, например, чтобы заставить подобранную прямую линию проходить через начало координат. Для этого значения постоянных параметров должны быть указаны в ';' или '\|' для разграничения списка строковых значений свойства `FixedParams`. Порядок значений должен соответствовать порядку подгоночных параметров. Параметры переменных можно оставить пустыми или заменить нечисловой строкой.
272272
273273Пример: `FixedParams='var;2'` (или короче: `';2'`) означает, что первый подходящий параметр является переменной, но второй параметр остается постоянным со значением 2; если имеется более 2 параметров, остальные также считаются переменными.
274274
275275Диапазон подгонки обычно определяется экстентом диаграммы, но может быть установлен вручную через свойство `FitRange`. Функция подгонки рисуется по всей оси, если только `DrawFitRangeOnly=true`.
276276
277277Когда подгонка завершена, `ErrCode` диаграммы устанавливается так, чтобы показать, был ли расчет успешным или нет:
278278
279279- `fitOK`: успешно
280280- `fitDimError`: расчет был прерван, потому что размеры массивов данных (x, y, полоса ошибок y) не совпадают.
281281- `fitMoreParamsThanValues`: расчет не удался, потому что есть больше подгоночных параметров, чем значений данных.
282282- `fitNoFitParams`: расчет прерван, потому что параметры подгонки не указаны. Это может произойти случайно, если все параметры подгонки будут исправлены в свойстве `FixedParams`.
283283- `fitSingular`: матрица дизайна задачи подгонки оказывается (почти) единственной.
284284- `fitNoBaseFunction`: для случая `FitEquation=feCustom` указано недостаточно базовых функций подгонки.
285285
286286Метод `ErrorMsg` создаст текст для сообщения об ошибке из текущего `ErrCode`.
287287
288288Событие `OnFitComplete` вызывается после того, как найдено уравнение подгонки, но до начала рисования. Это хорошее место для запроса результатов процедуры подбора:
289289
290290- `Param[AIndex]` является наиболее подходящим значением для параметра с указанным индексом, `AIndex = 0..ParamCount-1`.
291291- `ParamError[AIndex]` сообщает неопределенность ("standard error" (стандартная ошибка) в статистическом выражении) соответствующего параметра подгонки.
292292- Процедура `GetConfidenceLimits(AIndex: Integer; out ALower, AUpper: Double)` возвращает диапазон между `ALower` и `AUpper`, в пределах которого ожидается наилучшее соответствие того, что параметр будет найден с вероятностью, указанной в `ConfidenceLevel` (по умолчанию: `0.95`, т.е. 95%).
293293- `Param_tValue[AIndex]` возвращает значение [t-статистики](https://en.wikipedia.org/wiki/T-statistic) для соответствующего параметра подгонки. Это соотношение стоимости, деленное на стандартную ошибку. Для точного параметра значение t должно быть намного больше 1.
294294- `Param_pValue[AIndex]` - это вероятность того, что любое значение `t`, столь же высокое, как `Param_tValue`, будет случайно получено для данных степеней свободы. Чтобы «доверять» подобранному значению с уверенностью, заданной `ConfidenceLevel`, значение p должно быть меньше, чем `1 - ConfidenceLevel`, по умолчанию 0,05.
295295- `FitStatistics` сообщает о других статистических параметрах, полезных для проверки достоверности подобранной модели или для дальнейших статистических расчетов. Эти данные доступны как свойства или функции этого класса:
296296 - `N` (integer): количество точек данных, используемых для подгонки. Обратите внимание, что это может быть меньше точек данных, предоставленных источником диаграммы, поскольку он может содержать значения NaN, которые пропускаются.
297297 - `M` (integer): количество подгоночных параметров. Обычно это значение `ParamCount`, но если определенные параметры вынуждены быть постоянными (`FixedParams`), их количество вычитается.
298298 - `DOF` (integer): "degrees of freedom" (cтепени свободы) - это разница `N - M`, важный параметр в статистическом анализе результатов подбора.
299299 - `SST`: "total sum of squares" (общая сумма квадратов) - это сумма квадратов члена `(y[i] - ymean)/dy[i]` по всем точкам данных. Здесь `y[i]` - это значение `y` точки данных с индексом `i`, `dy[i]` размера ее полосы ошибок (стандартное отклонение) - или 1, если недоступно, а `ymean` - это среднее значение `y[i]/dy[i]`. Количество определяет общее изменение точек данных вокруг их среднего значения.
300300 - `SSE`: "error sum of squares" (сумма ошибок квадратов) - изменение точек данных вокруг подогнаной кривой, т.е. сумма `((y[i] - ycalc(x[i])/dy[i])^2)`; здесь `ycalc(x[i])` - вычисленное значение подгоночной кривой в точке `x[i]`.
301301 - `SSR`: "regression sum of squares" (сумма квадратов регрессии) - изменение только подогнанной кривой, то есть сумма `((ycalc(x[i]) - ymean)/dy[i])^2`.
302302 - `xBar`: среднее значение координат `x` всех используемых точек данных.
303303 - `SSx`: изменение координат `x` точек данных, то есть сумма `(x[i] - xbar)^2`.
304304 - `VarCovar[i, j: Integer]: Double`: является элементом матрицы дисперсии-ковариации для параметров подгонки при данных индексах.
305305 - `R2`: "коэффициент детерминации". Это - соотношение `SSR/SSE`, и описывает, насколько сильно разброс данных объясняется подобранной кривой. Значение 1 для идеальной подгонки и 0 для абсолютной без соглашения.
306306 - `AdjR2`: был введен для компенсации эффекта, который обычно увеличивается `R2`, добавляя все больше и больше подходящих параметров.
307307 - `Chi2`: другое слово для `SSE`. По сути, это статистическая величина, которая минимизируется во время процедуры подбора. Данное значение является минимальным найденным значением.
308308 - `ReducedChi2`: это `Chi2` (или: `SSE`), которое нормализовано по степеням свободы, то есть изменению данных вокруг подобранной кривой на степень свободы. Должно быть "маленьким" для хорошей подгонки.
309309 - `ResidualStdError`: общая стандартная ошибка подгонки. Должно быть "маленьким".
310310 - `pValue`: (дробная) вероятность того, что остаточный разброс точек данных вокруг подобранной кривой является случайным. Должно быть высоким, на практике несколько десятков, хотя иногда значения до 0,001 по-прежнему принимаются. Если в подбор не включены никакие полосы ошибок, иногда p оказывается равным 0 или 1 - такие значения следует игнорировать.
311311- Процедуры `GetLowerConfidenceInterval(const Ax: Double; out AY: Double)`, `GetUpperConfidenceInterval`, `GetLowerPredictionInterval` и `GetUpperPredictionInterval` могут быть подключены к событию `OnCalculate` TFuncSeries, чтобы построить границы нижнего и верхнего доверительных интервалов и интервалов прогнозирования вокруг подобранной кривой. Эти пределы определяют области вокруг подобранной кривой, в пределах которых можно ожидать общую подгоночную кривую (доверительный интервал) или отдельные точки данных (интервал прогнозирования) на основе вероятности, заданной `ConfidenceLevel`.
312312- Примечание: все эти статистические данные предполагают, что остаточные ошибки соответствуют нормальному распределению и что столбцы ошибок были оценены надлежащим образом.
313313
314314`EquationText` возвращает интерфейс `IEquationText`, который позволяет построить строку, представляющую уравнение соответствия. Вы можете переопределить имена переменных *x* и *y*, числовой формат и, наконец, получить строку из функции `Get`. Обратите внимание, что преобразование из IEquationText в String определено, поэтому обычно нет необходимости явно вызывать `Get`.
315315
316316Legend.Format-свойство fit series поддерживает дополнительный аргумент формата ('%2:s'), указывающий на текст уравнения по умолчанию.
317317
318318После изменения параметров `TFitSeries` уравнение будет пересчитано на следующем отрисовке диаграммы. Чтобы немедленно пересчитать его, вызовите процедуру `ExecFit`. Используйте свойство `State`, чтобы проверить правильность текущего уравнения.
319319
320320#### Диаграмма цветовых карт
321321
322322`TColorMapSeries` представляет собой двумерную функцию, определенную событием `OnCalculate` как поле пикселей, цвет которого зависит от значения функции.
323323
324324Диаграмма отображается в виде набора прямоугольников размером `StepX` с помощью `StepY` пикселей. Функция вызывается один раз для каждого прямоугольника.
325325
326326Цветовые значения определяются одной из встроенных палитр (свойство `BuiltinPalette = cmpHot, cmpCold, cmpRainbow, cmpMonochrome`). Диапазон значений, сопоставленных с цветами палитры, должен быть указан в `BuiltinPaletteMax` и `BuiltinPaletteMin`, иначе результаты не будут предсказуемыми.
327327
328328Альтернативно, внешний ChartSource может быть назначен свойству `ColorSource`, которое должно быть отсортировано. Каждая точка данных источника диаграммы интерпретируется как имеющая значение X, соответствующая значению Color. Если фактическое значение попадает между уровнями цвета, оно может быть либо линейно интерполировано (если `Interpolate` равно `true`), либо округлено до ближайшего уровня.
329329
330330В случае, когда `Legend.Multiplicity=lmPoint`, диаграмма цветовых карт будет отображать уровни цвета в [[TAChart documentation/ru|Легенде]].
331331
332332#### Диаграмма цветовых карт выражения
333333
334334аналогична диаграмме цветовых карт с тем отличием, что двумерная функция определяется не событием, а математическим выражением, таким как `x^2+y^2`, как и в TExpressionSeries, но теперь с двумя переменными `x` и `y`. Переменные могут быть переименованы с помощью свойств `VariableNameX` и `VariableNameY`. Аналогично TExpressionSeries также можно вводить параметры (свойство `Params`). Домены, однако, не поддерживаются, функция должна быть определена во всем видимом диапазоне x/y.
335335
336336## Источники
337337
338338![](/wiki-images/7/72/Chartsource_hierarchy.png)Данные могут попасть в график из разных источников. Они реализованы как набор компонентов, производных от `TCustomChartSource`.
339339
340340Чтобы назначить источник диаграмме, вы можете задать свойство `Source`. Если свойство оставлено неназначенным, диаграмма будет использовать свой собственный встроенный список источников. Такие методы, как `AddXY`, делегируются текущему источнику диаграммы. Обратите внимание, что список источника является единственным редактируемым источником, поэтому после назначения, например, случайного источника диаграммы для серии, вызов `AddXY` вызовет исключение.
341341
342342Каждый элемент данных имеет следующие поля: `X`, `Y`, `XList`, `YList`, `Color`, `Text`.
343343
344344### Отсортированные источники
345345
346346Если известно, что значения X источника возрастают, возможны некоторые дополнительные оптимизации, такие как бинарный поиск. Таким образом, все источники имеют свойство `IsSorted`, которое помогает определить это.
347347
348348В Lazarus 2.1+ [[TAChart documentation/ru|TListChartSource]] можно отсортировать по нескольким критериям:
349349
350350- `SortBy` = `sbX`, `sbY`, `sbText`, `sbColor`, `sbCustom`: сортировка по значению X или Y, тексту, цвету или определенным пользователем способом соответственно. В последнем случае должен быть предоставлен обработчик для события `OnCompare`.
351351- `SortIndex`: индекс значений X или Y, используемый для сортировки.
352352- `SortDir` = `sdAscending`, `sdDescending`: сортировка в порядке возрастания или убывания.
353353
354354Когда источник сортируется по чему-либо, кроме x, это влияет только на порядок отрисовки связанных рядов, и возможно, что на диаграмме ничего не изменится. Визуальный эффект заметен для
355355
356356- [[TAChart documentation/ru|TPieSeries]] потому что порядок точек данных определяет порядок срезов по кругу
357357- [[TAChart documentation/ru|TBubbleSeries]] когда пузырьки перекрываются. Используйте сочетание `SortBy=sbY`, `SortIndex=1` и `SortDir=sdDescending`, чтобы избежать покрытия пузырьков, потому что сначала появляются большие пузырьки, а маленькие - последними.
358358- все серии унаследованы от [[TAChart documentation/ru|TBasicPointSeries]], когда `XCount` связанного источника диаграммы равен 0: в этом случае значение X источника игнорируется и заменяется индексом точки данных. Поскольку индекс точек данных изменяется при сортировке, точки данных будут автоматически переставлены в отсортированном порядке - см. Пример *sort_demo* в папке *demo*.
359359
360360### Источники с множеством значений
361361
362362Источники могут содержать несколько значений Y для каждого значения X. Эти значения хранятся в поле `YList` исходного элемента данных. Количество значений Y определяется свойством `YCount`. Обратите внимание, что первое значение Y в любом случае сохраняется в поле Y, поэтому `YCount=3` означает, что значения хранятся в `Y`, `YList[0]` и `YList[1]`.
363363
364364Дополнительные значения могут использоваться в различных сериях - например, столбчатые диаграммы с накоплением или пузырьковые диаграммы.
365365
366366Более того, также возможно сохранять несколько значений X для одной и той же точки данных. Это требуется для `TFieldSeries`. Эти дополнительные значения X хранятся в `XList` исходного элемента данных. Как и в случае со значениями Y, общее количество значений X задается свойством `XCount`, которое содержит "обычное" значение X плюс длину массива `XList`.
367367
368368### Пропуск исходных элементов
369369
370370Можно указать TAChart пропустить рисование некоторых исходных элементов, не удаляя их из источника. Это может быть полезно как для оптимизации, так и для пользовательского интерфейса.
371371
372372Чтобы пропустить элемент, присвойте [NaN](http://www.freepascal.org/docs-html/rtl/math/nan.html) либо значению X, либо одному из значений Y. Точный эффект пропуска зависит от серии, но обычно установка X в NaN означает пропуск всего элемента, в то время как установка Y или некоторого элемента YList означает пропуск только этого значения Y, при этом все еще отрисовывая другие.
373373
374374Также обратите внимание, что если вы установите NaN только для одной координаты, другая все равно будет участвовать в вычислении экстента.
375375
376376В случае составных серий неясно, как следует обрабатывать отсутствующее значение, когда к нему добавляются следующие уровни. В Lazarus v2.1 + есть свойство `StackedNaN`, которое можно выбрать как
377377
378378- `snReplaceByZero` - отсутствующее значение считается нулевым; это как Excel обрабатывает этот случай.
379379- `snDoNotDraw` - пропускает всю точку данных со всеми уровнями стека.
380380
381381Вы можете увидеть примеры пропуска элементов в демо "nan".
382382
383383### Планки погрешностей
384384
385385`TLineSeries`, `TBSplineSeries`, `TCubicSplineSeries` и `TFitSeries` могут отображать планки погрешностей(error bars) в каждой точке данных. Размер планок погрешностей в направлениях `x` и `y` определяется параметрами в свойствах `XErrorBarData` и `YErrorBarData` соответственно:
386386
387387- `Kind: TChartErrorBarKind`: определяет, как интерпретируются следующие данные
388388 - `ebkNone`: игнорировать - планки погрешностей отображаться не будут
389389 - `ebkConst`: все точки данных имеют одинаковую планку погрешности, заданную `ValuePlus` и `ValueMinus`.
390390 - `ebkPercent`: значения `ValuePlus` и `ValueMinus` понимаются как процент от значений данных.
391391 - `ebkChartSource`: каждая точка данных может иметь отдельную планку погрешности. Длина планок погрешностей сохраняется в XList или YList источника многозначной диаграммы. Индекс среди всех значений x и y задается `IndexPlus` и `IndexMinus` для положительной и отрицательной планки погрешности соответственно.
392392- `ValuePlus` и `ValueMinus`: длина столбцов положительных и отрицательных погрешностей соответственно. В зависимости от настройки `Kind` предполагается, что значение является постоянным для всех точек данных (`Kind = ebkConst`, единицы оси) или в процентах от значения точки данных (`Kind = ebkPercent`). Оба значения должны быть положительными числами, за исключением `ValueMinus = -1`, который указывает, что отрицательная планка погрешности должна быть равна положительной планке погрешности.
393393- `IndexPlus` и `IndexMinus` используются, когда `Kind` равен `ebkChartSource` и указывают индекс x или y в многозначном chartsource, из которого можно получить длину планки погрешности для отдельных точек данных. Предположим, что источник диаграммы содержит два значения x (`XCount = 2`) и `XErrorBarData.ValuePlus` равно 1, тогда второе значение x (хранящееся в `XList[0]`) используется для положительной длины планки погрешности. Если `IndexMinus` равно -1, то предполагается, что длина отрицательной планки погрешности равна длине положительной планки погрешности без необходимости предоставления явного значения в источнике диаграммы.
394394
395395> **Note:** Использование нескольких значений `y` для других целей, кроме отдельных планок погрешностей, не рекомендуется в этом контексте, поскольку настоящая реализация может отображать планки погрешности только для значения `y` с индексом 0.
396396
397397Каждый тип серии, поддерживающий планки погрешностей, имеет дополнительные свойства `XErrorBars` и `YErrorBars`, которые определяют, как планки погрешностей будут отображаться:
398398
399399- `Visible` можно использовать для отключения планок погрешностей, даже если их размер указан в источнике диаграммы.
400400- `Width` - это длина перекладины, нарисованной в конце планки погрешностей. Значение по умолчанию -1 означает, что его длина будет равна соответствующему размеру `Pointer` серии.
401401- `Pen` определяет параметр пера, используемый для рисования планок погрешностей. Обычно для `Pen.Color` устанавливается цвет серии.
402402
403403### Список источников
404404
405405`TListChartSource` - это базовый источник диаграммы, хранящий данные диаграммы внутри себя. Таким образом, вы можете использовать функции `Add` и `Delete` для изменения исходных данных.
406406
407407Свойство `Item` возвращает указатель непосредственно на базовое хранилище, поэтому вы можете напрямую изменять поля элемента. Однако это не приведет к автоматическому обновлению диаграммы, а также сделает недействительным некоторое внутреннее состояние списка источника.
408408
409409Рекомендуется:
410410
411411- Чтобы изменить отдельный элемент, используйте процедуры Set{Color\|Text\|XValue\|YValue\|YList}.
412412- Чтобы изменить многие элементы в чувствительном ко времени коде, вызовите `BeginUpdate`, затем измените элементы напрямую, потом вызовите `EndUpdate`.
413413
414414Источник также имеет свойство `DataPoints`, позволяющее задавать данные во время разработки. Это свойство - TStringList, где каждая строка представляет точку данных. Строка состоит из значений X, Y, необязательных значений YList, Color и Text, разделенных символом `|`(вертикальная черта). Обратите внимание, что свойство `DataPoints` предназначено в первую очередь для создания образцов кода и демок. Оно очень неэффективно, и вы не должны использовать его для добавления точек данных из кода.
415415
416416Вы можете управлять сортировкой значений X, задав свойство `Sorted`. Обратите внимание, когда для параметра `Sorted` установлено значение `true`, список источника сортирует данные и сохраняет их отсортированными после вставки новых точек. Если вставленные точки не отсортированы, это может привести к квадратичному времени выполнения. Вы должны либо установить для `Sorted` значение `true` только после вставки, либо предварительно отсортировать данные, чтобы избежать этого.
417417
418418### Случайный источник
419419
420420Источник `TRandomChartSource` генерирует случайные данные в заданном диапазоне и предназначен в основном для использования в демках. Вы также можете использовать его как замену времени разработки для вашего фактического источника данных. Это позволит вам видеть и изменять внешний вид вашей диаграммы без необходимости запускать приложение.
421421
422422Каждый случайный источник использует свой собственный независимый генератор случайных чисел, чтобы гарантировать стабильность его значений.
423423
424424### Предопределенный пользователем источник
425425
426426Этот источник можно использовать, если у вас уже есть данные в памяти, но в формате отличается от элементов данных, используемых в TAChart. С помощью источника, определяемого пользователем, вы можете напрямую обращаться к своим данным, вместо того, чтобы сначала перемещать их все в список источника. В некоторых случаях это может улучшить производительность или снизить потребление памяти. Конечно, вы также можете генерировать, фильтровать или изменять данные с помощью пользовательского источника.
427427
428428Количество элементов данных в источнике определяется свойством `PointsNumber`. Сами элементы должны быть возвращены обработчиком события `OnGetChartDataItem`. Вы должны вызвать метод `Reset`, чтобы уведомить диаграмму об изменениях данных. (Другие источники обнаруживают изменения и автоматически отправляют уведомление).
429429
430430Обратите внимание: если для свойства `Sorted` установлено значение `true`, это ответственность обработчика событий для предоставления фактически отсортированных данных.
431431
432432### Источник из базы данных
433433
434434`TDbChartSource` берет данные прямо из базы данных. Он содержится в отдельном модуле, чтобы не вводить зависимость компонента с учетом базы данных. в каждый проект с помощью TAChart.
435435
436436Следующие свойства содержат имена полей базы данных для полей элементов данных:
437437
438438| Свойство | Метод доступа |
439439|--------------|-----------------------------------------------------------|
440440| `FieldX` | AsFloat (или AsDateTime, если задана ​​опция dcsoDateTimeX) |
441441| `FieldY` | AsFloat (или AsDateTime, если задана ​​опция dcsoDateTimeY) |
442442| `FieldColor` | AsInteger |
443443| `FieldText` | AsString |
444444| | |
445445
446446Если свойство `FieldX` пусто, вместо него используется RecNo. `NULL` значения кода в полях координат переводятся в [[TAChart documentation/ru|NaNs]].
447447
448448Чтобы получить источник со множеством значений, задайте для свойства `FieldY` список имен полей, разделенных запятыми. Обратите внимание, что `YCount` будет задан автоматически - попытка задать его вручную вызовет исключение.
449449
450450### Вычисляемый источник
451451
452452`TCalculatedChartSource` - это источник, используемый для управления данными, взятыми из источника `Origin`. Этот источник выполняет преобразования в следующем порядке:
453453
454454- Изменение порядка Y - значения Y источника со множественными значениями могут быть дублированы, удалены или заменены в соответствии со свойством `ReorderYList`, которое представляет собой разделенный запятыми список исходных индексов значений Y. Шаг пропускается, если `ReorderYList` пуст.
455455- Накопление - заменяется значения Y каждого элемента функцией соседних значений.
456456- Процент - заменяется каждое значение Y на процент от общего количества всех значений Y для этого элемента. Полезно для рисования "столбчатых диаграмм" и диаграмм с областями. Шаг пропускается, если свойство `Percentage` имеет значение `false`.
457457
458458Накопление контролируется несколькими свойствами:
459459
460460`AccumulationRange` контролирует количество элементов для накопления, считая текущий элемент, поэтому `AccumulationRange = 1` отключает накопление. `AccumulationRange = 0` интерпретируется как «бесконечный» диапазон, т.е. запрос на накопление по всем имеющимся данным. Это в основном полезно в сочетании с методом `camSum` для создания совокупных сумм.
461461
462462Обратите внимание, что фактическое количество элементов может быть меньше для точек около начала или конца источника.
463463
464464`AccumulationDirection`:
465465
466466- cadBackward - использовать предыдущие значения из источника,
467467- cadForward - использовать следующие значения из источника,
468468- cadCenter - используйте предыдущие и следующие значения для общего числа до `2 * AccumulationRange - 1`.
469469
470470`AccumulationMethod`:
471471
472472- camNone - пропустить шаг накопления,
473473- camSum - сумма последнего элемента `AccumulationRange`,
474474- camAverage - среднее значение последнего элемента `AccumulationRange`,
475475- camDerivative - производная конечных разностей, рассчитанная с использованием последнего элемента `AccumulationRange`. Обратите внимание, что метод расчета предполагает эквидистантные значения X и может потерять точность, если расстояние X существенно меняется.
476476- camSmoothDerivative - сглаженная производная конечных разностей, более устойчивая к случайным ошибкам измерения в данных.
477477
478478### Интервальный источник
479479
480480`TIntervalChartSource` может предоставить произвольное количество точек в заданном интервале, контролируемом различными свойствами источника. Этот источник является встроенным по умолчанию источником для меток осей. Если вы хотите установить одинаковые [[TAChart documentation/ru|параметры интервала осей]] для нескольких осей, Вы можете назначить один компонент `TIntervalChartSource` для `Marks.Source` каждой из этих осей.
481481
482482### Источник интервала даты и времени
483483
484484`TDateTimeIntervalChartSource` похож на [[TAChart documentation/ru|TIntervalChartSource]], но предоставляет метки в формате [[TAChart documentation/ru|значения даты/времени]]. Этот источник автоматически выбирает подходящий календарный интервал (например, неделя или час) в зависимости от масштаба оси.
485485
486486Обратите внимание, что значения X предоставленных элементов данных - это значения `TDateTime` и значения `Label` содержат отформатированные строки даты и времени. Если вы хотите использовать `TDateTimeIntervalChartSource` в качестве источника меток оси, вам, вероятно, следует установить свойства `Marks.Format` или `Marks.Style`, чтобы использовать предоставленные метки.
487487
488488Если задано свойство `DateTimeFormat`, оно используется для форматирования всех меток. Форматирование выполняется стандартной [SysUtils.FormatDateTime](http://www.freepascal.org/docs-html/rtl/sysutils/formatdatetime.html). Если `DateTimeFormat` пуст, формат выбирается автоматически в зависимости от масштаба.
489489
490490`TDateTimeIntervalChartSource` определяется в модуле [TAIntervalSources](https://github.com/alrieckert/lazarus/blob/master/components/tachart/taintervalsources.pas).
491491
492492### Примечания по оптимизации источников
493493
494494API первичного источника данных допускает произвольный доступ. Тем не менее, многие источники, в частности рандомные, из базы данных и вычисляемые, могут проявлять квадратичное или худшее поведение при случайном доступе. Сам TAChart заботится об использовании только последовательного доступа (хотя может потребоваться несколько проходов). Источники оптимизируют последовательный доступ с помощью внутреннего состояния. Код пользователя должен быть аккуратен, чтобы не сбросить это состояние во время рисования диаграммы из обработчиков событий или кода пользовательской серии.
495495
496496Заметным исключением является [[TAChart documentation/ru|списочный источник]], который гарантированно обеспечивает быстрый произвольный доступ. Его можно использовать для кеширования медленных источников с помощью процедуры `CopyFrom`.
497497
498498Также обратите внимание, что указатель, возвращаемый функцией `GetItem`, может указывать на внутренний буфер, который будет перезаписан следующим вызовом `GetItem`. Опять же, списочный источник не имеет этого ограничения.
499499
500500## Координаты и оси
501501
502502- *Координаты оси* (известные в некоторых других приложениях как координаты объекта) — это «сырые» значения координат, полученные из данных. Как следует из названия, координаты оси интерпретируются в терминах конкретной оси — одно и то же значение координаты может иметь разное значение в зависимости от оси, к которой оно применяется.
503503- *Координаты графика* (также известные как мировые координаты) преобразуются из координат оси с использованием преобразования оси, например логарифмического масштаба. Координаты графика общие для всех объектов на графике.
504504- *Координаты изображения* (также известные как координаты экрана) преобразуются из координат графика на основе области просмотра диаграммы. Это преобразование всегда является линейным, и на него могут влиять такие инструменты диаграммы, как масштабирование и панорамирование.
505505- *Координаты устройства* обычно равны координатам экрана, но могут быть скорректированы в соответствии с бэкендом чертежа, чтобы приспособиться к различным физическим разрешениям (значениям DPI). См., например, [[TAChart documentation/ru|отрисовщик принтера]].
506506
507507Вы можете добавить или удалить произвольное количество осей, отредактировав свойство `AxisList`. По умолчанию диаграмма имеет две оси: одну горизонтальную и одну вертикальную. Они доступны через свойства `BottomAxis` и `LeftAxis`. Обратите внимание, что эти свойства являются псевдонимами для кода `AxisList[0]` и `AxisList[1]`, поэтому, если вы удалите эти оси по умолчанию, доступ к `BottomAxis` и `LeftAxis` вернет `nil`.
508508
509509Визуально ось состоит из осевой линии (нарисованной `AxisPen`), линий сетки (нарисованной `GridPen`), делений, меток и стрелки.
510510
511511Каждая ось рисуется внутри собственного прямоугольника, определяемого размером меток и делений. Назначив нескольким осям один и тот же положительный `Group` номер, вы можете сделать так, чтобы они разделяли одну и ту же прямоугольную область. Сгруппированные оси можно использовать для создания «панелей», когда несколько рядов рисуются на разных участках одного и того же графика.
512512
513513Оси с одинаковым выравниванием, но разными группами, укладываются рядом друг с другом. Вы можете использовать свойство `Margin` для управления расстоянием между такими осями.
514514
515515### Преобразования осей
516516
517517Преобразования осей сгруппированы в компоненте `TChartAxisTransformations`. Он содержит список преобразований, которые применяются в указанном порядке. (Например, выполнение масштабирования до и после логарифмирования даст разные результаты).
518518
519519Чтобы преобразования возымели эффект, следует:
520520
521521- Убедиться, что свойство `Enabled` имеет значение true для всех преобразований.
522522- Назначить компонент преобразований свойству `Transformations` хотя бы одной оси.
523523- Назначить свойства `AxisIndexX` и/или `AxisIndexY` ряда соответствующему индексу оси.
524524
525525Обратите внимание, что по умолчанию `AxisIndexX` иcode\>AxisIndexY имеют специальное значение -1, что означает «игнорировать преобразования осей». Также обратите внимание, что если вы добавите или удалите оси, индексы могут измениться. Вы можете повернуть серию, назначив `AxisIndexX` вертикальной оси и `AxisIndexY` горизонтальной оси.
526526
527527#### Линейное и логарифмическое преобразование
528528
529529Это простые арифметические преобразования.
530530
531531#### Трансформация с автоматическим масштабированием
532532
533533Чтобы отобразить несколько серий с независимым масштабированием, назначьте их двум или более осям и примените `TAutoScaleAxisTransform` к каждой оси. См. демку "axistransf", страница "Linear", флажок "Auto scale".
534534
535535Используя свойства `MinValue` и `MaxValue`, вы можете управлять координатами на графике автоматически масштабируемого ряда. Например, задав одному преобразованию диапазон от 0 до 1, а другому — диапазон от 1 до 2, вы ограничите все ряды, использующие первое преобразование, верхней половиной диаграммы, а все ряды, использующие второе преобразование в нижнюю половину (при условии, что не осталось неназначенных рядов).
536536
537537#### Совокупное преобразование нормального распределения
538538
539539Используйте `TCumulNormDistrAxisTransform`, чтобы установить [кумулятивное нормальное распределение](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F) как преобразование оси. Это может быть полезно при составлении статистических графиков.
540540
541541Обратите внимание, что результат этого преобразования находится в диапазоне от 0 до 1. Рекомендуется соответствующим образом ограничить диапазон осей.
542542
543543См. пример на странице «Нормальное распределение» демки «axistransf».
544544
545545#### Пользовательское преобразование
546546
547547Вы можете создать свою собственную трансформацию либо путем наследования от `TAxisTransform`, или, если вы предпочитаете «визуальное» программирование, используйте `TUserDefinedAxisTransform`. В любом случае есть два основных требования:
548548
549549- функции `AxisToGraph` и `GraphToAxis` должны быть определены везде в диапазоне данных и обратны друг другу (например, теперь избегайте только деления, а также умножения на ноль).
550550- Функции должны быть монотонными.
551551
552552### Оси даты и времени
553553
554554Использование значений даты/времени для меток оси является распространенным требованием. Правильный способ сделать это зависит от точного характера ваших данных даты/времени:
555555
556556- Если данные являются актуальными значениями `TDateTime`, используйте его как координату X в пунктах, назначьте [[TAChart documentation/ru|TDateTimeIntervalChartSource]] `Marks.Source` соответствующей оси, а `Marks.Style` измените на `smsLabel`. `TDateTimeIntervalChartSource` обеспечивает автоматическую маркировку в зависимости от масштаба в широком диапазоне -- от столетий до миллисекунд.
557557- Если данные представлены в физических единицах, но вне диапазона значений `TDateTime`, таких как астрономические или микроэлектронные тайминги, используйте их как обычную координату X с пользовательским `Marks.Format`.
558558- Если данные представлены в календарных единицах, таких как месяцы и годы, что характерно для финансовых данных, у вас есть несколько вариантов:
559559 - Если единицы даты «равноудалены» при интерпретации как числа (например, простые числа года), назначьте один и тот же источник данных как для серий, так и для меток осей, а затем используйте пользовательский `Marks.Format`, событие `Axis.OnMarkToText` или поле `Text` элементов данных для форматирования дат в соответствии с вашими требованиями.
560560 - Если единицы даты не «равноудалены» (например, числа в формате ГГГГММ или даже строки-даты), вместо этого используйте суррогатную координату X (обычно просто точечный индекс) и отображайте даты, используя методы, описанные выше.
561561 - Предварительно преобразуйте координаты в значения `TDateTime`, затем используйте `TDateTimeIntervalChartSource`, как описано выше.
562562
563563### Диапазоны осей
564564
565565Диапазон оси измеряется в осевых единицах и определяет протяженность ряда, прикрепленного к этой оси. Обычно диапазон осей равен объединению всех экстентов серии, но его можно переопределить с помощью свойства `Range`.
566566
567567Метки осей отображаются внутри диапазона меток осей, который определяется как пересечение:
568568
569569- Логический экстент (преобразованный в координаты оси)
570570- Суммарный экстент всех рядов данных этой оси, если `Marks.AtDataOnly = true`
571571- Свойство `Marks.Range`.
572572
573573### Интервалы осей
574574
575575Метки осей располагаются вдоль оси через равные промежутки, выбранные графиком. На выбор интервалов можно повлиять с помощью свойства `Intervals`. Это свойство имеет несколько подсвойств, которые применяются в следующем порядке:
576576
577577- Свойство `Options` содержит набор флагов, управляющих использованием других параметров. Если флаг не установлен, соответствующий параметр игнорируется.
578578- `NiceSteps` — это строка, содержащая последовательность «множителей шага» — значений с плавающей запятой в диапазоне от 0 до 1, исключая 0. Если это свойство применяется, шаг оси будет равен степени десяти, умноженной на одно из предоставленных значений. Если можно использовать несколько множителей, будет выбран крайний левый. Множители разделяются вертикальной чертой (\|).
579579- Если `NiceSteps` игнорируется или TAChart не может найти подходящий шаг, диапазон оси будет разделен на равные интервалы независимо от количества знаков после запятой в представлении значений меток. В этом случае рекомендуется уменьшить количество видимых цифр в `Marks.Format`.
580580- свойства `MinLength` и `MaxLength` устанавливают пределы длины интервала «в единицах изображения» (обычно в пикселях).
581581- Свойство `Count` — желаемое количество меток оси. Среди всех шагов оценки, прошедших предыдущие тесты, TChart выбирает тот, который дает количество оценок, ближайшее к `Count`. Если свойство `Count` игнорируется или есть несколько шагов с одинаковым количеством меток, выбирается самый длинный шаг.
582582- Свойство `Tolerance` устанавливает максимальное расстояние «в единицах изображения», на которое может быть перемещена метка, чтобы уменьшить длину ее десятичного представления. Это помогает избежать большого количества бессмысленных цифр в заголовках меток, когда предыдущие шаги по какой-то причине не привели к созданию «хороших» меток. Обратите внимание, что на этом этапе игнорируются все предыдущие ограничения, поэтому большие значения`Tolerance` могут привести к значительным искажениям. Часто бывает достаточно установки `Tolerance = 1`.
583583
584584Обратите внимание, что если вы устанавливаете источник диаграммы вручную, свойство `Intervals` может применяться только частично или не применяться вовсе. Например, [[TAChart documentation/ru|список источника]] не может гарантировать максимальную длину интервала, так как он имеет только конечное число точек. См. также [[TAChart documentation/ru|интервальный источник диаграммы]].
585585
586586### Положение оси
587587
588588По умолчанию ось выравнивается по стороне диаграммы, соответствующей свойству `Alignment`. Вы можете позиционировать ось по-разному, задав свойства `Position` и `PositionUnits`.
589589
590590Допускаются следующие значения свойства `PositionUnits`:
591591
592592- `cuPercent` -- процент отсечения прямоугольника.
593593- `cuGraph` -- абсолютная позиция в координатах графика.
594594- `cuPixels` -- позиция в единицах экрана относительно координат по умолчанию.
595595
596596**Примечание 1:** Если положение оси отличается от значения по умолчанию (`Position = 0` и `PositionUnits = cuPercent`), он будет исключен из расчета полей, поэтому будет казаться, что он перекрывает серию.
597597
598598**Примечание 2:** `Alignment` влияет не только на положение самой оси, но и на соответствующие метки. Таким образом, если две оси имеют `Position = 50` и `PositionUnits = cuPercent`, но одна имеет `Alignment = calLeft`, а другая `Alignment = calRight`, они будут отображать общую линию оси с метками на разных стороны.
599599
600600См. пример на странице "Position" демку "axis".
601601
602602### Названия осей
603603
604604Если свойство `TextFormat` переключено на `tfHTML`, то HTML-объекты и теги могут быть встроены для специального форматирования заголовков осей, таких как подстрочные/надстрочные индексы или греческие символы. Подробнее см. [[TAChart documentation/ru|HTML]].
605605
606606### Размер LabelSize
607607
608608Начиная с Lazarus v1.4 оси диаграммы имеют новое свойство `LabelSize`, которое, если оно отличается от `0`, переопределяет автоматический расчет пространства, необходимого для меток осей. `LabelSize` приблизительно определяет пиксели между линией оси и заголовком оси, независимо от размера меток оси. Эту функцию можно использовать для выравнивания линий осей нескольких диаграмм, которые расположены друг над другом или рядом.
609609
610610См. демку «axisalign» и [[TAChart documentation/ru|графическое объяснение]] для примера.
611611
612612> **Note:** Если (ненулевое) значение `LabelSize` слишком маленькое, метки осей могут доходить до заголовка оси или даже обрезаться на границе диаграммы.
613613
614614## Экстенты и поля
615615
616616### Экстенты
617617
618618*Экстент* диаграммы представляет собой прямоугольник в [[TAChart documentation/ru|координатах графа]].
619619
620620TChart определяет несколько экстентов:
621621
622622- *Full extent* (полный) -- обычно определяется автоматически как область, охватывающая все данные из рядов и диапазонов осей. Возвращается функцией `GetFullExtent`.
623623- *Fixed extent*(фиксированный) -- определяется свойством `TChart.Extent`. Может частично или полностью переопределить расчет полного экстента.
624624- `LogicalExtent` -- запрошенный пользователем экстент для отображения на изображении диаграммы. Запись в это свойство является официальным способом изменения экстента диаграммы с помощью внешнего кода. Например, `LogicalExtent := GetFullExtent` (почти) эквивалентен вызову процедуры `ZoomFull`.
625625- `CurrentExtent` -- экстент, фактически отображаемый пользователю. Может отличаться от `LogicalExtent` из-за необходимости резервирования места для ряда [[TAChart documentation/ru|метки]], внутренней диаграммы [[TAChart documentation/ru|поля]] и т.д.
626626
627627Значение минимального экстента не может быть больше значения максимального экстента. При попытке установить такие значения будет сгенерировано исключение. Для предотвращения исключений можно использовать процедуру `.Extent.FixTo(aBounds: TDoubleRect)` для установки логических экстентов. Значения в `TDoubleRect` упорядочены следующим образом: *\[xmin, ymin, xmax, ymax\]*.
628628
629629Чтобы инвертировать экстенты, свойство `Inverted` оси (левой, нижней и т.д.) должно быть установлено в `True`.
630630
631631**Важно**: установка логических экстентов будет работать должным образом, только если для всех `Margins` диаграммы установлено значение 0 (значение по умолчанию — 4), а для параметра `Series.Marks.AutoMargins` для всех рядов диаграммы установлено значение `False` (по умолчанию — `True`). В противном случае запрошенный экстент будет увеличен, чтобы включить в него также `Margins` диаграммы и `Marks` серии.
632632
633633### Extent limits
634634
635635By default, TAChart allows arbitrary extents. However, for both usability and speed reasons it may be desirable to limit extent size. For example, setting the lower bound of the size may disallow extreme zoom levels, while setting the upper bound may force the user to only see a part of the very long series at any given time.
636636
637637The extent can be limited with the `ExtentSizeLimit` property. Sub-properties `MinX`, `MinY`, `UseMinX` and `UseMinY` control the lower bounds of the extent, while sub-properties `MaxX`, `MaxY`, `UseMaxX` and `UseMaxY` control the upper bounds.
638638
639639Extent limits are expressed in graph units.
640640
641641Setting `Proportional = true` will enforce the current extent to have the shape of the plot area. This may be useful for cartographic or some math plots which require the same scale on both axes.
642642
643643### Linked extents
644644
645645Using the `TChartExtentLink` component, you can ensure that the logical extents of several charts enumerated by the `LinkedCharts` property always stay the same. In Laz 2.1+ the component was extended to provide an additional property `AlignSides` which adjusts the `LabelSize` properties of aligned charts such that the corresponding sides of the plot area are aligned, too.
646646
647647This is useful for simulating multi-pane chart layouts. See "panes" demo for an example.
648648
649649### Поля
650650
651651*Margin* is a distance reserved around the edges of rectangular region. Margins are measured in image units (usually pixels). The chart itself has two kinds of margins:
652652
653653- Internal (`Margins` property) -- applied after axis drawing. Are also influenced by series marks and series themselves.
654654- External (`MarginsExternal` property) -- applied before axis drawing. Are also influenced by axis marks and arrows.
655655
656656Other chart elements, such as legend, title, footer and labels, have margins, too.
657657
658658### Optimization notes
659659
660660Calculation of `CurrentExtent` and actual margins is a non-trivial *iterative* process (see `TChart.PrepareAxis` code for details). Although usually fast, in complex cases it can require multiple passes through chart sources.
661661
662662### Графическое объяснение
663663
664664![](/wiki-images/8/80/TAChart_Margins.png)
665665
666666## Tools
667667
668668Chart tools define how the chart reacts to various user actions, primarily mouse movements and clicks. You can see examples of tools usage in the "tools" or "barseriestools" demos.
669669
670670Tools are grouped in a `TChartToolset` component, which should be assigned to the chart's `Toolset` property. The same toolset can be used in several charts.
671671
672672If `Toolset` is unassigned, for compatibility reasons a built-in toolset consisting of zoom drag and pan drag tools is used; these builtin tools can be turned off individually by setting the chart properties `AllowZoom` and/or `AllowPanning` to `false`, respectively (the latter is available only after Lazarus v2.2+).
673673
674674In each user action, tools in the toolset are processed in order, and for each tool:
675675
676676- If `Enabled=false`, the tool is ignored.
677677- If `Shift` is not equal to the current shift state, the tool is ignored.
678678- Tool is requested to process the action.
679679- If the tool signals that the action is handled, processing is stopped, otherwise it continues to the next tool. This way, tools with the same `Shift` value may be differentiated based on special activation conditions. For example, some drag tools may be configured to not activate on a simple click, leaving the click event available for other actions.
680680- Finally, if no suitable tool is found, the chart's event handler is called. Note that this means that chart event handlers will only work with all tools disabled. Generally it is recommended to use tools for interactivity, chart events are left mostly for compatibility.
681681
682682In your application you can create, for example, a toolbar with each button enabling the corresponding tool in the toolset and disabling all others. Alternatively, by assigning different `Shift` values, you can enable several tools at once.
683683
684684Some tools publish the `EscapeCancels` property which, if set to `true`, cancels the tool operation if the user pressed the ESC key.
685685
686686### Keyboard handling in tools
687687
688688Besides mouse events, some tools may react on key presses -- for example, crosshair tool with `Shift = [ssCtrl]` will display crosshairs when the CTRL key is pressed, without mouse buttons. Unfortunately, the chart must be focused to receive keyboard events. This means that after the user interacted with other controls on the same form, the chart stops reacting on keyboard-only events.
689689
690690To prevent this, you can either call the `Chart.SetFocus` method, or set `Chart.AutoFocus = true`, which will make a chart grab the focus when the mouse moves over it.
691691
692692### Drawing mode
693693
694694Some tools, such as zoom drag or crosshair, display moving shapes over the chart with the mouse movement.
695695
696696There are two ways to display those shapes: either simply draw them over the chart, fully redrawing the chart upon each mouse movement, or use `pmXor` pen mode to draw and erase the shape directly from the `MouseMove` event handler. The former method allows to use arbitrary pen color and style, but the latter is much more efficient. Additionally, some widgetsets ignore all drawing outside the `Paint` event, in such a case the latter method will not work at all.
697697
698698The display method is controlled by the `DrawingMode` property with the following values:
699699
700700- `tdmXor` -- use XOR method;
701701- `tdmNormal` -- use full chart redraw;
702702- `tdmDefault` -- use XOR method on widgetsets where it is known to work (Windows and Gtk) and full redraw on others.
703703
704704### Extent tools
705705
706706Extent tools modify the chart's logical extent.
707707
708708Zooming tools can be animated by setting `AnimationSteps` to a value greater then 1 and specifying an appropriate `AnimationInterval` in milliseconds.
709709
710710In the zooming tools, adapt the `LimitToExtent` property to restrict zooming to the chart's full extent on all or some directions. The same property is available also in the panning tools for the corresponding purpose when the viewport is panned.
711711
712712#### Zoom drag tool
713713
714714`TZoomDragTool` allows the user to zoom in by drawing a rectangle with the mouse. The rectangle then becomes the new logical extent.
715715
716716Restoration of the zooming to the full extent can be achieved by several actions, controlled by the `RestoreExtentOn` property:
717717
718718- `zreDragTopLeft`, `zreDragTopRight`, `zreDragBottomLeft`, `zreDragBottomRight` -- dragging in the specified direction,
719719- `zreClick` -- clicking without dragging,
720720- `zreDifferentDrag` -- dragging in a direction different from the one used to zoom in.
721721
722722By default, `RestoreExtentOn = [zreClick, zreDragTopLeft, zreDragTopRight, zreDragBottomLeft]` which means that the full extent is restored either by clicking or by drawing a rectangle in any direction except from top-left to bottom-right.
723723
724724To get a behavior compatible with earlier versions of Delphi's TeeChart, specify `RestoreExtentOn = [zreDragTopLeft, zreDragTopRight, zreDragBottomLeft]`.
725725
726726To get a behavior compatible with newer versions of TeeChart, specify `RestoreExtentOn = [zreDifferentDrag]`.
727727
728728The enumerated property `RatioLimit` (`(zrlNone, zrlProportional, zrlFixedX, zrlFixedY`) lets you restrict zooming to one of the coordinates, or makes the zooming process keep the original proportions.
729729
730730#### Zoom click tool
731731
732732`TZoomClickTool` allows the user to zoom in or out by clicking on the chart with the mouse. `ZoomFactor` is the scaling multiplier applied by the tool where factors below 1 represent "zoom out", and factors above represent "zoom in".
733733
734734`ZoomRatio` allows to create a non-proportional zooming effect by specifiying the ratio of X to Y scale. In other words, the X zoom factor is given by the property `ZoomFactor`, the Y zoom factor is the product `ZoomFactor*ZoomRatio`.
735735
736736- In particular, to **zoom only horizontally**, the Y zoom factor must be 1, i.e. `ZoomFactor*ZoomRatio = 1` or `ZoomRatio = 1/ZoomFactor`. For example, when your `ZoomFactor` for the X axis is 1.1, then `ZoomRatio` must be 1/1.1 = 0.909.
737737- Similarly, to **zoom only vertically**, the X factor must be 1, i.e. `ZoomFactor = 1`, and you can use `ZoomRatio` alone to determine the Y zoom factor.
738738- And finally, in the normal case, when X and Y should zoom by the same ratio, keep `ZoomRatio` at 1 and determine the overall zoom factor by the `ZoomFactor` alone.
739739
740740If `FixedPoint` is true, the location of the mouse click is used as a fixed point for zooming, otherwise the chart image center is used instead.
741741
742742#### Zoom mouse-wheel tool
743743
744744`TZoomMouseWheelTool` allows the user to zoom in and out with the mouse wheel. Its properties are identical to the zoom click tool.
745745
746746The chart is scaled by `ZoomFactor` when the user scrolls the mouse wheel up, and by `1/ZoomFactor` when the user scrolls the mouse wheel down.
747747
748748#### Pan drag tool
749749
750750`TPanDragTool` allows the user to move the logical extent by dragging the mouse in the directions indicated by the `Directions` property.
751751
752752Use the `MinDragRadius` property to distinguish dragging from clicking.
753753
754754#### Pan click tool
755755
756756`TPanClickTool` allows the user to move the logical extent by clicking inside a range of `Margins` pixels from the corresponding border of the chart image.
757757
758758The panning offset is determined by the distance from the edge of the chart (the nearer to the edge, the greater). Setting `Interval` in milliseconds will allow to continue panning with the given interval until the mouse button is up.
759759
760760#### Pan mouse wheel tool
761761
762762`TPanMouseWheelTool` allows the user to move the logical extent by scrolling the mouse wheel.
763763
764764The extent is moved in `WheelUpDirection` when the wheel is scrolled up and in the opposite direction when the wheel is scrolled down.
765765
766766The movement speed is controlled by `Step` property.
767767
768768### Data tools
769769
770770Data tools are linked to specific data series via the `AffectedSeries` property, which is a string of comma-separated series indexes. Note that indexes may change if you add or remove series. Having `AffectedSeries` empty means that the tools operate on every series in the chart.
771771
772772When a data tool is activated, it determines the nearest point of the affected series which is located inside of the `GrabRadius` (in pixels).
773773
774774Using the set `Targets: TNearestPointTargets` it can be controlled which part of a complex series must be hit:
775775
776776- `nptPoint`: The tool must hit the data point at (x, y).
777777- `nptXList`: If the series' source has several x values the tool must hit any of the values in the XList.
778778- `nptYList`: If the series' source has several y values the tool must hit any of the values in the YList.
779779- `nptCustom`: Meant for special effects depending on the series. In case of a bar series, for example, the function GetNearestPoint is overridden to accept hits inside series bars if this option is set.
780780
781781All options are on by default. For further control, most series have the same set of Targets, named `ToolTargets`. An option must be included in the targets of both tool and series to be active. This way tools can be shared with series reacting differently on each option. See "barseriestools" demo as an example.
782782
783783For large series, the efficiency can be improved by using a sorted source, a small `GrabRadius` and a `DistanceMode<>cdmOnlyY`.
784784
785785#### Data point drag tool
786786
787787`TDataPointDragTool` allows the user to change data values by dragging the data point. Requires the series' data source to be a list source.
788788
789789You can use the `OnDrag` and `OnDragStart` events to limit drag direction or grab area.
790790
791791See "dragdrop" demo for an example.
792792
793793#### Data point click tool
794794
795795`TDataPointClickTool` allows you to assign an `OnPointClick` event handler, which will be called when the user clicks on the data point.
796796
797797#### Data point hint tool
798798
799799`TDataPointHintTool` displays a hint when the user moves the mouse over the data point. The hint is either equal to the point label (if `UseDefaultHintText=true`) or determined by calling the `OnHint` event handler.
800800
801801By default, this tool displays a separate hint window, independent from the application hint. To use a single hint window per application, you may set `UseApplicationHint=true`.
802802
803803Note that the application-level hint does not work in combination with modifier keys and mouse buttons, so the hint is displayed only if no buttons are pressed (i.e. `Shift` property must be empty when `UseApplicationHint=true`).
804804
805805#### Data point crosshair tool
806806
807807`TDataPointCrosshairTool` displays a cross-hair centered on the data point. It replaces the "reticule" found in older versions of TAChart.
808808
809809#### Data point distance tool
810810
811811`TDataPointDistanceTool` allows to measure and display a distance between two points on the chart.
812812
813813### Chart element tools
814814
815815#### Axis click tool
816816
817817This tool fires an event `OnClick` when the user clicks on an axis or its title. The event has the clicked axis and a set of `TAxisHitTest` elements as parameters:
818818
819819- `ahtTitle`: click on the axis title
820820- `ahtLine`: click on the axis line (allowed tolerance defined by the tool's `GrabRadius` or the axis' `TickLength` and `InnerTickLength` whichever is greater).
821821- `ahtLabels`: click into the label area of the axis. It is not distinguished whether a label is clicked or the empty space between the labels.
822822- `ahtAxisStart`: the click on the line or label area occured in the first quarter of the axis length
823823- `ahtAxisCenter`: the click on the line or label area occured in the center part (two quarters) of the axis length
824824- `ahtAxisEnd`: the click on the line or label area occured in the last quarter of the axis length.
825825
826826#### Title/footer click tool
827827
828828An `OnClick` event is created when the user clicks on the title or footer of a chart. The event has the clicked title/footer as parameter.
829829
830830#### Legend click tool
831831
832832Generates an `OnClick` event when a click on the chart's legend has occured. The event has the legend as a parameter.
833833
834834### User defined tool
835835
836836To add your own tool, either inherit from `TUserDefinedTool` or use it directly, assigning one or more On{After,Before}{KeyDown,KeyUp,MouseDown,MouseMove,MouseUp,MouseWheelDown,MouseWheelUp} event handlers.
837837
838838Call the `Handled` method of the tool to indicate that no further processing of the event should be done.
839839
840840## Decorative elements
841841
842842### Title and footer
843843
844844Chart title and footer are multi-line texts appearing above and below the chart correspondingly. They support various rotations and alignments.
845845
846846#### HTML
847847
848848If the Lazarus version is 1.8 or newer then html entities and some html tags can be embedded into the title/footer texts for a variety of additional formatting options. This feature is turned on by switching the property `TextFormat` to `tfHTML`. In addition to header/footer texts it is available also for axis captions, axis marks, series marks and legend texts/series titles.
849849
850850- Non-standard charcters can be embedded using the corresponding **html entities**, i.e. as codes beginning with an ampersand (&), a standardized appreviation of the character name (or its hex or decimal unicode value), and ending with a semicolon (;). A list of all html entities can be found at <http://unicode.e-workers.de/entities.php>.\
851851 *Example*: The text `sin 2&alpha; = 2 sin &alpha; cos &alpha;` is displayed as "sin 2α = 2 sin α cos α"
852852- `<sub>...</sub>` displays the enclosed text as **subscript**.\
853853 *Example:* `H<sub>2</sub>O` is shown in the chart as "H<sub>2</sub>O"
854854- `<sup>...</sup>` displays the enclosed text as **superscript**.\
855855 *Example:* `cm<sup>2</sup>` is shown in the chart as "cm<sup>2</sup>"
856856- `<b>...</b>` displays the enclosed text with **bold** type face. \
857857 Likewise, the tags \<i\>...\</i\>, \<u\>...\</u\>, \<s\>...;\</s\> can be used to format portions of the text as italic, underlined, and strike-out\
858858 *Example:* `Plot of <b>x</b> <i>vs.</i> <b>y</b>` is shown in the chart as "Plot of x vs. y"
859859- The `<font>...</font>` tags can be used to modify the font of the enclosed text:
860860 - **Text color**: The embedded `This text is <font color="red">RED</font>` displays the enclosed text in red color, i.e. like "This text is RED". Specify the color by the most typical color names or by the html hex color codes of rgb values, in the format `#rrggbb` or `#rgb` where r, g, b are hex bytes for the red, green and blue color components. The three-digit codes `#rgb` are equivalent to the six-digit codes `#rrggbb` where both digits of the same component are equal.
861861 - The **font name** can be specified by the `name` attribute.
862862 - The **font size** is controlled by the `size` attribute. It can take the values "x-small", "small", "medium", "large", "x-large", "xx-large" for font sizes 7, 10, 12, 14, 18, 24pt, respectively. Alternatively, the point or pixel size can be specified directly if "pt" or "px", respectively, is appended.
863863 - *Example:* This code adds a two-line footer in which the 2nd line is in blue, 8-pt, underlined Times New Roman:
864864
865865``` pascal
866866 Chart.Foot.Text.Clear;
867867 Chart.Foot.Text.Add('Reference:');
868868 Chart.Font.Text.Add('<font name="Times New Roman" size="8pt" color="blue"><u>www.freepascal.org/</u></font>');
869869```
870870
871871> **Warning:** It is not recommended to switch font name and font size within the same line because TAChart drawers cannot exactly align the base line of characters in different fonts and font sizes
872872
873873The demo application in folder *demo/html* of the Lazarus installation heavily makes use of embedded HTML codes.
874874
875875### Легенда
876876
877877Chart legend is a table with each item containing an icon and a text line. Grid lines may be controlled by `GridHorizontal` and `GridVertical` properties.
878878
879879Legend supports various alignments and can be located inside the chart or on the sidebar. Legend can be displayed in two or more columns by setting `ColumnCount` property. Setting `ColumnCount` to a very large value effectively creates "horizontal" legend.
880880
881881Legend items are generated based on chart series which have both `Active` and `ShowInLegend` set to true. Depending on `Legend.Multiplicity` series can produce a single item or one item per point.
882882
883883Legend items can be grouped together under sub-headers. Sub-headers are taken from `GroupNames` property, and each series can use `Legend.GroupIndex` property to indicate its group.
884884
885885Legend items are sorted as following:
886886
887887- By group index, items without group (`GroupIndex=-1`) going first to avoid confusion with the last group.
888888- By `Order` property, items without explicit order (`Order=-1`) going last.
889889- By creation order of series.
890890- For multiple items per series, by generation order (for standard series it is the order of points).
891891
892892Sorted items are then added to the legend table in either by rows or by columns depending on the `ItemFillOrder` property.
893893
894894#### Legend item text
895895
896896The text of a legend item is generated by the corresponding series based on the `Legend.Format` property. This property is used as a first argument for the [`SysUtils.Format`](http://www.freepascal.org/docs-html/rtl/sysutils/format.html) function, with the second argument containing following data items:
897897
898898- For per-series multiplicity:
899899 - 0: Series `Title`
900900 - 1: Series `Index`
901901- For per-point multiplicity:
902902 - Same as mark labels
903903
904904If the property `TextFormat` is switched to `tfHTML` then HTML entities and tags can be embedded for special formatting of legend texts. See HTML for details.
905905
906906#### User-defined legend items
907907
908908Arbitrary legend items can be generated by overriding `OnCreate` and `OnDraw` events of series `Legend` property.
909909
910910Note that user-defined item count is controlled solely by `UserItemsCount` property and does not depend on `Multiplicity`. Also note that `GroupIndex` and `Order` properties are actually per-item, so you can totally override entire legend from a single (perhaps fictive) series.
911911
912912### Arrows
913913
914914Arrowheads can be drawn at the end of axis lines, constant lines, mark links, etc. It is controlled by `TChartAxis.Arrow`, `TConstantLine.Arrow`, `TChartMarks.Arrow` correspondingly.
915915
916916Arrowhead shape is determined by `Width`, `Length` and `BaseLength` properties, for example:
917917
918918- Thin wedge: `BaseLength = 0`
919919- Triangle: `BaseLength = Length`
920920- Rhombus: `BaseLength = 2 * Length`
921921- Inverted Triangle: `BaseLength > 0`, `Length = 0`
922922
923923This image shows these arrows created for `Length=10` and `Width=5`.![](/wiki-images/b/be/TAChart_Arrows.png)\
924924
925925### Transparency
926926
927927`Transparency` property of the series represents a level of transparency from 0 (fully opaque) to 255 (fully transparent -- i.e. invisible).
928928
929929**Compatibility note**: FPVectorial and TFPCanvas drawers currently do not support transparency because of limitations of the underlying libraries. Printer and WMF drawers can not support transparency in principle.
930930
931931**Optimization note**: Transparency support in the LCL is rudimentary, so current TCanvas drawer implementation may be slow with many transparent series and large charts. To improve efficiency, it is recommended to use as few different transparency levels as possible and to not interleave series with different transparencies. Alternatively, use BGRABitmap as back-end, since it has faster transparency implementation.
932932
933933### ChartStyles
934934
935935`TChartStyles` can be employed to control the appearance of the "layers" of area, line, and bar series with multiple y values. They can also be used to colorize the regions between axis ticks in a banded way.
936936
937937## Метки
938938
939939Marks annotate certain points of the chart. These points can be defined by a series or an axis. Typically, mark consists of some graphical element (such as an axis tick) and a text label. However, either of these elements can be omitted.
940940
941941You can see examples in the "labels" demo.
942942
943943### Mark labels
944944
945945The label text can be enclosed in a box, controlled by `LabelBrush` and `Frame` properties. The text itself is created based on the data source items, with the help of `Format` property. This property is used as a first argument for the [`SysUtils.Format`](http://www.freepascal.org/docs-html/rtl/sysutils/format.html) function, with the second argument containing following data items:
946946
947947- 0: Y
948948- 1: Y as a percentage of the Y total
949949- 2: Text
950950- 3: Y total
951951- 4: X
952952
953953Where "Y total" is the sum of all Y values for this source. Note that not all sources supply all the items above.
954954
955955Some pre-defined formats can be set via the `Style` property.
956956
957957If the source is mutli-valued, `YIndex` property determines which Y value is used. If `YIndex = -1`, a separate label is displayed for each Y value, which is useful for stacked series.
958958
959959The text is rendered using the `LabelFont`. Note in particular that TAChart supports arbitrary font `Orientation`.
960960
961961Mark labels are usually included in margins calculation to guarantee that all labels fit in the viewport. This behavior can be turned off by setting `AutoMargins` property to `false`.
962962
963963#### Multi-line marks
964964
965965If the mark text contains [`LineEnding`](http://www.freepascal.org/docs-html/rtl/system/lineending.html) character sequence, it is split into several lines. Lines of different length are aligned according to `Alignment` property.
966966
967967#### HTML codes in marks
968968
969969If the property `TextFormat` is switched to `tfHTML` then HTML entities and tags can be embedded for special formatting of marks. See HTML for details.
970970
971971### Mark positions and attachment
972972
973973The mark position relative to the marked point is determined by the marks owner (series or axis).
974974
975975Common mark properties include `Distance`, which measures the distance from the origin point to the attachment point in image units, and `Attachment`, which controls whether the attachment point is considered to be in the center or at the edge of the label box.
976976
977977Additionally, basic chart series have a property `MarkPositions` specifying the direction of labels' offsets relative to series data points as following:
978978
979979- lmpOutside -- away from the center of the data points cloud; for TBarSeries and TAreaSeries it has a special meaning: away from the ZeroLevel defined for this series.
980980- lmpPositive -- positive direction of series' Y axis
981981- lmpNegative -- negative direction of series' Y axis
982982- lmpInside -- towards the center of the data points cloud; for TBarSeries and TAreaSeries: towards the ZeroLevel
983983
984984In Lazarus 2.0+, TBarSeries and TAreaSeries have an additional property `MarkPositionCentered` which allows to center the marks origins between data points and zero level. In order to place marks exactly at the center of the bars of a BarSeries or at the center of the drop line of an AreaSeries, the following properties must be changed additionally: `Marks.Distance = 0`, and `Marks.Attachment = maCenter`.
985985
986986### Rotation of marks
987987
988988Marks can be rotated by any angle in a resolution of 1/10 degree by modifying the `Orientation` of their font; it is specified by the 10-fold value in degrees, i.e. the value 450 refers to an angle of 45°. 0° means horizontal orientation, the angle increases in the counter-clockwise direction.
989989
990990The rotation normally occurs with respect to the center of the label. Axis and series marks additionally have a property `RotationCenter` to shift the center of rotation to an edge of the text:
991991
992992- raCenter -- default setting, i.e. rotation occurs around the text center
993993- raLeft -- the rotation center is at the left edge of the label.
994994- raRight -- the rotation center is at the right edge of the text.
995995- raEdge -- ignored in case of series marks (will be replaced by raLeft). But in case of axis marks the center of rotation is automatically moved to the text start or end in order to avoid rotation of the label into the chart.
996996
997997## Drawers
998998
999999For low-level drawing routines, TAChart uses special set of classes implementing `IChartDrawer` interface. This allows such features as printing charts and exporting them to SVG format.
10001000
10011001These classes are called *drawing back-ends* or *drawers* for short.
10021002
10031003### Отрисовщик TCanvas
10041004
10051005`TCanvasDrawer` — это отрисовщик по умолчанию, используемый для отображения диаграммы в TCanvas. Это включает в себя экран и различные форматы растровых изображений. Изображение, созданное этим ящиком, используется в качестве эталона при разработке и отладке других серверных частей.
10061006
10071007### TFPCanvas drawer
10081008
10091009`TFPCanvasDrawer` is similar to TCanvas drawer, but based on `TFPCanvas` (which is a `TCanvas` analog implemented in the FCL instead of the LCL).
10101010
10111011See the "nogui" demo for an example.
10121012
10131013Although `TFPCanvas` and, correspondingly, `TFPCanvasDrawer` have a restricted implementation of some TAChart features, their important advantage is the possibility they offer of compiling an application with the nogui widgetset. This is particularly useful for Web applications, which can then generate raster chart images without any further graphic dependency, or a need to install X/Gtk/Qt on the server.
10141014
10151015### SVG drawer
10161016
10171017`TSVGDrawer` produces text stream with the image of the chart in [SVG](https://en.wikipedia.org/wiki/SVG) format. Similarly to TFPCanvas drawer, it is independent of LCL and can be used in Web applications to generate vector charts in nogui widgetset.
10181018
10191019See "save" demo for an example.
10201020
10211021For this drawer, image unit is an SVG canvas unit instead of a pixel.
10221022
10231023Note that due to the nature of SVG, there is no way to measure font dimensions, so they are approximated crudely. This may result in problems like label text not fitting in the mark rectangle, especially in browsers like Firefox that do not support `textLength` attribute.
10241024
10251025### OpenGL drawer
10261026
10271027`TOpenGLDrawer` draws chart on the current [OpenGL](https://en.wikipedia.org/wiki/OpenGL) context. It is suitable to be used in games and other OpenGL-only applications.
10281028
10291029OpenGL drawer expects, but does not set by itself, an orthogonal projection. See "opengl" demo for an example.
10301030
10311031Note that, like in OpenGL itself, `TOpenGLDrawer` font support is extremely limited.
10321032
10331033### Отрисовщик принтера
10341034
10351035TPrinterDrawer рисует диаграмму на холсте принтера. Он не очищает страницу.
10361036
10371037Хотя холст принтера является потомком `TCanvas`, и поэтому печать может выполняться с использованием [[TAChart documentation/ru|отрисовщика по умолчанию]], `TPrinterDrawer` выполняет правильное масштабирование координат изображения в соответствии с DPI принтера и экрана.
10381038
10391039Вы можете использовать этот отрисовщик для экспорта диаграммы в формат PDF с помощью одного из доступных продуктов для записи PDF.
10401040
10411041См. пример демку 'print'.
10421042
10431043Обратите внимание, что этот отрисовщик находится в отдельном пакете TAChartPrint.
10441044
10451045### AggPas drawer
10461046
10471047`TAggPasDrawer` draws chart using [AggPas library](http://www.crossgl.com/aggpas).
10481048
10491049AggPas offers high-speed antialiased drawing and is included in Lazarus sources. Unfortunately, the library is currently not maintained and there are some limitations in TAChart support.
10501050
10511051Note that this drawer is located in a separate TAChartAggPas package.
10521052
10531053### BGRABitmap drawer
10541054
10551055`TBGRADrawer` draws chart using [[BGRABitmap]] library.
10561056
10571057BGRABitmap is recently created and actively developed graphics library, offering, in particular, anti-aliasing and rich selection of gradients.
10581058
10591059Currently BGRABitmap supports all TAChart features, but is somewhat slower then other drawing methods.
10601060
10611061Note that this drawer is located in a separate TAChartBGRA package, which depends on external `bgrabitmappack` package.
10621062
10631063### FPVectorial drawer
10641064
10651065`TFPVectorialDrawer` draws chart using [[fpvectorial]] library. FPVectorial offers exporting to various vector formats, including SVG, PDF, CorelDraw and even instructions for metal cutting machines.
10661066
10671067It currently has some limitations in TAChart support, but is actively developed.
10681068
10691069Note that this drawer is located in a separate `TAChartFPVectorial` package, which depends on `fpvectorialpkg` package.
10701070
10711071### WMF drawer
10721072
10731073`TWindowsMetafileDrawer` draws chart into a [Windows Metafile](https://en.wikipedia.org/wiki/Windows_Metafile).
10741074
10751075It uses WinAPI directly, and so will only work on Windows. WMF support has been added to fpvectorial which provides a cross-platform alternative to this package.
10761076
10771077## Navigation
10781078
10791079Chart *navigation* consists of two parts: moving logical extent around without changing zoom factor, and visualizing the logical extent's position and size relative to the full extent.
10801080
10811081Moving extent (but not visualizing it) is possible by using panning tools.
10821082
10831083You can see examples in the "navigation" demo.
10841084
10851085### Scroll bars
10861086
10871087`TChartNavScrollBar` is a `TCustomScrollBar` descendant with additional `Chart` property referencing the chart. `TChartNavScrollBar` synchronizes its position with chart extent in both directions. If the logical extent is equal to or larger than the full extent, navigation scroll bar does nothing.
10881088
10891089Setting `AutoPageSize = true` lets `TChartNavScrollBar` to pick page size proportional to the logical extent.
10901090
10911091Note that `Min` and `Max` properties are *not* changed automatically. It is recommended to set `Min = 0` and `Max` to some fairly large integer value to avoid rounding issues.
10921092
10931093Also note that `TChartNavScrollBar` does not automatically align or attach itself to a chart, so it can be arbitrarily positioned on the form.
10941094
10951095### Navigation panel
10961096
10971097`TChartNavPanel` component displays logical and full extent of an assigned chart as differently colored rectangles, allowing user to drag the logical extent rectangle if `AllowDragNavigation = true`.
10981098
10991099If `MiniMap = true`, the panel additionally displays the chart series.
11001100
11011101`TChartNavPanel` can have arbitrary size, but it is recommended to keep height to width proportion the same as in the assigned chart. Setting `Proportional = true` will enforce the same proportions even if the above condition is not met, at the cost of some wasted space on the panel.
11021102
11031103## Additional components
11041104
11051105### Legend panel
11061106
11071107`TChartLegendPanel` provides a legend which can be placed anywhere on the form. The legend is taken from the chart with is assigned to the property `Chart` of the LegendPanel. The chart’s own legend should be turned off.
11081108
11091109### Chart listbox
11101110
11111111`TChartListbox` is a versatile legend replacement which displays an icon and the series title for each series of the chart attached to the property `Chart` of the listbox. But in addition to the standard legend, it also has checkboxes for each series. Unchecking a checkbox hides the associated series, checking it shows the series again. The listbox listens to changes in the associated chart and updates automatically.
11121112
11131113The property `CheckStyle` can be used to switch the listbox from a checkbox-like behavior (`cbsCheckbox`, an arbitrary combination of series can be checked) to a radiobutton-like behavior (`cbsRadioButton`, only a single series can be checked). Depending on `CheckStyle` either a radiobutton or a checkbox state icon is displayed for each series.
11141114
11151115Events are fired when the checkbox/radiobutton or the series title are clicked (`OnCheckboxClick` or `OnItemClick`, respectively), or when the series icon is double-clicked (`OnSeriesIconDblClick`). The latter event is thought to open a dialog for changing the series color, pointer style, series title etc.
11161116
11171117The listbox items are collected in a different way than for a conventional legend. The populating process ignores the series property `Legend.Visible` which controls whether the series is to be shown in the legend or not. Instead of it, there is an event `OnAddSeries` in which the `var` parameter `Skip` should be set to `true` if the series passed as another argument should be excluded from the listbox. Every series is listed only with a single item, i.e. the series’ `Multiplicity` is ignored as well. Moveover, grouping of items is not supported either.
11181118
11191119### Chart image list
11201120
11211121`TChartImageList` collects the icons displayed for each series in the legend and can be used for imagelist-aware controls, such as treeviews, listviews or menus to show icons for each series. The icons are extracted from the chart which is assigned to the `Chart` property of the component. The image list is notified of changes in the chart and updates its images automatically whenever something changes with a series. The event `OnPopulate` is fired if the image list is rebuilt.
11221122
11231123Note that this kind of image list is *volatile*, i.e. its images are not stored in the form's lfm file. Nevertheless, at runtime, it can be used as a standard image list with other images. Just add these non-series images **before** assigning the chart to the image list. Use the property `FirstSeriesIndex` to get the image index of the first series contained in the image list. Alternatively, find the image index of a specific series by calling the function `ImageIndexOfSeries(series)`.
11241124
11251125In Laz 2.1+ the `TChartImageList` can be used also at designtime. It stores only those images not assigned to a series.
11261126
11271127### Chart combobox
11281128
11291129The `TChartCombobox` is an extended combobox. Depending on the property `Mode` (`ccmPointerStyle`, ccmPenStyle, `ccmPenWidth`, `ccmBrushStyle`) it is populated with names and corresponding icons for pointer style, pen style, pen width or brush style selection. Therefore, it is useful for gui elements in which the user can modify the appearance of series and other chart objects.
11301130
11311131The combobox is not linked to a particular chart. Use the `OnChange` event to transfer the modified property to the series.
11321132
11331133## TeeChart compatibility
11341134
11351135TeeChart is a standard set of charting components used by Delphi. Although TAChart does not have a goal to to be compatible with TeeChart, basic feature set and names are very similar, so simple examples may work in both libraries equivalently.
11361136
11371137More complex features -- in particular, multi-value series, series sources, multiple axes -- are implemented differently from TeeChart. This is by design and will not change. See [[Comparing TAChart with Delphi&|comparison page]] for more detailed info.
11381138
11391139To assist porting of TeeChart code to the TAChart, you can use `TAChartTeeChart` unit. It contains class helpers adding or emulating some TeeChart-specific properties and methods.
11401140
11411141Note that it is NOT recommended to use this unit for normal development, since the emulation is only intended to simulate the subset of features implemented in TeeChart, and may not be reliable when used in conjunction with the full set of TAChart features.
11421142
11431143## Technical details
11441144
11451145### Drawing order
11461146
11471147Chart drawing consists of three stages:
11481148
114911491. *Preparation*: At this stage, various internal data structures are initialized.
115011502. *Measurement*: At this stage, the chart calculates the sizes of all elements, and optimizes them for best presentation. Optimization may require several iterations, so the measurement stage is often the heaviest one both in terms of implementation complexity and running time.
115111513. *Drawing*: At this stage, the actual chart image is displayed.
11521152
11531153There also exists an ordering among various chart elements:
11541154
115511551. Background (using `TChart.Color` property).
115611562. Back-wall (using `TChart.BackColor` property).
115711573. Series and axes according to `ZPosition` property. For each series and axis, graphic elements are drawn before marks. Note that this protects marks against hiding by the axis/series they belong to, but not by other axes/series.
115811584. Legend.
115911595. Tools.
11601160
11611161Note that `ZPosition` works for both 2-D and 3-D charts, so you can overlay series and axes in arbitrary order.
11621162
11631163### Coding style
11641164
11651165Historically FPC, Lazarus and LCL sources contain a mix of coding styles, with the general rule being "be consistent with the surrounding code".
11661166
11671167However, since TAChart has many fewer contributors, it is feasible to adopt and maintain a consistent style across all TAChart code. If you want to contribute to TAChart, please format your code accordingly. Also remember that any coding style may be violated in certain situations when the reason is good enough, but please explain that reason if you do so.
11681168
11691169#### Spaces
11701170
11711171- No double spaces anywhere.
11721172- Spaces after: operations, comma, semicolon, assignment, closing parenthesis in expressions (not in function calls).
11731173- Spaces before: operations, assignment, opening parenthesis in expressions (not in function calls).
11741174
11751175#### Lines
11761176
11771177- No double empty lines anywhere.
11781178- Empty lines between procedures, classes, unit sections. Rare empty lines inside procedure bodies to separate logical blocks.
11791179- Line length below 80 characters, with rare exceptions.
11801180- Single statement per line, except *if* ... *then* {*exit*\|*break*\|*continue*} and some rare cases of mass assignment.
11811181- If the line is too long, line breaks may be inserted after at the following symbols, in order of decreasing priority: keywords, opening parenthesis, opening square bracket, semicolon, comma, operation.
11821182
11831183#### Indentation and blocks
11841184
11851185- Always two spaces, both for blocks and continuation lines.
11861186- *begin* on the same line as the control statement, *end* aligned with the control statement.
11871187- *end* always alone on the line. In particular, write *end else begin* on two lines.
11881188- Put *then* or *do* on a separate line to separate a complex condition from the statement body:
11891189
1190-` `**`while`**\
1191-`   long condition or`\
1192-`   another long condition`\
1193-` `**`do`**\
1194-`   loop body`
1190+```text
1191+ while
1192+ long condition or
1193+ another long condition
1194+ do
1195+ loop body
1196+```
11951197
11961198- Use *begin*/*end* only when necessary (i. e. not for single statements).
11971199
11981200#### Comments
11991201
12001202- Put a license header at the beginning of every file.
12011203- Single-line comments everywhere except the license header and auto-generated class headers in implementation section.
12021204- Use only full sentences in comments, starting with a capital letter and ending with a full stop.
12031205- Comments should be placed before commented code, except in rare cases where a comment fits at the end of the same line.
12041206- Comments should only include information not evident from the source. In particular, choose meaningful procedure and argument names in preference to adding comments describing their usage.
12051207
12061208#### Names
12071209
12081210- Constants use ALL_CAPS_WITH_UNDERSCORE, everything else use CamelCase.
12091211- Local variables start with a lower-case letter, everything else starts with an upper-case letter, even when FPC library disagrees (e.g. \`\`Math\`\`, not \`\`math\`\`).
12101212- Class fields start with 'F', arguments start with 'A', types start with 'T', TAChart units start with 'TA'.
12111213
12121214#### Variable declarations
12131215
12141216- Initialize when possible.
12151217- Local variables after nested procedures unless used by them.
12161218- Group variables by type.
12171219
12181220#### Classes and methods
12191221
12201222- Methods are grouped per-class, methods inside class are sorted alphabetically both in interface and implementation. There should be zero Code Observer warnings about 'Unsorted members'.
12211223- If there is a need to group methods by topic, use visibility specifiers as topic separators. In particular, group overridden methods separately from the newly introduced ones.
12221224- Use *strict private*/*strict protected* visibility where possible.
12231225
12241226#### Hints and warnings
12251227
12261228- Code should compile with zero hints and warnings.
12271229- Silence any "unused parameter" warning with the \`\`Unused\`\` procedure from the TAChartUtils unit, or use the {%H-} Lazarus IDE directive.
12281230
12291231#### Control flow
12301232
12311233- Use *exit* or *raise* to abort method execution in case of a violated pre-condition.
12321234- Use enumerators where possible.
12331235- Use *with* carefully, and only where its use significantly saves code size and in the minimal possible range.
12341236- Limit all procedures to 50-60 lines, and use nested procedures liberally.
12351237
12361238---
12371239*From the Free Pascal wiki, page "TAChart documentation/ru", as it stood on 2022-10-18 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history