Короче говоря, я пытаюсь создать полосу (используя обертку GWT для холста HTML5), которая будет показывать что-то разумное для заданного значения, независимо от того, какое значение имеют нижняя и верхняя части диаграммы. Я предполагаю, что лучший подход - логарифмический, но я полностью открыт для любого другого решения.
Предположения:
Наша вертикальная полоса высотой 200 пикселей и шириной 35 пикселей.
Мы показываем "сайт" против его родительского "региона". Это единицы мощности (например, кВт, МВт, ГВт).
«Регион» имеет диапазон от 1 кВт до 55,19 ГВт. Среднее значение составляет 27,6 МВт.
Приблизительно 95% площадок в регионе намного ближе к 1 Вт, чем 55 ГВт, но верхние 5% значительно искажают среднее значение.
first site
имеет значение 12.67 MW
. second site
имеет значение 192.21 kW
.
Очевидно, что второй сайт даже не будет регистрироваться на линейном графике, тогда как первый будет регистрироваться очень низко.
Как я могу сделать эту панель более полезной? Например, я бы хотел, чтобы первые 5% сайтов, которые искажают среднее значение по региону, представляли лишь небольшую часть (5%) от общего бара, тогда как остальные 95% должны представлять 95%.
Линия в нижней области бара является средней линией по региону, а весь столбец представляет от минимума (внизу) до максимума (вверху).
Текущий код Java с использованием log10:
// BAR_GRAPH_WIDTH = 36, BAR_GRAPH_HEIGHT = 200
// regionNsp (MW): [min=0.0, max=55192.8, avg=27596.5]
// siteNsp (MW) = 187.18
DrawingArea canvas = new DrawingArea(BAR_GRAPH_WIDTH, BAR_GRAPH_HEIGHT);
Rectangle bgRect = new Rectangle(1, 0, BAR_GRAPH_WIDTH - 1, BAR_GRAPH_HEIGHT); // backgound bar
bgRect.setFillColor("white");
canvas.add(bgRect);
int graphSize = (int)(BAR_GRAPH_HEIGHT / Math.log10(regionNsp.getMax()));
int siteHeight = (int)Math.log10(siteNsp - regionNsp.getMin()) * graphSize;
Rectangle valueRect = new Rectangle(1, BAR_GRAPH_HEIGHT-siteHeight, 35, siteHeight);
valueRect.setFillColor("lightgreen");
canvas.add(valueRect);