Как уменьшить большие числа до наименьших значений, сохраняя относительные различия в размерах в C#
Вот моя проблема. У меня есть потенциально большие числа, от ста до ста миллионов или даже больше. Я хочу передать эти цифры на плоттер ( http://benpickles.github.com/peity/ если вам интересно). проблема в том, что когда у вас очень большие числа, линейный график в конечном итоге выглядит как плоская линия, поскольку числа настолько велики, что различия не отображаются на таком маленьком графике. Но если вы наметите цифры, как 2,5,8,10,15. Вы можете легко увидеть линию графика, идущую вверх и вправо круто.
Таким образом, чтобы построить мои мини-диаграммы таким образом, чтобы это действительно имело смысл, мне нужно сократить эти большие числа до как можно меньших чисел, НО поддерживать относительную разницу между числами, достаточно большими, чтобы они хорошо отображались на диаграмме, как в случае с чарты Мне не нужна идеальная формула (не уверен, что она существует). Если мои "большие" числа растут, я просто хочу, чтобы однозначные числа росли с той же относительной скоростью, что и большие числа. Если они немного плоские, я хочу, чтобы диаграмма выглядела плоской и т. Д.
У меня нет сильной математической подготовки, поэтому я не знаю, есть ли для этого фактический математический термин??
4 ответа
Посмотрите на функцию Math.Log(...). Я полагаю, вы знаете это, но в случае http://en.wikipedia.org/wiki/Logarithm. Логарифм в основном будет польстить вашему графику.
Сделайте это для каждой точки, прежде чем строить. Вы можете выбрать экспериментально (если он достаточно виден) базу логарифма. Из вашего описания я полагаю, вы должны использовать какое-то большое число, например, 10.
newPlotValue = Math.Log(plotValue, 10); // or Math.Log10(plotValue);
Из того, что я понимаю в вашем вопросе, ваша проблема в том, что числа, которые вы изображаете, имеют очень разный масштаб. Если это так, вы можете рассмотреть возможность их построения в масштабе журнала / журнала: http://en.m.wikipedia.org/wiki/Logarithmic_scale
Предположим, у вас есть следующие барометрические давления:
double[] p = { 101325.0, 101380.0, 101510.0, 101580.0, 101470.0, 101295.0, 100985.0, };
(цифры в паскалях). Если вы нанесете их на график, график может выглядеть очень прямым и горизонтальным, потому что числа имеют почти одинаковую величину.
Чтобы лучше увидеть изменения, просто вычтите некоторое фиксированное число из каждого термина. Например
double offset = 100000.0;
var pOffset = p.Select(x => x - offset).ToArray();
Тогда сюжет pOffset
вместо.
В приведенном выше примере я просто выбрал смещение 100000.0
"Волшебно". Но вы можете использовать минимум всех значений в качестве смещения, то есть
double offset = p.Min();
Мои примеры кода требуют using System.Linq;
,
Вам нужно только решить, где находится ваш масштаб сюжета.
Вы можете взять самое маленькое в качестве начала своей шкалы.
Следующее - определить общий фактор и показать это в ваших подразделениях.
Например, если числа больше 1000, разделите их все на 1000, и на этикетке укажите масштаб как (в тысячах). То же самое можно использовать миллионами или миллиардами.