Точность Auto-Interval в таблице MS

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

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

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

Ответы

Ответ 1

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

# = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1;

Ответ 2

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

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

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

Ответ 3

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

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

string formatString = "{0.00";

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

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

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

Ответ 4

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

Ответ 5

Вы можете подключиться для настройки события. Оттуда вы можете изменить метки по оси x:

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

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

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

и др.

Ответ 6

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

Ответ 7

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

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