实时图表笛卡尔图表wpf的最小值和最大值

问题描述 投票:0回答:1

我想强制Y轴居中于0,并且必须确保最小值和最大值相同。

我使用Axis的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,我不知道如何强制执行此操作

Max value not the one i'm expecting

c# wpf charts livecharts
1个回答
0
投票

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

如果要动态添加值,则必须重新计算最小/最大。最重要的是,数据模型必须实现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的步进将获得最大可能的步进,小于或等于310,000的最大值(390,000)。这解释了为什么您获得从-390,000到310,000的步骤。

要“解决”此问题,您必须确定所需的步数(或网格线)并明确设置Separator.Step。默认情况下,Separator.Step设置为0,启用自动步长计算。

基本公式是步骤=值范围/期望的分区数

我发现LiveCharts使用的术语非常令人讨厌。我自然会将步数称为[[interval,将分割数称为steps。但是显然,设计师有不同的看法。

假设您要有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>
© www.soinside.com 2019 - 2024. All rights reserved.