Как сделать так, чтобы ось x начиналась с 0 и имела шаг 2 секунды, вместо того, чтобы смотреть на секунду, которую запустила программа, используя Livecharts? - PullRequest
1 голос
/ 15 апреля 2019

Я использую пример кода из реальных графиков

Код позади

        private double _axisMax;
        private double _axisMin;


        public Plotter()
        {
            var mapper = Mappers.Xy<MeasureModel>()
                .X(model => model.DateTime.Ticks)   //use DateTime.Ticks as X
                .Y(model => model.Value);           //use the value property as Y
            //lets save the mapper globally.
            Charting.For<MeasureModel>(mapper);
            //the values property will store our values array
            ChartValues = new ChartValues<MeasureModel>();
            //lets set how to display the X Labels
            DateTimeFormatter = value => new DateTime((long)value).ToString("ss");
            //AxisStep forces the distance between each separator in the X axis
            AxisStep = TimeSpan.FromSeconds(5).Ticks;
            //AxisUnit forces lets the axis know that we are plotting seconds
            //this is not always necessary, but it can prevent wrong labeling
            AxisUnit = TimeSpan.TicksPerSecond;
            SetAxisLimits(DateTime.Now);
            //The next code simulates data changes every 300 ms
            IsReading = false;
            DataContext = this;
        }

        public ChartValues<MeasureModel> ChartValues { get; set; }
        public Func<double, string> DateTimeFormatter { get; set; }
        public double AxisStep { get; set; }
        public double AxisUnit { get; set; }

        public double AxisMax
        {
            get => _axisMax;
            set
            {
                _axisMax = value;
                OnPropertyChanged("AxisMax");
            }
        }
        public double AxisMin
        {
            get => _axisMin;
            set
            {
                _axisMin = value;
                OnPropertyChanged("AxisMin");
            }
        }

        public bool IsReading { get; set; }



        private void SetAxisLimits(DateTime now)
        {
            AxisMax = now.Ticks + TimeSpan.FromSeconds(1).Ticks; // lets force the axis to be 1 second ahead
            AxisMin = now.Ticks - TimeSpan.FromSeconds(20).Ticks; // and 20 seconds behind
        }

внутри метода, который фактически вставляет координаты. У меня есть:

So

    var now = DateTime.Now;
    ChartValues.Add(new MeasureModel
    {
        DateTime = now,
        Value = SomeFunction()
    });
    SetAxisLimits(now);
* +1012 *enter image description here

1018 * XAML * <wpf:CartesianChart Grid.Row="0" AnimationsSpeed="0:0:0.9" Hoverable="False" DataTooltip="{x:Null}"> <wpf:CartesianChart.Series> <wpf:LineSeries Name="MyChart" Values="{Binding ChartValues}" PointGeometry="{x:Null}" LineSmoothness="2" StrokeThickness="3" Stroke="#F34336" Fill="Transparent"/> </wpf:CartesianChart.Series> <wpf:CartesianChart.AxisX> <wpf:Axis LabelFormatter="{Binding DateTimeFormatter}" MaxValue="{Binding AxisMax}" MinValue="{Binding AxisMin}" Unit="{Binding AxisUnit}"> <wpf:Axis.Separator> <wpf:Separator Step="{Binding AxisStep}" /> </wpf:Axis.Separator> </wpf:Axis> </wpf:CartesianChart.AxisX> <wpf:CartesianChart.AxisY> <wpf:Axis MinValue="-20" MaxValue="20"> </wpf:Axis> </wpf:CartesianChart.AxisY> </wpf:CartesianChart> Но как изменить код, чтобы на графике отображалось x Axis label, начиная с 0, а затем переходя на 0,1,2,...100,...300 и т. Д.? Вместо запуска вторая программа запускается? Я хочу сделать что-то вроде: enter image description here enter image description here enter image description here enter image description here enter image description here Может быть, я мог бы использовать другую библиотеку, такую ​​как oxyplot или что-то еще, какой-нибудь совет по этому поводу?

1 Ответ

1 голос
/ 18 апреля 2019

Я думаю, что самым простым способом было бы сохранить первое значение данных DateTime. Затем вы можете рассчитать относительное время для каждой другой точки данных. С этими относительными значениями вы можете «заставить» свои графики начинаться с 0.

Чтобы данные перемещались с вашего графика, если время идет, вы должны передать относительное значение времени в вашу функцию SetAxisLimits(TimeSpan). Тип данных должен быть изменен на TimeSpan.

Примерно так:

var now = DateTime.Now;
if(ChartValues.Count == 0)
    start = now; // save first timestamp to reference the following datapoints
var time = now.Subtract(start)
ChartValues.Add(new MeasureModel
{
    Time = time,
    Value = SomeFunction()
});
SetAxisLimits(time);
...