ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [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