Я использую MSCharts и установил для оси x IsLogarithmic значение true. Первая проблема, с которой я столкнулся, заключалась в том, что диаграмма вылетала при первом отображении.
Я нашел ответы на:
а также
http://social.msdn.microsoft.com/Forums/en/MSWinWebChart/thread/056aa11f-658c-48fa-9768-cde912cd2975
Поэтому я не устанавливаю isLogarithmic во время разработки, я делаю это во время выполнения, когда у меня есть серия с:
- Значения X указаны без значений x ‹= 0
- Series.IsXValueIndexed = ложь
- AxisX.IsStartedFromZero = ложь
Однако у меня возникла проблема при попытке перетащить некоторые точки на графике. Пример кода MS для перетаскивания точек использует функцию PixelPositionToValue в обработчике событий MouseMove. Однако, когда я пытаюсь сделать это с логарифмической осью, я должен сам преобразовать значение обратно в линейное с помощью кода, например:
int GetXValue(MouseEventArgs e, Axis axis)
{
return axis.IsLogarithmic ?
Math.Pow(axis.LogarithmBase, axis.PixelPositionToValue(e.X)) :
axis.PixelPositionToValue(e.X)
}
Я не думаю, что мне действительно нужно это делать, и, что еще хуже, иногда кажется, что PixelPositionToValue действительно преобразует значение в линейное для меня, поэтому приведенная выше функция дает противоречивые результаты.
Я заметил, что в документации для PixelPositionToValue говорится: «Преобразует абсолютное положение пикселя вдоль оси в значение оси. Этот метод работает только в событиях рисования.», хотя в примере кода MS для перетаскивания точек он используется. в обработчике событий Chart1_MouseMove.
Итак, по, вероятно, очень нелогичным причинам я попытался вызвать Chart1.Refresh()
после построения точек (а не Chart1.Invalidate()
), и непоследовательное поведение, похоже, исчезло.
Мой вопрос: кто-нибудь пробовал подобное и нашел правильный способ заставить PixelPositionToValue работать последовательно для логарифмической оси x или нашел другой обходной путь, который не требует ручного преобразования точки в линейную и вызова Chart1.Refresh()
?