2015-01-13 5 views
0

Как получить вторичную ось Y для обмена нулевой точкой с первичной осью Y? Меня не волнуют остальные интервалы, которые выстраиваются или что-то в этом роде, я просто хочу, чтобы первичная и вторичная оси Y имели один и тот же нуль.Установка общего нуля на первичной и вторичной оси Y

Я собираю данные по неделям по умолчанию, но моя диаграмма может измениться на совокупность по дням или месяцам. В качестве примера, когда я агрегирую по неделе, все значения положительны для обеих осей, поэтому нижняя часть диаграммы сидит в 0 (см. http://imgur.com/aIe2kaW), но когда я суммируюсь ежедневно, я получаю отрицательные значения на первичной оси. В этот момент у меня все еще есть положительные значения на вторичной оси, поэтому нижняя часть графика скачет до -2000 на первичной оси и остается на 0 на вторичной (см. http://imgur.com/Q1E8bLw).

Я попытался установить атрибут Axis.Crossing на оси, я попытался установить минимальные значения, я пробовал ряд других вещей, и ничего не работает. Есть ли способ использовать общий ноль, так что низкие положительные значения на вторичной оси не выглядят так, как будто они отрицательные, как это происходит во втором изображении?

Edit: Я использую WinForms в Visual Studio 2010

+0

Я предполагаю, что вы используете WinForms? – Abhishek

+0

Да, извините, я должен был указать это раньше. – dbooher

ответ

0

Вы можете заставить Axes делиться своими Minimum, а также Maximum значения путем установки значения по Axis.Minimum и Maximum, например, как это:

ChartArea CA = chart1.ChartAreas[0]; 
CA.AxisY2.Maximum = CA.AxisY.Maximum; 
CA.AxisY2.Minimum = CA.AxisY.Minimum; 

Если вы не знаете, как разброс значений вы можете рассчитать общее минимальное и максимальное значения:

ChartArea CA = chart1.ChartAreas[0]; 

double min = Math.Min(CA.AxisY.Minimum, CA.AxisY2.Minimum); 
double max = Math.Max(CA.AxisY.Maximum, CA.AxisY2.Maximum); 

CA.AxisY.Maximum = max; 
CA.AxisY2.Maximum = max; 
CA.AxisY.Minimum = min; 
CA.AxisY2.Minimum = min; 

Обратите внимание, что это изменит дисплей для Points в одном или обоих Series ..:

enter image description hereenter image description here

Также обратите внимание, что как бы ты изменить й ose, токи должны будут отображать правду о значениях; поэтому, если значения двух дисплеев в разных масштабах вам нужно будет найти способ вычисления минимальных значений min &, чтобы они имели общий нуль.

Если, например, Вы знаете, что 2-й Series значения x раз больше, вы можете установить его мин/макс значения x раз тех из Series1 ..:

CA.AxisY.Maximum = 15 * CA.AxisY2.Maximum; 
CA.AxisY.Minimum = 15 * CA.AxisY2.Minimum; 

Это довольно простой способ, но он работает (с использованием различных данных значения точки):

enter image description hereenter image description here

+0

Я этого боялся. Спасибо, это было очень информативно! – dbooher

+0

По какой-то причине даже установка минимума на вторичной оси (в данном случае) -327 по-прежнему отображает нижнюю часть оси как 0. Изменение максимума отлично работает, но минимум никогда не отображает ничего ниже 0. – dbooher

+0

Hm, что не должно быть. Выстрел в темноте: есть ['IsStartedFromZero'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.axis.isstartedfromzero%28v=vs.110% 29.aspx) для оси. У вас его нет? Вы можете ссылаться на изображение? – TaW

0

Принуждение оба оси имеют одинаковые пропорции, просто необходимо, чтобы решить, какой процент оси использовать. В этом примере я использую основные пропорции осей:

private static void ForceCommonZero(Chart chart) 
    { 
     chart.ChartAreas[0].RecalculateAxesScale(); 
     Axis y1 = chart.ChartAreas[0].AxisY; 
     Axis y2 = chart.ChartAreas[0].AxisY2; 
     double proportion = y1.Maximum/(-y1.Minimum); 
     y2.Maximum = proportion * (-y2.Minimum); 
    } 

Пожалуйста, обратите внимание, что я предполагаю, что обе оси равны нулю пересекла (Maximum> 0 & & Минимальная < 0), это нужно проверить (а затем это можно реализовать как метод расширения)

Смежные вопросы