livecharts笛卡尔图表wpf上的最小值和最大值

Min and max values on livecharts cartesian chart wpf

我想强制 Y 轴以 0 为中心,我必须确保最小值和最大值相同。

我使用 Axis 的 MinValue 和 MaxValue 属性,但它不起作用(请注意,这些值通常有绑定,但我为此更改了它们 post)。

<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,我不知道如何强制它

Max value not the one i'm expecting

向图表添加值时必须计算 min/max。
最好将相应的绑定源添加到您的数据模型中。

如果您动态添加值,则必须重新计算 min/max。最重要的是,数据模型必须实现 INotifyPropertyChanged 并且属性 MaxAxisValueMinAxisValue 必须引发 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
      }
    };
  }
}

查看

<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.MinValueAxis.MaxValue 的值。这只是一个视觉差异,这是由分区的间隔引入的。

默认情况下,间隔是自动计算的。我想该算法会考虑值的小数位。如果最大绝对值为 39,则间隔将为 10^1 或 (10^1)/2。在您的情况下,您有 390,000 个使用位置 10^5。因此,间隔设置为 100,000 或 50,000,具体取决于范围。划分从下边界开始,例如-390,000。应用 100,000 的间隔将得到最大可能的除法,即小于或等于最大值 (390,000),即 310,000。
这就解释了为什么你得到的分区范围从 -390,000 到 310,000。

要"fix"这个,你必须决定你想要的步数(或划分)并明确设置Separator.StepSeparator.Step默认设置为0,启用自动间隔计算。

基本公式为
步长=value_range/desired_divisions_count

我发现 LiveCharts 使用的术语很烦人。我自然会称步数为间隔,划分数为步数。但显然设计师有不同的看法。

假设您想要 10 个分区或网格线。您必须设置 Separator.Step="78000",因为 78000 = (390,000 - (-390,000)) / 10。 这将平均分配分区,其中 min/max 值将分别落在一个分区上。

<wpf:CartesianChart.AxisY>
  <wpf:Axis MaxValue="390000"
            MinValue="-390000">
    <wpf:Axis.Separator>
      <wpf:Separator Step="78000" />
    </wpf:Axis.Separator>
  </wpf:Axis>
</wpf:CartesianChart.AxisY>