【问题标题】:Min and max values on livecharts cartesian chart wpflivecharts笛卡尔图表wpf上的最小值和最大值
【发布时间】:2020-05-29 18:39:13
【问题描述】:

我想强制 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】:

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

    如果您要动态添加值,则必须重新计算最小值/最大值。最重要的是,数据模型必须实现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.StepSeparator.Step默认设置为0,启用自动间隔计算。

    基本公式是
    step = value_range / desired_divisions_count

    我发现 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> 
    

    【讨论】:

    • 我可以绑定,这不是问题。问题是最小值和最大值不是我放在视图部分的那个。我在消息末尾链接了一张图片,表明最大值不是390000而是310000。最大值不是有或没有绑定的好
    • 我明白了。然后我误解了你最初的问题。我会更新我的答案。
    • 我有时间更新答案。抱歉让您久等了。
    • 非常感谢,它成功了!我只需要四舍五入最小值和最大值,因为它们不是可以除以数字 10(步数)的数字。它就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2016-06-20
    • 2023-04-02
    相关资源
    最近更新 更多