[image]

Расчет цены делений осей графика

 
Есть график величины. Ось Y разбита на 50 промежуточных и 10 основных делений. Как рассчитать оптимальную цену делений если известен максимум графика, так чтобы график был удобен?
   35.035.0
RU спокойный тип #04.02.2015 11:44  @GOGI#03.02.2015 17:51
+
-
edit
 

спокойный тип
Спокойный_Тип

старожил
★☆
GOGI> Есть график величины. Ось Y разбита на 50 промежуточных и 10 основных делений. Как рассчитать оптимальную цену делений если известен максимум графика, так чтобы график был удобен?

понятие "удобен" - оно очень растяжимое, в сторону инфографики

если простой график без загибонов то для начала попробуй такую цену деления что бы над максимом по Y было ещё процентов 5-10 от шкалы , но при этом они должны быть "круглыми"

примерно как ROUNDDOWN(MAX(Y1:Y1000)*1,1/50;0) - цена промежуточного деления

[показать]
   35.035.0
RU GOGI #04.02.2015 20:44  @спокойный тип#04.02.2015 11:44
+
-
edit
 
с.т.> понятие "удобен" - оно очень растяжимое, в сторону инфографики
Так в том-то и проблема. Вот, например, взять цену основного деления 70. Вроде и на 5 легко делится, но ведь очевидно, что надо брать 100, это будет много красивее.
Я уже подумываю, чтобы просто разбить весь диапазон возможных значений на интервалы и вручную составить таблицу цены делений.
   35.035.0
RU спокойный тип #04.02.2015 21:16  @GOGI#04.02.2015 20:44
+
-
edit
 

спокойный тип
Спокойный_Тип

старожил
★☆
с.т.>> понятие "удобен" - оно очень растяжимое, в сторону инфографики
GOGI> Так в том-то и проблема. Вот, например, взять цену основного деления 70. Вроде и на 5 легко делится, но ведь очевидно, что надо брать 100, это будет много красивее.


ну вот видешь, уже вкусовщина :-D , на мой вкус может быть как 70 так и 100 - смотря какой диапазон

если у тебя например максимумальное по Y будет 650 (при минимальном в районе плюс нуля) то 10 по 70 будет нормально смотреться а 10 по 100 - визуально только на половину будет болтаться, неаккуратненько )))



GOGI> Я уже подумываю, чтобы просто разбить весь диапазон возможных значений на интервалы и вручную составить таблицу цены делений.

для начала нужно конечно прикинуть на бумажке чего хочется, а потом функцию сделать подходящую (хотя и таблично тоже можно)...например можно придумать "округлять" основное деление до степеней пятерок и десяток, будет ряд типа 5,10,25,100,125.. - если тебе 70 не нравится :-D

зы опять же вопрос что там за графики ты строишь...если это типа процентов что-то или температура...может как раз и 10х10 будет смотреться уместно даже при "полупустом" графике
а если это полоса пропускания например то совсем другие должны быть градации (1,2,10,32..)
   35.035.0
Это сообщение редактировалось 04.02.2015 в 21:25
+
-
edit
 

Massaraksh

аксакал
★☆
с.т.>> понятие "удобен" - оно очень растяжимое, в сторону инфографики
GOGI> Так в том-то и проблема. Вот, например, взять цену основного деления 70. Вроде и на 5 легко делится, но ведь очевидно, что надо брать 100, это будет много красивее.
GOGI> Я уже подумываю, чтобы просто разбить весь диапазон возможных значений на интервалы и вручную составить таблицу цены делений.
code text
  1. const stepscale:array [0..nstepscale] of Extended=(0.0001,0.0002,0.00025,0.0005,0.001,0.002,0.0025,0.005,0.01,0.02,0.025,0.05,0.1,0.2,0.25,0.5,1,2,2.5,5,10,20,25,50,100,200,250,500,1000,2000,2500,5000,10000,20000,25000,50000,100000,200000,250000,500000);
  2. .........................
  3. //-----------Горизонтальные линии
  4.    Pb.Canvas.Pen.Color:=linecolor;
  5.    Pb.Canvas.Pen.Style:=psDot;
  6.    yyy:=maxy[0]-miny[0];
  7.    j:=Pb.Height-Bottomy-3;
  8.    j:=j div 40;if j=0 then j:=1;
  9.    yyy:=yyy/j;
  10.    b:=1000000000.0;
  11.    for i:=0 to nstepscale do
  12.       begin
  13.       a:=Abs(stepscale[i]-yyy);
  14.       if a<b then begin b:=a;j:=i; end;
  15.       end;
  16.    b:=stepscale[j];
  17.    xxx:=1/b;
  18.    aaa:=miny[0]*xxx;
  19.    aaa:=Trunc(aaa+0.1);
  20.    aaa:=aaa/xxx;
  21.    sigh:=0;DetectSigns(miny[0],maxy[0],aaa,b,sigh);
  22.    for i:=1 to 100 do
  23.       begin
  24.       if aaa<miny[0] then goto 4;
  25.       if aaa>maxy[0] then break;
  26.       j:=CalcY(aaa,0);
  27.       Pb.Canvas.MoveTo(Leftx,j);
  28.       Pb.Canvas.LineTo(Pb.Width-Rightx,j);
  29.       s:=Trim(Format('%10.'+IntToStr(Sigh)+'f',[aaa]));
  30.       Pb.Canvas.TextOut(10,j-5,s); //x=Pb.Width-Rightx+5
  31. 4:    aaa:=aaa+b;
  32.       end;
   43.043.0

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru