«Графики» одного числа в большом диапазоне - PullRequest
1 голос
/ 13 сентября 2011

Короче говоря, я пытаюсь создать полосу (используя обертку 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%.

Conceptual Image of Problem

Линия в нижней области бара является средней линией по региону, а весь столбец представляет от минимума (внизу) до максимума (вверху).

Текущий код 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);

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Рассмотрим логарифмическую шкалу с разрывом для чрезвычайно высоких значений, которые намного превосходят любые другие в популяции.Пример разрыва в стержнях и оси см .: http://tomhopper.files.wordpress.com/2010/08/bar-chart-natural-axis-split1.png

2 голосов
/ 13 сентября 2011

Я признаю, что я мало что знаю о GWT, поэтому я отвечаю на основе того, как бы я показал ваши значения на графике «бумага и карандаш». Этот ответ таков, что вы ответили на свой вопрос - используйте логи. Диапазон от 1000 до 55200000000 со средним значением около 27600000 после взятия (общая база 10) журналов становится примерно от 3 до 11, со средним значением около 7,4.

Предостережение в том, что то, что вы приобретаете в «разумности», вы теряете в перспективе. Возьмите децибелевую шкалу, основанную на логарифмическом (общее основание 10). Разница между звуком на 80 децибел и звуком на 85 децибелов не кажется большой разницей, за исключением того, что второе значение в три раза более энергичное.

...