* [Comm] Как сделать удобные шкалы на осях координат?
@ 2003-02-26 9:29 Ilya Palagin
2003-02-26 10:01 ` Mike Lykov
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Ilya Palagin @ 2003-02-26 9:29 UTC (permalink / raw)
To: community
Здрасьте!
С помощью перлового модуля (генерирует графики в графических файлах по
заданным массивам) сделал построение диаграмм на лету. Все работает
замечательно, одна беда - пользоваться этими графиками неудобно. Для
примера возьмем график температуры воды на Марсе в августе:
01 - 23.37
02 - 25.56
03 - 32.55
04 - 24.89
05 - 28.99
Неудобно то, что при шкале в 10 делений значения на оси ординат будут
показаны такие:
...
25.21
24.29
23.37
А хотелось бы
...
25
24
23
А в январе температура была такая:
01 - 0.02
02 - 0.03
03 - 0.03
04 - 0.01
...
Здесь шкалу вообще лучше сделать не из 10, а 3 делений, т.к. значений
температуры у нас всего 3.
В общем - как вычислять удобную шкалу для любых данных,
если можно задать для графика:
1.массив данных
2.мин и макс значения, которые будут показаны на осях
3.кол-во делений на осях
Чувствую, что все дело в школьной арифметике, но "при попытке размышлять
об этом попадаю в замкнутый цикл".
Спасибо.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 9:29 [Comm] Как сделать удобные шкалы на осях координат? Ilya Palagin
@ 2003-02-26 10:01 ` Mike Lykov
2003-02-26 10:05 ` Ilya Palagin
2003-02-26 10:25 ` [Comm] " Sergey Degtyaryov
2003-02-27 10:13 ` [Comm] " isa
2 siblings, 1 reply; 14+ messages in thread
From: Mike Lykov @ 2003-02-26 10:01 UTC (permalink / raw)
To: community
> Чувствую, что все дело в школьной арифметике, но "при попытке размышлять
> об этом попадаю в замкнутый цикл".
модуль позволяет задавать нижние и верхние значения, которые он покажет на
оси?
тогда надо найти макс, мин, а так же вообще количество разных значений ;)
затем, думаю, лучше поделить отрезок от мин к макс на равные части (например,
на 10 частей). правда, обычно проблема возникает еще с показом точки 0...
т.е. если все значения от 29 до 30, то между 0 и 29 будет екоторое пустое
место. тут лучше показать это каким-то разрывом, а сам график масштабировать
так, чтобы диапазон от мин до макс вошел в нужную высоту картинки (высотой,
например, 400 точек).
--
Mike
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 10:01 ` Mike Lykov
@ 2003-02-26 10:05 ` Ilya Palagin
2003-02-26 10:26 ` Maxim.Savrilov
2003-02-26 11:06 ` [Comm] [JT] " Maxim.Savrilov
0 siblings, 2 replies; 14+ messages in thread
From: Ilya Palagin @ 2003-02-26 10:05 UTC (permalink / raw)
To: community
Mike Lykov wrote:
>>Чувствую, что все дело в школьной арифметике, но "при попытке размышлять
>>об этом попадаю в замкнутый цикл".
>
>
> модуль позволяет задавать нижние и верхние значения, которые он покажет на
> оси?
Да, более того - модуль _требует_ задания этих значений.
>
> тогда надо найти макс, мин, а так же вообще количество разных значений ;)
>
> затем, думаю, лучше поделить отрезок от мин к макс на равные части (например,
> на 10 частей). правда, обычно проблема возникает еще с показом точки 0...
И возникнет проблема, которую и описал.
>
> т.е. если все значения от 29 до 30, то между 0 и 29 будет екоторое пустое
> место. тут лучше показать это каким-то разрывом, а сам график масштабировать
> так, чтобы диапазон от мин до макс вошел в нужную высоту картинки (высотой,
> например, 400 точек).
>
Да так и делаю, но отметки на шкале при этом имеют "неудобные" значения.
Собс-но поэтому и сюда обратился.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 9:29 [Comm] Как сделать удобные шкалы на осях координат? Ilya Palagin
2003-02-26 10:01 ` Mike Lykov
@ 2003-02-26 10:25 ` Sergey Degtyaryov
2003-02-26 10:56 ` Ilya Palagin
2003-02-27 10:13 ` [Comm] " isa
2 siblings, 1 reply; 14+ messages in thread
From: Sergey Degtyaryov @ 2003-02-26 10:25 UTC (permalink / raw)
To: community
Ilya Palagin пишет:
> Здрасьте!
>
> С помощью перлового модуля (генерирует графики в графических файлах по
> заданным массивам) сделал построение диаграмм на лету. Все работает
> замечательно, одна беда - пользоваться этими графиками неудобно. Для
> примера возьмем график температуры воды на Марсе в августе:
> 01 - 23.37
> 02 - 25.56
> 03 - 32.55
> 04 - 24.89
> 05 - 28.99
>
>
> Неудобно то, что при шкале в 10 делений значения на оси ординат будут
> показаны такие:
> ...
> 25.21
> 24.29
> 23.37
Что за модуль?
У меня GD::Graph::bars3d
Значения:
192.168.0.2 44.214 Mbytes
192.168.0.3 14.810 Mbytes
192.168.0.1 4.501 Mbytes
Разметка по Y:
0,10,20,30,40,50
Значения:
192.168.0.2 5.402 Mbytes
192.168.0.3 4.855 Mbytes
192.168.0.1 1.929 Mbytes
Разметка по Y:
0,2,4,6,8,10
Без каких-то телодвижений.
--
Сергей Дегтярев
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 10:05 ` Ilya Palagin
@ 2003-02-26 10:26 ` Maxim.Savrilov
2003-02-26 11:05 ` Ilya Palagin
2003-02-26 11:06 ` [Comm] [JT] " Maxim.Savrilov
1 sibling, 1 reply; 14+ messages in thread
From: Maxim.Savrilov @ 2003-02-26 10:26 UTC (permalink / raw)
To: community
> >
> > т.е. если все значения от 29 до 30, то между 0 и 29 будет екоторое пустое
> > место. тут лучше показать это каким-то разрывом, а сам график масштабировать
> > так, чтобы диапазон от мин до макс вошел в нужную высоту картинки (высотой,
> > например, 400 точек).
> >
> Да так и делаю, но отметки на шкале при этом имеют "неудобные" значения.
> Собс-но поэтому и сюда обратился.
>
ИМХО, вам надо вычислать не координаты точек, а приращения, то есть эээ,
множитель арифметической прогрессии, не помню как называется
То есть если есть Ymin и Ymax
то Y0 = целое(Ymin)
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 10:25 ` [Comm] " Sergey Degtyaryov
@ 2003-02-26 10:56 ` Ilya Palagin
2003-02-26 11:39 ` Sergey Degtyaryov
0 siblings, 1 reply; 14+ messages in thread
From: Ilya Palagin @ 2003-02-26 10:56 UTC (permalink / raw)
To: community
Sergey Degtyaryov wrote:
> Ilya Palagin пишет:
>
>> Здрасьте!
>>
>> С помощью перлового модуля (генерирует графики в графических файлах по
>> заданным массивам) сделал построение диаграмм на лету. Все работает
>> замечательно, одна беда - пользоваться этими графиками неудобно. Для
>> примера возьмем график температуры воды на Марсе в августе:
>> 01 - 23.37
>> 02 - 25.56
>> 03 - 32.55
>> 04 - 24.89
>> 05 - 28.99
>>
>>
>> Неудобно то, что при шкале в 10 делений значения на оси ординат будут
>> показаны такие:
>> ...
>> 25.21
>> 24.29
>> 23.37
>
>
> Что за модуль?
> У меня GD::Graph::bars3d
>
> Значения:
> 192.168.0.2 44.214 Mbytes
> 192.168.0.3 14.810 Mbytes
> 192.168.0.1 4.501 Mbytes
>
> Разметка по Y:
> 0,10,20,30,40,50
>
> Значения:
> 192.168.0.2 5.402 Mbytes
> 192.168.0.3 4.855 Mbytes
> 192.168.0.1 1.929 Mbytes
>
> Разметка по Y:
> 0,2,4,6,8,10
>
> Без каких-то телодвижений.
>
Телодвижения ваши таковы: для GD::Graph::bars3d вы задаете min = 0, max
= 50, поэтому и красиво получается. А представьте, что значения были бы
в диапазоне 47.3 - 47.9, и вам нужно посмотреть на их колебания. Тогда
пришлось бы задавать другие min и max (например, 47 и 48). Вопрос в том,
как это делать автоматически, исходя из задаваемого массива, чтобы и
рисуемый график был оптимален для просмотра изменений, и шкала не
содержала делений вроде 47.37
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 10:26 ` Maxim.Savrilov
@ 2003-02-26 11:05 ` Ilya Palagin
0 siblings, 0 replies; 14+ messages in thread
From: Ilya Palagin @ 2003-02-26 11:05 UTC (permalink / raw)
To: community
Maxim.Savrilov@socenter.ru wrote:
>>>т.е. если все значения от 29 до 30, то между 0 и 29 будет екоторое пустое
>>>место. тут лучше показать это каким-то разрывом, а сам график масштабировать
>>>так, чтобы диапазон от мин до макс вошел в нужную высоту картинки (высотой,
>>>например, 400 точек).
>>>
>>
>>Да так и делаю, но отметки на шкале при этом имеют "неудобные" значения.
>>Собс-но поэтому и сюда обратился.
>>
>
> ИМХО, вам надо вычислать не координаты точек, а приращения, то есть эээ,
> множитель арифметической прогрессии, не помню как называется
> То есть если есть Ymin и Ymax
> то Y0 = целое(Ymin)
>
хорошо, а каков будет алгоритм определения первого значения? Например,
как мне определить точку, для которой я буду давать приращения, если мои
значения в диапазонах:
0.0004 .. 453.6 (в этом случае первое значение должно быть 0)
0.0037 .. 0.0097 (здесь шкалу нужно начать с "удобного" 0.0030 и
завершить "удобным" 0.0130)
12.45 .. 3459.65 (здесь тоже можно начать с 0)
8004.45 .. 9856.43 (а здесь шкалу начать с 8000 и закончить на 10000)
8456.98 .. 8458.23(здесь 8450 - 8460, чтобы было четко видно колебания)
Как бы все это выразить в виде алгоритма?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] [JT] Как сделать удобные шкалы на осях координат?
2003-02-26 10:05 ` Ilya Palagin
2003-02-26 10:26 ` Maxim.Savrilov
@ 2003-02-26 11:06 ` Maxim.Savrilov
1 sibling, 0 replies; 14+ messages in thread
From: Maxim.Savrilov @ 2003-02-26 11:06 UTC (permalink / raw)
To: community
> >
> > т.е. если все значения от 29 до 30, то между 0 и 29 будет екоторое пустое
> > место. тут лучше показать это каким-то разрывом, а сам график масштабировать
> > так, чтобы диапазон от мин до макс вошел в нужную высоту картинки (высотой,
> > например, 400 точек).
> >
> Да так и делаю, но отметки на шкале при этом имеют "неудобные" значения.
> Собс-но поэтому и сюда обратился.
>
нечаянно кнопь нажал.
ИМХО, вам надо вычислать не координаты точек, а приращения, то есть эээ,
__________________
>Неудобно то, что при шкале в 10 делений значения на оси ординат будут
>показаны такие:
>...
>25.21
>24.29
>23.37
Вычисляете разность арифметической прогрессии
например
d=целое((Ymax-Ymin)/(n-1))
Y0 = целое(Ymin)
И рисуем на оси точки
Y0, Y0+d, Y0+2d
При этом надо задать условие
X1<d<X2
чтобы избежать крайних значений типа бесконечность и 0
По моему, так.
__________________
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 10:56 ` Ilya Palagin
@ 2003-02-26 11:39 ` Sergey Degtyaryov
0 siblings, 0 replies; 14+ messages in thread
From: Sergey Degtyaryov @ 2003-02-26 11:39 UTC (permalink / raw)
To: community
Ilya Palagin пишет:
>> Что за модуль?
>> У меня GD::Graph::bars3d
>>
>> Значения:
>> 192.168.0.2 44.214 Mbytes
>> 192.168.0.3 14.810 Mbytes
>> 192.168.0.1 4.501 Mbytes
>>
>> Разметка по Y:
>> 0,10,20,30,40,50
>> Без каких-то телодвижений.
>>
> Телодвижения ваши таковы: для GD::Graph::bars3d вы задаете min = 0, max
> = 50, поэтому и красиво получается.
Нет. Я ничего не задаю.
А представьте, что значения были бы
> в диапазоне 47.3 - 47.9, и вам нужно посмотреть на их колебания. Тогда
> пришлось бы задавать другие min и max (например, 47 и 48). Вопрос в том,
> как это делать автоматически, исходя из задаваемого массива, чтобы и
> рисуемый график был оптимален для просмотра изменений, и шкала не
> содержала делений вроде 47.37
Я бы попробовал остановиться на каком-то количестве рисок на шкале
(например 5) и округлял максимальное значение вверх до ближайщего,
делящегося на 5 "красиво".
Ну и вниз.
Искал бы текстом -- окончание на 5 и 0, чтобы не привязываться к
величине чисел.
Высота графика в пикселях же у Вас постоянна, постоянное кол-во рисок
напрягать не будет, вон в bars3d как раз 5 штук и макс.значение кратно 10.
В bars3d есть что-то на эту тему, но как считает -- не знаю.
--
Сергей Дегтярев
^ permalink raw reply [flat|nested] 14+ messages in thread
* [Comm] Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-26 9:29 [Comm] Как сделать удобные шкалы на осях координат? Ilya Palagin
2003-02-26 10:01 ` Mike Lykov
2003-02-26 10:25 ` [Comm] " Sergey Degtyaryov
@ 2003-02-27 10:13 ` isa
2003-02-27 23:57 ` Vitaly Lugovsky
2 siblings, 1 reply; 14+ messages in thread
From: isa @ 2003-02-27 10:13 UTC (permalink / raw)
To: Ilya Palagin
Здравствуйте, Илья!
Я в свое время писал своей девушке программку на (Делфях правда) и там
выбор диапазона делался так:
procedure SelectRange( a , b: real);
var dummy,down,up :real;
n: integer;
begin
if a=b then
begin
n:= Round(log10(a));
dummy:=round(a/power(10,n-1));
while dummy>=a do dummy:=dummy-power(10,n-1)*5;
down:=dummy;
while dummy<=a do dummy:=dummy+power(10,n-1)*5;
up:=dummy;
end
else
begin
dummy:=abs(a-b);
n:= Round(log10(dummy));
down:=min(a,b);
up:=max(a,b);
dummy:=round(up/power(10,n-1));
dummy:=dummy*power(10,n-1);
while dummy <= up do dummy:=dummy+power(10,n-1)*5;
up:=dummy;
dummy:=round(down/power(10,n-1));
dummy:=dummy*power(10,n-1);
while dummy >= down do dummy:=dummy-power(10,n-1)*5;
down:=dummy;
end;
Tmin:=min(down,up); // Tmin, Tmax в Сишных терминах
Tmax:=max(down,up); // глобальные переменные -
// соответсвующие мин-максимуму оси
// абсцис
end; // Selecting rang
Она сдала с первого раза, если у вас будут вопросы не стесняйтесь
спрашивайте, впринципе это чистый Паскаль, но если надо могу
прекинуть в Си
--
С уважением,
isa mailto:iscander@mercuri.mk.ua
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-27 10:13 ` [Comm] " isa
@ 2003-02-27 23:57 ` Vitaly Lugovsky
2003-02-28 3:06 ` Ilya Palagin
2003-03-01 9:55 ` [Comm] Re[2]: " isa
0 siblings, 2 replies; 14+ messages in thread
From: Vitaly Lugovsky @ 2003-02-27 23:57 UTC (permalink / raw)
To: Ilya Palagin
On Thu, 27 Feb 2003, isa wrote:
> Здравствуйте, Илья!
> Я в свое время писал своей девушке программку на (Делфях
> правда) и там
> выбор диапазона делался так:
Плохо делал. Это очень ограниченный алгоритм. Вообще задача
эта очень сложная, требует применения серьёзной эвристики. До
конца так и не была решена.
Более-менее правильное решение есть в gnuplot (кстати, а фигли
его самого не использовать? Какой толк в изобретении
велесопедов?), но для логарифмических шкал и там полный мрак и
требуется почти всегда ручная настройке. А уж как всякие там
Mathematica рисуют, лучше и не вспоминать, а то кошмарики сниться
будут. :(
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-27 23:57 ` Vitaly Lugovsky
@ 2003-02-28 3:06 ` Ilya Palagin
2003-02-28 3:27 ` Vitaly Lugovsky
2003-03-01 9:55 ` [Comm] Re[2]: " isa
1 sibling, 1 reply; 14+ messages in thread
From: Ilya Palagin @ 2003-02-28 3:06 UTC (permalink / raw)
To: community
Vitaly Lugovsky wrote:
> On Thu, 27 Feb 2003, isa wrote:
>
>
>>Здравствуйте, Илья!
>>Я в свое время писал своей девушке программку на (Делфях
>>правда) и там
>>выбор диапазона делался так:
Спасибо, но это не совсем то. Когда-то я в институте тоже рисовалку
графиков сделал, правда, на Фортране-77, который бегал на Электронике-86
(или 87?). Проблема не в том, чтобы они рисовались, а чтобы ими было
_удобно_ пользоваться.
>
>
> Плохо делал. Это очень ограниченный алгоритм. Вообще задача
> эта очень сложная, требует применения серьёзной эвристики. До
> конца так и не была решена.
>
Опаньки.
> Более-менее правильное решение есть в gnuplot (кстати, а фигли
> его самого не использовать? Какой толк в изобретении
> велесопедов?), но для логарифмических шкал и там полный мрак и
Да нет, шкала у меня линейная, и испольую я перловый "плоттер" GD::Graph
> требуется почти всегда ручная настройке. А уж как всякие там
> Mathematica рисуют, лучше и не вспоминать, а то кошмарики сниться
> будут. :(
Да, не буду я ничего изобретать. Дам 10 делений на шкалу, пусть графики
будут не всегда оптимально расположены, зато ими можно будет пользоваться.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Comm] Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-28 3:06 ` Ilya Palagin
@ 2003-02-28 3:27 ` Vitaly Lugovsky
0 siblings, 0 replies; 14+ messages in thread
From: Vitaly Lugovsky @ 2003-02-28 3:27 UTC (permalink / raw)
To: community
On Fri, 28 Feb 2003, Ilya Palagin wrote:
> > Плохо делал. Это очень ограниченный алгоритм. Вообще задача
> > эта очень сложная, требует применения серьёзной эвристики. До
> > конца так и не была решена.
> >
> Опаньки.
Да да да. Даже для линейных шкал...
> > требуется почти всегда ручная настройке. А уж как всякие там
> > Mathematica рисуют, лучше и не вспоминать, а то кошмарики сниться
> > будут. :(
> Да, не буду я ничего изобретать. Дам 10 делений на шкалу,
> пусть графики
> будут не всегда оптимально расположены, зато ими можно будет
> пользоваться.
Правило про 10 делений далеко не всегда будет действовать - надо
ведь найти правильное начальное деление и шаг, так, чтоб числа
в подписях были удобочитаемыми. Я в своё время угробил немало
нервов на эту задачу, и, как потом выяснил, не я один на ней
сломался - полного решения до сих пор нет нигде, и число
эвристических правил иногда за сотню зашкаливает...
^ permalink raw reply [flat|nested] 14+ messages in thread
* [Comm] Re[2]: [Comm] Re: [Comm] Как сделать удобные шкалы на осях координат?
2003-02-27 23:57 ` Vitaly Lugovsky
2003-02-28 3:06 ` Ilya Palagin
@ 2003-03-01 9:55 ` isa
1 sibling, 0 replies; 14+ messages in thread
From: isa @ 2003-03-01 9:55 UTC (permalink / raw)
To: Vitaly Lugovsky
Здравствуйте, Vitaly.
Вы писали 28 февраля 2003 г., 1:57:11:
VL> On Thu, 27 Feb 2003, isa wrote:
>> Здравствуйте, Илья!
>> Я в свое время писал своей девушке программку на (Делфях
>> правда) и там
>> выбор диапазона делался так:
VL> Плохо делал. Это очень ограниченный алгоритм. Вообще задача
VL> эта очень сложная, требует применения серьёзной эвристики. До
VL> конца так и не была решена.
Я на полноту и не претендовал!!!, если человек не знал что
делать, то попробовал подсказать куда сделать первый шаг
вперёд, а если это просто трёп на тему... То действительно
лучше в сорцы посмотреть, как это уже сделано. И сделать своё
если реализовать 120 ;-) эвристик
--
С уважением,
isa mailto:iscander@mercuri.mk.ua
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2003-03-01 9:55 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-26 9:29 [Comm] Как сделать удобные шкалы на осях координат? Ilya Palagin
2003-02-26 10:01 ` Mike Lykov
2003-02-26 10:05 ` Ilya Palagin
2003-02-26 10:26 ` Maxim.Savrilov
2003-02-26 11:05 ` Ilya Palagin
2003-02-26 11:06 ` [Comm] [JT] " Maxim.Savrilov
2003-02-26 10:25 ` [Comm] " Sergey Degtyaryov
2003-02-26 10:56 ` Ilya Palagin
2003-02-26 11:39 ` Sergey Degtyaryov
2003-02-27 10:13 ` [Comm] " isa
2003-02-27 23:57 ` Vitaly Lugovsky
2003-02-28 3:06 ` Ilya Palagin
2003-02-28 3:27 ` Vitaly Lugovsky
2003-03-01 9:55 ` [Comm] Re[2]: " isa
ALT Linux Community general discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
public-inbox-index community
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.community
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git