При добавлении значений в диаграмму необходимо вычислять минимум / максимум.
Лучше всего добавить соответствующие источники привязки в вашу модель данных.
Если вы добавляете значения динамически, вам необходимо пересчитать мин. / Макс. Самое важное, модель данных должна реализовывать INotifyPropertyChanged
, а свойства MaxAxisValue
и MinAxisValue
должны вызывать событие INotifyPropertyChanged.PropertyChanged
:
class ChartModel
{
public double MaxAxisValue { get; set; }
public double MinAxisValue { get; set; }
public ChartModel()
{
var chartValues = new ChartValues<double> { 10, 50, -3, -25 };
this.MaxAxisValue = chartValues
.Select(value => Math.Abs(value))
.Max();
this.MinAxisValue = this.MaxAxisValue * -1;
this.SeriesCollection = new SeriesCollection
{
new ColumnSeries()
{
Title = "Series 1",
Values = chartValues
}
};
}
}
View
<Grid>
<Grid.DataContext>
<ChartModel />
</Grid.DataContext>
<wpf:CartesianChart Series="{Binding SeriesCollection}">
<wpf:CartesianChart.AxisY>
<wpf:Axis MaxValue="{Binding MaxAxisValue}"
MinValue="{Binding MinAxisValue}">
...
</wpf:Axis>
</wpf:CartesianChart.AxisY>
</wpf:CartesianChart>
</Grid>
Обновление
Похоже, ваша проблема связана с разделителями оси или их распределением.
Сначала обратите внимание, что хотя распределение не является четным, значения Axis.MinValue
и Axis.MaxValue
по-прежнему учитываются диаграммой. Это просто визуальное несоответствие, которое вносит интервал делений.
По умолчанию интервал рассчитывается автоматически. Я предполагаю, что алгоритм учитывает десятичную позицию значений. Если максимальное абсолютное значение равно 39, то интервал будет либо 10 ^ 1, либо (10 ^ 1) / 2. В вашем случае у вас есть 390000, которые используют позицию 10 ^ 5. Таким образом, интервал установлен на 100 000 или 50 000 в зависимости от диапазона. Деления начинаются с нижней границы, например -390,000. Применение интервала 100 000 даст максимально возможное деление, которое меньше или равно максимальному значению (390 000), равному 310 000.
Это объясняет, почему вы получаете деления в диапазоне от -390 000 до 310 000.
Чтобы «исправить» это, вы должны решить количество шагов (или делений), которое вы хотите иметь, и явно указать Separator.Step
. Separator.Step
имеет значение 0
по умолчанию, что включает автоматическое вычисление c интервалов.
Базовая формула c будет выглядеть так:
step = value_range / required_divisions_count
Я нахожу терминологию, используемую в LiveCharts, весьма раздражающей. Я бы естественно назвал шаги интервал , а количество делений шаги . Но, видимо, у дизайнеров было другое восприятие.
Допустим, вы хотите иметь 10 делений или линий сетки. Вам нужно будет установить Separator.Step="78000"
, потому что 78000 = (390 000 - (-390 000)) / 10 . Это равномерно распределит деления, при этом минимальное / максимальное значение будет приходиться на каждое деление.
<wpf:CartesianChart.AxisY>
<wpf:Axis MaxValue="390000"
MinValue="-390000">
<wpf:Axis.Separator>
<wpf:Separator Step="78000" />
</wpf:Axis.Separator>
</wpf:Axis>
</wpf:CartesianChart.AxisY>