Минимальные и максимальные значения на живых диаграммах декартова диаграмма wpf - PullRequest
0 голосов
/ 28 мая 2020

Я хочу, чтобы ось Y была центрирована на 0, и я должен убедиться, что минимальные и максимальные значения совпадают.

Я использую свойства MinValue и MaxValue оси, но это не так работают (обратите внимание, что обычно есть привязка к этим значениям, но я изменил их для этого сообщения).

<lvc:CartesianChart.AxisY>
            <lvc:Axis Title="{Binding SelectedLine.Unit}"
                      LabelFormatter="{Binding Formatter}"
                      FontSize="14"
                      MinValue="-390000"
                      MaxValue="390000"
                      Foreground="{StaticResource GeneralForegroundColor}">
                <lvc:Axis.Separator>
                    <lvc:Separator Stroke="LightGray"

                                   StrokeThickness="1">
                        <lvc:Separator.StrokeDashArray>
                            <DoubleCollection>
                                <sys:Double>6</sys:Double>
                            </DoubleCollection>
                        </lvc:Separator.StrokeDashArray>
                    </lvc:Separator>
                </lvc:Axis.Separator>
                <lvc:Axis.Sections>
                    <lvc:AxisSection Value="0" StrokeThickness="1"  Stroke="Black">
                    </lvc:AxisSection>
                </lvc:Axis.Sections>
            </lvc:Axis>
        </lvc:CartesianChart.AxisY>

Максимальное значение не 390000, и я не знаю, как это сделать, чтобы заставить его

Максимальное значение не то, которое я ожидал

1 Ответ

0 голосов
/ 28 мая 2020

При добавлении значений в диаграмму необходимо вычислять минимум / максимум.
Лучше всего добавить соответствующие источники привязки в вашу модель данных.

Если вы добавляете значения динамически, вам необходимо пересчитать мин. / Макс. Самое важное, модель данных должна реализовывать 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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...