Работа с осями в Tchart |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Работа с осями в Tchart |
AlexSCH |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Численные значения по осям привязаны строго к графику, который этот компонент отображает. Размерность чисел по осям не соответсвует реальным параметрам. То есть, отображается в 1 компоненте TChart 8 графиков, после построения все они находятся в определенных переделах по значениям, в одной системе координат. Но каждый из графиков несет свою информацию, причем 1 график это, например, Вольты, второй - милиАмперы, возможно ли поменять шкалу по оси ординат в компоненте TChart, не меняя при этом изображение графиков? То есть поменять абстрактыне числа после построения на реальные вольты или амперы и т.д.
|
klem4 |
Сообщение
#2
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
ИМХО не стоит в одной системе координат размесщать среднемесячную температуру северных райнов Иднии и среднюю посещаемость форума "Все о Паскале"
Зачем смешивать красное и мокрое ? Может стоит разные графики (для которых требуются разные размерности по осям) рисовать на разных ТЧартах ? Или в разное время ? По моему это более чем логично. Ну или я чего-то не понял. -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
AlexSCH |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
хорошо, а можно ли вообще менять размерность по осям? например, если у меня 100 значений какого-то параметра, при выведении на TСhart по оси Х будут цифры от 0 до 100, а в реальности каждое значение это
0.1 сек (выборка), то есть мне нужно чтобы шкала выглядела так от 0 до 10 сек, причем графическая информация не должна меняться. |
volvo |
Сообщение
#4
|
Гость |
AlexSCH, в дистрибутиве Дельфи (в 6-ой версии, по крайней мере) есть пример использования TeeChart. Так вот в том примере по-моему Features -> Custom Axis Labeling как раз показывает, как менять надписи на осях. Сам график при этом не меняется...
|
klem4 |
Сообщение
#5
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Chart1.BottomAxis.Minimum := 0; Длч нижней оси : - максимальное значение = 1 - минимальное значение = 0 - шаг = 0.1 Навеняка все это можно менять и с помощью вкладки Scales. Все это мне стало ясно, когда я побывал тут. Зайди посмотри, там есть таблица свойств космонента TChart, и картинки есть :D Эскизы прикрепленных изображений -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
AlexSCH |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Цитата Код Chart1.BottomAxis.Minimum := 0; Chart1.BottomAxis.Maximum := 1; Chart1.BottomAxis.Increment := 0.1; эти команды просто меняют масштаб и шаг, и все (то есть график меняется). А мне нужно заменить цифры абстрактные (например 0....100) на реальные (коэффициенты пересчета есть) чтобы шкала оси выглядела не 0...100, а, например, 0...10, и график не должен меняться. 2Volvo пытался разобратся с компонентом AxiLabel что в демонстрациях, так и не понял как можно заменить, например цифру 100 на 0.1 и чтобы график не менялся. Привожу текст этого компонента, может кто-то из вас разберется..... Код {******************************************} { TeeChart. TChart Component } { Copyright (c) 1995-2001 by David Berneda } { All Rights Reserved } {******************************************} unit uaxislab; interface { This Sample Project shows how to set the Axis Labels at specific Axis positions. The key is the Chart.OnGetNextAxisLabel event. This event is called continuosly for each Axis Label until user decides to stop. At each call, you can specify the exact Axis value where a Label must be drawn. In this example, this event is used to set the BottomAxis labels to the first (1) day in month: 1/1/96, 2/1/96, 3/1/96..... 12/1/96 This don't needs necessarily to be datetime values. You can also set the Axis Labels in non-datetime axis. WARNING: Remember to set the Stop boolean variable to TRUE when no more labels are needed. Remember also that using this event will NOT calculate Label used space or any Font size adjustment. TeeChart Axis will draw all labels you specify. } uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Chart, Series, ExtCtrls, StdCtrls, Teengine, Buttons, TeeProcs; type TAxisLabelsForm = class(TForm) Chart1: TChart; LineSeries1: TLineSeries; Panel1: TPanel; RadioGroup1: TRadioGroup; PointSeries1: TPointSeries; BitBtn3: TBitBtn; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure RadioGroup1Click(Sender: TObject); procedure Chart1GetNextAxisLabel(Sender: TChartAxis; LabelIndex: Longint; var LabelValue: Double; var Stop: Boolean); private { Private declarations } public { Public declarations } DefaultLabels:Boolean; end; implementation {$R *.dfm} procedure TAxisLabelsForm.FormCreate(Sender: TObject); var t:Longint; begin DefaultLabels:=False; { <-- boolean variable to show or not the demo } LineSeries1.Clear; PointSeries1.Clear; for t:=1 to 100 do Begin LineSeries1.AddXY( Date+t, 200+Random(700),'',clTeeColor); { <-- some random points } PointSeries1.AddXY( Date+t, 200+Random(700),'',clTeeColor); end; end; procedure TAxisLabelsForm.RadioGroup1Click(Sender: TObject); begin { Choose between default and custom labeling. } DefaultLabels:=RadioGroup1.ItemIndex=0; Chart1.Repaint; { <-- repaint chart to see changes } end; procedure TAxisLabelsForm.Chart1GetNextAxisLabel(Sender: TChartAxis; LabelIndex: Longint; var LabelValue: Double; var Stop: Boolean); var year,month,day:Word; begin if not DefaultLabels then Begin if Sender=Chart1.BottomAxis then Begin { ***************************** } { WARNING: Setting this axis increment: Chart1.BottomAxis.Increment := DateTimeStep[ dtOneMonth ]; and... Chart1.BottomAxis.ExactDateTime := True; Eliminates the need for the following code. } { ***************************** } { LabelValue has the "candidate" value where the Axis label will be painted. } DecodeDate(LabelValue,year,month,day); { we force that value to be the first day in month } Day:=1; Month:=Month+1; if Month>12 then Begin Month:=1; Year:=Year+1; end; { Then we set the preferred Label value } LabelValue:=EncodeDate(year,month,day); end else if Sender=Chart1.LeftAxis then Begin { In this example, we want the Vertical Left Axis to show labels only for positive values, starting at zero and with 250 label increment. } if LabelValue>=250 then LabelValue:=LabelValue+250 else LabelValue:=250; End; { we want more labels !! } Stop:=False; end; end; end. Зарнее спасибо. |
volvo |
Сообщение
#7
|
Гость |
Ну, например, вот так:
unit Unit1; Обрати внимание, я не использовал OnGetNextAxisLabel, а использовал OnGetAxisLabel... В списке Uses могут быть лишние модули, не пугайся, я просто добавлял этот код в другой проект... |
AlexSCH |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
2Volvo
Попробовал твой вариант, не заработало, сколько я ни пытался отследить пошагово, но ниразу указатель не попадал в процедуру TForm1.Chart1GetAxisLabel, то есть не происходило выполнение процедуры, на кнопку жмешь, меняется состояние DefaultLabels и все, или я уже совсем запутался, просвети пожалуйста? Мне просто интересно, как запустить вот эту процедуру, где меняются значения по осям? |
volvo |
Сообщение
#9
|
Гость |
Присоединяю полностью проект (жми на кнопку и смотри на левую ось):
Если надо - говори, присоединю и EXE-шник... Брекпойнт поставь внутрь процедуры Chart1GetAxisLabel, туда где он стоит у меня. И запусти через F9 ... Прикрепленные файлы project.rar ( 2.91 килобайт ) Кол-во скачиваний: 542 |
AlexSCH |
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Получается что эта процедура выполняется постоянно?
|
volvo |
Сообщение
#11
|
Гость |
Цитата(Delphi Help) OnGetAxisLabel Event Declaration property OnGetAxisLabel : TAxisOnGetLabel Description An Event is triggered for each Axis Label painted. There are two different uses for OnGetAxisLabel: <...> Таким образом ответ на твой вопрос - "нет", потому, что эта процедура выполняется перед каждой отрисовкой метки оси (кстати, как раз удобно для случая, если тебе понадобится подменить эту метку), но не постоянно. Попробуй убрать Chart1.Repaint из обработки нажатия на кнопку, и ты в этом убедишься. |
AlexSCH |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Вообще чудеса.......
В своем проекту не получается. К твоему проекту добавил еще один TChart, прописал все то же самое для него, в результате созданный тобой работает, а на моем ось не меняется, в чем загвоздка? Архив проекта я прикрепил. Прикрепленные файлы project.rar ( 7.2 килобайт ) Кол-во скачиваний: 501 |
volvo |
Сообщение
#13
|
Гость |
Нет... Так не пойдет... OnGetAxisLabel - событие, а не простая процедура... Поэтому если ты внутри метода Chart1GetAxisLabel пишешь вот это условие:
if sender = chart2.LeftAxis then begin, то эта попытка изначально обречена на провал. Нужно обрабатывать событие OnGetAxisLabel для второго чарта... |
AlexSCH |
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
вроде для второго чарта написал отдельную обработку события, но все равно не работает.......((((
Прикрепленные файлы project1.rar ( 7.27 килобайт ) Кол-во скачиваний: 507 |
volvo |
Сообщение
#15
|
Гость |
Угу... Написать-то ты написал, только вероятно ВРУЧНУЮ... А вот Дельфи страшно не любит, когда программист лезет в определение класса ДО public и private... Это - территория Дельфи... Так что удаляй то, что добавил сам, в Object Inspector-е для второго чарта выбирай нужное событие и потом его корректируй, и только тогда о нем будет известно программе...
Или просто (ничего не удаляя) зайди в Object Inspector и для второго чарта выбери процедуру обработки события из списка... Сейчас программа ничего не знает о том, что ты обработку этого события добавил... |
AlexSCH |
Сообщение
#16
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Огромное тебе спасибо Volvo, заработало так как надо.
кстати как быть с BottomAxis, если значение больше 999, у меня например график по оси х заканчивается цифрами 2146, по нажатию на кнопку выскакивает 2 146 is not a valid floating point...., я так понял, что значение возвращается с пробелом между 2 и 146, поэтому она (программа) не понимает этого значения ??? |
volvo |
Сообщение
#17
|
Гость |
Удалить разделитель тысяч, и потом работать со строкой:
вместо labeltext := floattostr(strtofloat(LabelText) / 1000); делай что-то вроде: labeltext := floattostr(strtofloat( |
AlexSCH |
Сообщение
#18
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Еще раз спасибо огромное за помощь.
|
AlexSCH |
Сообщение
#19
|
Новичок Группа: Пользователи Сообщений: 36 Пол: Мужской Репутация: 0 |
Еще вопрос, как присвоить содержимое переменной типа String названию оси.
Я делал так: Код gerc:=gerc+(help[i]); i:=i+1; Chart1.BottomAxis.Title:=gerc; Но выдает ошибку про несовместимость форматов TCharAxisTitile и String, какой космандой можно перевести string в этот TCharAxisTitile ? |
volvo |
Сообщение
#20
|
Гость |
Chart1.BottomAxis.Title.Caption := gerc; |
Текстовая версия | 16.10.2024 15:38 |