2017-02-06 22 views
1

У меня есть данные по артериальному давлению у пользователя и вы хотите построить это с помощью Oxyplot. Систолическое значение, диастолическое значение и дата, обозначающая дату проведения тестов.Участок 3 набора данных по 2 осям

Я немного зациклился на том, как представить 2 значения для артериального давления в одной точке данных, против переменной месяца, поскольку точка данных принимает только две переменные.

Вот мой код:

plotModel = new PlotModel { Title = "Blood Presure" }; 
plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left,AbsoluteMaximum = 190, Maximum = 190,AbsoluteMinimum = 10, Minimum = 10, Title = "Diastolic" }); 
plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom,AbsoluteMaximum = 12, Maximum = 12,AbsoluteMinimum = 1, Minimum = 1, MajorStep = 1, Title = "Month" }); 
plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Top, AbsoluteMaximum = 190, Maximum = 190, AbsoluteMinimum = 10, Minimum = 10, Title = "Systolic" }); 

var series2 = new LineSeries 
{ 
    MarkerType = MarkerType.Circle, 
    MarkerSize = 4, 
    MarkerStroke = OxyColors.White 

}; 

if (userInfo != null) 
    { 
     if (userInfo.Count > 0) 
     { 
      var counter = 0.00; 

      foreach (Info healthData in userInfo) 
       { 
        var bp = healthData.BloodPressure; 

        var date = healthData.CreatedDate; 

        var month = date.Month; 

        if (dateLabel != null) 
        { 
         dateLabel.Text = month.ToString(); 

        } 

         // TODO Split this blood pressure value 

        var result = Regex.Split(bp,"/"); 

        string systolicValue = null; 
        string diastolicValue = null; 

        if (result.Length > 1) 
        { 
         systolicValue = result[0]; 
         diastolicValue = result[1]; 
        } 


        series2.Points.Add(new DataPoint(month + counter, double.Parse(systolicValue))); 

        counter += 0.02; 

        } 

Как лучше представить эти значения на графике? Вот снимок экрана моего графика в настоящее время:

screen shot

ответ

0

Я нашел простое решение, захватив все три набора данных с помощью PointAnnotations как это:

plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left,AbsoluteMaximum = 190, Maximum = 190,AbsoluteMinimum = 70, Minimum = 70, Title = "Systolic" }); 
plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, AbsoluteMaximum = 190, Maximum = 190, AbsoluteMinimum = 40, Minimum = 40, Title = "Diastolic" }); 

var series2 = new LineSeries 
{ 
MarkerType = MarkerType.Circle, 
MarkerSize = 4, 
MarkerStroke = OxyColors.White 

; 

if (userInfo != null) 
{ 
    if (userInfo.Count > 0) 
    { 
     var counter = 0.00; 

     foreach (Info healthData in userInfo) 
      { 
       var bp = healthData.BloodPressure; 

       var date = healthData.CreatedDate; 

       var month = date.Month; 

       if (dateLabel != null) 
       { 
        dateLabel.Text = month.ToString(); 

       } 

        // TODO Split this blood pressure value 

       var result = Regex.Split(bp,"/"); 

       string systolicValue = null; 
       string diastolicValue = null; 

       if (result.Length > 1) 
       { 
        systolicValue = result[0]; 
        diastolicValue = result[1]; 
       } 


       series2.Points.Add(new DataPoint(double.Parse(diastolicValue), double.Parse(systolicValue))); 

       var pointAnnotation1 = new PointAnnotation(); 
       pointAnnotation1.X = Convert.ToDouble(diastolicValue); 
       pointAnnotation1.Y = Convert.ToDouble(systolicValue); 
       pointAnnotation1.Text = String.Format("{0}",date.ToString("MM/dd/yyyy")); // I'm adding the date label here 
       plotModel.Annotations.Add(pointAnnotation1); 


       } 

      } 

     } 

    plotModel.Series.Add(series2); 

Ниже приводится изображение того, что граф выглядит теперь

Screen shot

1

Ваши данные трехмерным. Вы можете представить их на трехмерном графике (который до тех пор, как я знаю, OxyPlot не поддерживает). Другим вариантом является, чтобы нарисовать график рассеяния и показать один из размеров, как размер (и/или цвет) точек:

 //Data: 
     int n = 10; 
     var dia = new double[10] {1,3,3,4,4,2,4,5,6,4 }; 
     var sys = new double[10] {2,2,2,4,5,3,4,4,5,6 }; 
     var mon = Enumerable.Range(1, n).ToArray(); 

     var model = new PlotModel { Title = "ScatterSeries" }; 
     var scatterSeries = new OxyPlot.Series.ScatterSeries { MarkerType = MarkerType.Circle }; 
     for (int i = 0; i < n; i++) 
     { 
      var x = mon[i]; 
      var y = sys[i]; 
      var size = dia[i]; 
      scatterSeries.Points.Add(new OxyPlot.Series.ScatterPoint(x, y, size, size)); 
     } 
     model.Series.Add(scatterSeries); 
     model.Axes.Add(new OxyPlot.Axes.LinearColorAxis { Position = OxyPlot.Axes.AxisPosition.Right, Palette = OxyPalettes.BlueWhiteRed(30) }); 
     model.Axes.Add(new OxyPlot.Axes.LinearAxis { Position = OxyPlot.Axes.AxisPosition.Bottom }); 
     model.Axes.Add(new OxyPlot.Axes.LinearAxis { Position = OxyPlot.Axes.AxisPosition.Left }); 
     var plot = new OxyPlot.Wpf.PlotView() { Model = model }; 
     this.Content = plot; 
+0

Рамин, спасибо. Я попробую этот подход и поделиться с вами своими отзывами. – naffie

+0

Правильно ли эта линия? scatterSeries.Points.Add (новый OxyPlot.Series.ScatterPoint (x, y, размер, размер)); Я не думаю, что мы фиксируем все 3 переменные в ScatterPoint. Вы назначаете только x и y, но передаете диастолическое значение как размер. – naffie

+0

см. [Это] (https://en.m.wikipedia.org/wiki/Bubble_chart). – Ron