Работа со значениями zedgraph XDate для установки значений Major | MinorStep и BaseTic для оси x

Я пытаюсь контролировать метки значений для оси x моего zedgraph. Раньше ярлыки «летали» и не оставались на оси. Они могут перемещаться влево или вправо по оси, появляться и исчезать в зависимости от данных. Как на картинке ниже

введите описание изображения здесь

Я сначала попытался нарисовать ярлыки сам, когда наконец нашел хорошую документацию для библиотеки zedgraph . Там я нашел [AXIS].Scale варианты MajorStep MinorStep и BaseTic. Что, если установлено правильно, должно привести к тому, что метки останутся на месте и просто изменят значение по мере добавления данных.

Проблема, с которой я сталкиваюсь, заключается в том, что моя шкала по оси X находится в XDate единицах. Это означает, что я не могу делать простую математику, на которую надеялся. Так что с тех пор я придумал способ найти нужные мне значения, используя TimeSpan и DateTime. Ниже curMaxX и curMinX находятся XDate значения текущих минимального и максимального значений оси x (curMinX в основном должно быть DateTime.Now, потому что эти данные являются данными в реальном времени)

// Setup
TimeSpan scaleDist = curMaxX.DateTime.Subtract(curMinX.DateTime);
TimeSpan major = new TimeSpan(scaleDist.Ticks / 5);
TimeSpan minor = new TimeSpan(major.Ticks / 5);
TimeSpan baseT = new TimeSpan(curMinX.DateTime.Ticks + major.Ticks);
// Setting the values
myPane.XAxis.Scale.MajorStep = new XDate(new DateTime(major.Ticks));
myPane.XAxis.Scale.MinorStep = new XDate(new DateTime(minor.Ticks));
myPane.XAxis.Scale.BaseTic = new XDate(new DateTime(baseT.Ticks));
// Print statement of the values
SDist: 00:00:10
Major: 00:00:02
Minor: 00:00:00.4000000
BaseT: 735382.07:32:34
BaseTAsDateTime: 5/30/2014 7:32:34 AM
CurMinX:         5/30/2014 7:32:32 AM

Хотя установка значений как таковых по-прежнему не дает того, чего я хочу. С этим кодом моя ось x выглядит так

введите описание изображения здесь

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

Для документации по основным и второстепенным шагам написано

Для осей даты это значение определяется в единицах Major / MinorUnit.

У меня MajorUnit это минуты, а MinorUnit - секунды, но я передаю им значение XDate, которое указывает как минуты, так и секунды. Кроме того, установка значений в виде долей от целого (поэтому, если я хочу, чтобы MajorStep составлял 2 секунды, я бы установил его как (2/60)), ничего не отображается.

Есть идеи / предложения?


person AnotherUser    schedule 30.05.2014    source источник


Ответы (1)


Что ж, я решил, что пытаться использовать стандартные тики, шаги и т. Д. Zedgraph - пустая трата времени. Поэтому я создал свой собственный метод, основанный на данных, которые в настоящее время находятся на графике.

введите описание изображения здесь

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

Немного кода

private void setPointLabels()
{
    // All hail the almighty pane.
    GraphPane myPane = theGraph.GraphPane;

    // Give us some room to draw labels
    myPane.Margin.Right = 50;
    myPane.Margin.Bottom = 20;

    // Dont show the default stuff
    myPane.XAxis.Scale.IsVisible = false;
    myPane.XAxis.MajorTic.IsAllTics = false;
    myPane.XAxis.MinorTic.IsAllTics = false;

    // Remove the old labels 
    myPane.GraphObjList.Clear();

    // Get the curve showing our data
    LineItem myCurve = (LineItem)myPane.CurveList[0];

    // Show a voltage value on the far right

    PointPair pt = myCurve.Points[myCurve.Points.Count - 1];
    TextObj text = new TextObj(" " + pt.Y.ToString("f2"), pt.X, pt.Y, CoordType.AxisXYScale, AlignH.Left, AlignV.Center);
    text.ZOrder = ZOrder.A_InFront;
    text.FontSpec.Border.IsVisible = false;
    text.FontSpec.Fill.IsVisible = false;
    myPane.GraphObjList.Add(text);

    // Determine a hardcoded yOffset for the labels
    double yOffset = -1.2;

    // Determine if we need to fix the center label
    int fixVal = 1;
    if (xScaleSec == 10)
        fixVal = 0;

    // Loop over each point in the curve
    for (int i = 0; i < myCurve.Points.Count; i++)
    {
        if (i == 0 ||
            i == (myCurve.Points.Count/4) ||
            i == ((myCurve.Points.Count/2)-fixVal) ||
            i == ((3*myCurve.Points.Count)/4) ||
            i == myCurve.Points.Count-1)
        {
            PointPair aPt = myCurve.Points[i];

            // Add a text object just below the x-axis showing the point's x-value
            XDate xVal = new XDate(aPt.X);
            TextObj label = new TextObj(xVal.ToString("hh:mm.ss"), aPt.X, myPane.YAxis.Scale.Min + yOffset, CoordType.AxisXYScale, AlignH.Center, AlignV.Center);
            label.ZOrder = ZOrder.A_InFront;
            label.FontSpec.Fill.IsVisible = false;
            label.FontSpec.Border.IsVisible = false;
            myPane.GraphObjList.Add(label);

            // Add a line object on the x-axis representing a tic mark
            LineObj aTic = new LineObj(aPt.X, myPane.YAxis.Scale.Min - (yOffset / 4), aPt.X, myPane.YAxis.Scale.Min + (yOffset / 4));
            myPane.GraphObjList.Add(aTic);
        }
    }
}
person AnotherUser    schedule 30.05.2014