Есть ли способ определить верхнее и нижнее значения DataPoint, отображаемые в области графика YAxis OxyPlot в Xamarin.Forms? - PullRequest
0 голосов
/ 13 апреля 2020

Я строю диаграмму пользовательского интерфейса Xamarin.Forms, используя OxyPlot.

  • Я хочу добиться следующего: после того, как я отобразлю область графика с двумя нарисованными точками, отобразим слева и справа от графика метку, указывающую значение для каждой точки.

  • Логика c, которую я придумал, чтобы добиться того, чего я хочу, это: Создать два абсолютных макета слева и справа от графика. Поместите метки в AbsoluteLayout.LayoutBounds (10, 0, 40, 40). Зная, что высота графика (YAxis) равна 211 pt, определите верхнее значение y (последний тик в верхней части YAxis) и нижнее значение y (последний тик в нижней части YAxis). После того, как эти два значения извлечены из графика в виде DataPoint, теперь, используя точку данных, нарисованную на графике, я могу определить, где на экране существует эта точка, чтобы затем я мог переместить метку с тем же уровнем точек (два данных точки = две боковые метки). Например:

  • Первая точка данных = 70

  • Вторая точка данных = 40

Теперь на оси YA, если верхняя Точка Y равна 120, а нижняя точка Y равна 30 =>

  • Положение метки первой точки определяется следующим образом:

    расстояние по оси Y: DistYAxis = 120 - 30 = 90

    расстояние до 1-й точки данных: DistPointOne = 70 - 30 = 40

    DistYAxis => 211 пт (высота экрана графика)

    DistPointOne =>? (высота экрана под точкой данных 70).

               => DataPointOne_Height = DistPointOne * 211 / DistYAxis = 94 
    

    Теперь просто установите текст метки равным 70 (например, 70 кг), а затем измените его положение на AbsoluteLayout.LayoutBounds (10, 211 - (margin + DataPointOne_Height), 40, 40): 211 - высота абсолютного макета, содержащего метку (каждая метка внутри абсолютного макета), поле составляет около 20 от вершины синей зоны до уровня вершины оси YAXIS. .

enter image description here

Вопросы:

  • Если вы считаете эту логику c оптимальной Тогда как определить верхнюю и нижнюю точки Y оксиплота? В настоящее время я не нашел способа получить эту информацию из сюжета.
  • Если у вас есть лучшее решение, я был бы рад узнать его.

Это Xaml код пользовательского интерфейса на снимке экрана:

<Grid AbsoluteLayout.LayoutBounds="0,50,1,.7"
                      AbsoluteLayout.LayoutFlags="WidthProportional,HeightProportional"
                      Margin="60,10,60,10">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="80"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="80"/>
                    </Grid.ColumnDefinitions>

                    <AbsoluteLayout Grid.Column="0"
                                    BackgroundColor="Blue">
                        <Label x:Name="StartWeightLabel"
                               Text="83 kg"
                               AbsoluteLayout.LayoutBounds="3,20,1,30"
                               AbsoluteLayout.LayoutFlags="WidthProportional"
                               HorizontalOptions="CenterAndExpand"/>
                    </AbsoluteLayout>

                    <!-- Chart -->
                    <AbsoluteLayout x:Name="weightChart"
                                    Grid.Column="1"/>

                    <AbsoluteLayout Grid.Column="2"
                                    BackgroundColor="Blue">
                        <Label x:Name="TargetWeightLabel"
                               Text="77 kg"
                               HorizontalOptions="CenterAndExpand"/>
                    </AbsoluteLayout>
                </Grid>

Здесь я рисую точки данных и должен располагать метки:

async Task DrawGraph()
    {

        weightStartTargetGraph.Points.Clear();

        // Draw the weight data points
        weightStartTargetGraph.Points.Add(new DataPoint(DateTimeAxis.ToDouble(startDate), weightProgramConfig.StartWeight));
        weightStartTargetGraph.Points.Add(new DataPoint(DateTimeAxis.ToDouble(targetDate), weightProgramConfig.TargetWeight));

        // Reposition the weight indicators: Here I should implement 
        // the logic mentioned above

    }
...