Точность авто-интервала в MS Chart - PullRequest
14 голосов
/ 18 сентября 2010

В настоящее время я использую графики в .NET, используя System.Windows.Forms.DataVisualization.Charting.Chart. Пока что это кажется очень мощным и прекрасно работает. Однако существует огромная проблема с точки зрения автоматического расчета интервалов. Я использую много double значений, и в библиотеках, таких как ZedGraph, он отлично справляется с этим. Он выбирает мин / макс / интервал просто отлично. Однако в MS Chart он может выбрать минимум 206,3334539832 и интервалы с аналогичной десятичной точностью. Очевидно, это выглядит довольно некрасиво.

Итак, я попытался просто сделать формат оси {0.00}, и он прекрасно работает, когда загружает график. За исключением случаев, когда вы увеличиваете масштаб, вам нужна большая точность, возможно, в 4 десятичных разрядах вместо 2. Кажется, что я либо застрял с 9 десятичными разрядами все время, либо же постоянное фиксированное число, которое может сломаться, когда кто-то требует большей точности. Я предпочел бы подобрать точность, основанную на применяемом в настоящее время уровне масштабирования. Такие библиотеки, как ZedGraph и Dundas (которые, я считаю, MS даже использует!), Как правило, выбирают хорошие значения, которые меняются при увеличении и уменьшении масштаба.

Есть ли способ изменить точность интервалов при изменении рамки зума? Это, вероятно, какое-то простое свойство, которое я установил неправильно, но трудно сказать по миллионам свойств, которыми обладает эта вещь (особенно когда существует около 14 мест, представляющих концепцию Interval).

Ответы [ 7 ]

5 голосов
/ 13 апреля 2011

У меня была точно такая же проблема при масштабировании. Я добавил код для форматирования меток оси и вызвал его из обработчика Paint. Объекты Axis View имеют свойство IsZoomed и имеют функции для получения текущих ограничений оси (GetViewMinimum / Maximum). Я установил для Axis LabelStyle.Format значение «N» для всех случаев, если диапазон Max-Min = не равен 1. Затем я установил формат «F #», где # рассчитывается на основе диапазона оси.

# = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1;
1 голос
/ 21 декабря 2010

Почему бы не изменить строку формата числа.

Создать строку формата

string formatString = "{0.00";

Определить уровень масштабирования, скажем zoomLevel = 2;

formatString = formatString.PadRight(5+zoomLevel, '0');
formatString += "}";

Теперь используйте этот форматпо оси легенды.Используйте построитель строк или другой лучший способ изменить строку формата.

1 голос
/ 09 декабря 2010

Поэкспериментировав с управлением графиком, я не смог найти простого решения вашей проблемы. Однако может помочь следующее:

Рассматривали ли вы самостоятельно установку максимальных и минимальных значений для осей? Если вы округлите действительные максимальные и минимальные значения до ближайшего разумного «округленного» числа (5, 10, 0,5, 0,01), это должно сделать расчетные интервалы более удобными.

Я понимаю, что это не идеальное решение, но, тщательно выбирая максимальные и / или минимальные значения, вы можете гарантировать, что интервалы будут "более хорошими" числами. Если диапазон ваших осей, скажем, делится на 2, 5 и 10, это должно привести к довольно хорошим интервалам.

0 голосов
/ 16 февраля 2012

Это помогает установить IntervalOffset оси, вот пример:

Private Sub chMap_AxisViewChanged(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs) Handles chMap.AxisViewChanged
  'the grid ticks are rounded values
  e.Axis.IntervalOffset = -e.Axis.ScaleView.ViewMinimum
End Sub
0 голосов
/ 23 марта 2011

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

0 голосов
/ 25 января 2011

Вы можете прикрепить к настроить событие.Оттуда вы можете изменить метки на оси х:

var xAxisLabels = chart1.ChartAreas[0].AxisX.CustomLabels;
...
xAxisLabels[0].Text = ...

установить мин.и макс.значения:

 chart1.ChartAreas[0].AxisX.Maximum = ...;

и т. д.

0 голосов
/ 10 декабря 2010

Для получения результата с минимальными затратами вы можете использовать экспоненциальный научный формат

...