我想强制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,我不知道如何强制执行此操作
向图表添加值时,您必须计算最小值/最大值。最好将相应的绑定源添加到您的数据模型。
如果要动态添加值,则必须重新计算最小/最大。最重要的是,数据模型必须实现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
}
};
}
}
查看
<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。在您的情况下,您有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>