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
并且属性 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 的间隔将得到最大可能的除法,即小于或等于最大值 (390,000),即 310,000。
这就解释了为什么你得到的分区范围从 -390,000 到 310,000。
要"fix"这个,你必须决定你想要的步数(或划分)并明确设置Separator.Step
。 Separator.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>
我想强制 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
并且属性 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 的间隔将得到最大可能的除法,即小于或等于最大值 (390,000),即 310,000。
这就解释了为什么你得到的分区范围从 -390,000 到 310,000。
要"fix"这个,你必须决定你想要的步数(或划分)并明确设置Separator.Step
。 Separator.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>