Масштабирование больших значений данных, чтобы они соответствовали гораздо меньшему масштабу

Итак, что я пытаюсь сделать, так это взять массив больших чисел, скажем, от 0 до 600 КБ, и уменьшить их, чтобы они представляли одну и ту же тенденцию, но в диапазоне от 0,5 до 1,5.

Вот ситуация...

1) КРАСНАЯ полоса представляет собой объем продаж.
2) СИНЯЯ линия представляет цену за единицу.
3) РОЗОВАЯ строка представляет сумму бюджета для цены за единицу.
4) ЗЕЛЕНАЯ линия должна представляют строку бюджета для суммы продаж.

Диаграмма

Позвольте мне наметить, что я пытался сделать, и дать вам некоторое представление о том, что мне нужно сделать.

Шкала слева (ChartGroup0) используется для представления линейных графиков, а шкала справа (ChartGroup1) — для гистограммы. Данные, подаваемые на РОЗОВУЮ и СИНЮЮ линии, находятся в диапазоне от 0,5 до 1,3; Однако данные ЗЕЛЕНЫХ линий находятся в диапазоне от 0 до 600K.

Элемент управления, который я использую C1Chart, состоит максимум из двух групп диаграмм, и каждая группа диаграмм может иметь только ОДИН связанный тип диаграммы. Это означает, что если я хочу иметь ЗЕЛЕНУЮ линейную диаграмму, чтобы представить Бюджет суммы продаж и масштабировать ее в соответствии со шкалой справа, мне нужно будет добавить ее в (ChartGroup0) и масштабировать значения вниз, чтобы соответствовать в левом диапазоне весов.

Вот тут у меня проблема. Я пытался использовать алгоритм, который нашел здесь, в stackoverflow, но безрезультатно. (Как уменьшить значения, чтобы они соответствовали минимальным и максимальным значениям)
Кажется, я не могу придумать способ точного уменьшения значений для отображения той же тенденции.

Я знаю, что это может немного сбить с толку, поэтому не стесняйтесь задавать любые вопросы, и я заранее благодарю вас за любые указания, которые вы можете мне дать.

С наилучшими пожеланиями,
Ник

p.s. Изображение является примером того, как должна выглядеть диаграмма, а не того, что она может делать в настоящее время. Значения и масштабы также будут динамическими, но я считаю, что придумать способ определения максимума и минимума не будет проблемой, как только я смогу найти точный алгоритм масштабирования.


person NickC    schedule 13.07.2016    source источник
comment
Если ваши значения находятся в диапазоне 100 тыс., а вы хотите, чтобы они находились в диапазоне 0,0–9,0, просто разделите их на 100 000. 906 134/100 000 = 9,06134 ~ 9,06.   -  person Ingenioushax    schedule 13.07.2016
comment
В некоторых случаях значения могут быть от 0 до 5M, и их необходимо уменьшить где-то в диапазоне от 0,5 до 1,5.   -  person NickC    schedule 13.07.2016
comment
Итак, преобразуйте число в строку, проверьте его длину и: if(numLength == 6) { /* divide by 100k */ } if(numLength == 7) { /* divide by 1000000 */ } и т. д. Конечно, вы можете использовать перечисление для длин вместо магических чисел, но это полностью на ваше усмотрение.   -  person Ingenioushax    schedule 13.07.2016
comment
То, что вы предлагаете, - это уменьшение в 10 раз, чего я не пытаюсь достичь. В вашем примере скажем, что первое значение, введенное в диаграмму, было 500 КБ, что будет масштабироваться до 5. Это далеко за пределами диапазона цены за единицу от 0,5 до 1,5, что я пытаюсь сделать, это уменьшить его, чтобы он представлял та же тенденция, а также связь со значениями шкалы с правой стороны.   -  person NickC    schedule 13.07.2016
comment
Я не понял, что вы оригинальный вопрос, чем. Если вы хотите нормализовать свои данные, ознакомьтесь с этим сообщением normalization - Как нормализовать данные в диапазоне от 0 до 1. Это должно дать вам хорошую отправную точку.   -  person Ingenioushax    schedule 13.07.2016
comment
То, что я пытаюсь сделать, это представить ЗЕЛЕНУЮ линию, которая имеет большие значения и идеально соответствует шкале справа, на шкале слева. Причина этого в том, что правая шкала используется для графика типа BAR, а левая — для линии. Я не могу смешивать типы диаграмм в одном масштабе. Так, например, значение левой шкалы 1,2 будет примерно соответствовать значению правой шкалы 500K. Таким образом, мой ввод будет 500 КБ, и я хотел бы, чтобы он возвращал примерно 1,2, чтобы визуально данные можно было рассматривать с правой шкалы, даже если данные за ней соответствуют левой шкале.   -  person NickC    schedule 13.07.2016
comment
Ну а если вы хотите нормализовать данные так, чтобы 200k = 0,5 и 600k = 1,5, то это так просто: ((value- 200 000) / (600 000 - 200 000)) + 0,5. К вашему сведению, заявленная цель (в тексте) не соответствует примеру на изображении. Изображение имеет 0 = 0,5 и 600k = ~ 1,26.   -  person Wyatt Earp    schedule 13.07.2016
comment
@WyattEarp спасибо за объяснение. Я считаю, что ваше решение - это то, что я искал. :)   -  person NickC    schedule 13.07.2016
comment
@nick C1 запустил новый элемент управления FlexChart, который вполне может решить вашу проблему без сложных вычислений. Вы можете ссылаться на это и это   -  person Nilay Vishwakarma    schedule 15.07.2016