Вопрос по c#, customization, zedgraph – ZedGraph плавно перемещает ось Y2 с линией графика

2

Следуя моему вопросу& quot; Пользовательский граф ZedGraph & quot; У меня есть график с каждой второй вставкой данных, теперь у меня есть другие вопросы:

How to smoothly move down Y2Axis (DateTime type) with a chart line and show in chart always only last 30 minutes?

How to format Y2Axis labels "HH:mm" to get 10:05, 10:10, 10:15, ..., 10:30?

Спасибо за помощь!

UPD1: Thanks kmp! I try your code - its good, but with issue: when I started I see this: enter image description here Когда через несколько минут я вижу эту картину: enter image description here

У меня есть «сжатие» области графика, но я хочу, чтобы статически показывалось всегда последние 30 минут и медленно перемещаться вниз по старым данным, без масштабирования или «упаковки» диаграмма с осью. Надеюсь, ты меня понимаешь.

UPD2: Yet another issue - labels of Y2Axis haven't fixed values. For example now: enter image description here

И через несколько секунд: enter image description here

Эта ось показывает только около 5 минут данных - она не будет "перемещаться" пока не появится 30 минут - измените значение TotalMinutes в коде, скажем, 2, чтобы понять, что я имею в виду. kmp

Ваш Ответ

1   ответ
3

myPane.Y2Axis.Scale.Format = "HH:mm";

Один из способов сделать это (и это выглядит немного странно, но я позволю вам принять решение) - просто удалить точки из кривой, как только они выйдут за пределы вашего порога (в этом случае более 30 минут). Таким образом, когда диаграмма перерисовывается, ось будет обновляться соответствующим образом.

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

private Queue<DateTime> axisTimes;

private static readonly Random rnd = new Random();

private void button1_Click(object sender, EventArgs e)
{
    GraphPane myPane = zg1.GraphPane;

    myPane.XAxis.IsVisible = false;

    myPane.X2Axis.IsVisible = true;
    myPane.X2Axis.MajorGrid.IsVisible = true;
    myPane.X2Axis.Scale.Min = 0;
    myPane.X2Axis.Scale.Max = 600;

    myPane.YAxis.IsVisible = false;

    myPane.Y2Axis.IsVisible = true;
    myPane.Y2Axis.Scale.MajorUnit = DateUnit.Minute;
    myPane.Y2Axis.Scale.MinorUnit = DateUnit.Second;
    myPane.Y2Axis.Scale.Format = "HH:mm";
    myPane.Y2Axis.Type = AxisType.DateAsOrdinal;

    LineItem myCurve = myPane.AddCurve("Alpha",
                                  new PointPairList(),
                                  Color.Red,
                                  SymbolType.None);

    myCurve.Symbol.Fill = new Fill(Color.White);
    myCurve.IsX2Axis = true;
    myCurve.IsY2Axis = true;

    myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
    zg1.IsShowPointValues = true;

    axisTimes = new Queue<DateTime>();

    var t = new System.Windows.Forms.Timer();
    t.Interval = 1000;
    t.Tick += ShowData;

    Thread.Sleep(100);

    t.Start();
}

private void ShowData(object sender, EventArgs e)
{
    var t = (System.Windows.Forms.Timer) sender;
    t.Enabled = false;

    int x = rnd.Next(500, 600);
    var y = new XDate(DateTime.Now);

    var myCurve = zg1.GraphPane.CurveList[0];

    if (axisTimes.Any())
    {             
        // Remove any points that go beyond our time threshold
        while ((((DateTime)y) - axisTimes.Peek()).TotalMinutes > 30)
        {
            myCurve.RemovePoint(0);
            axisTimes.Dequeue();

            if (!axisTimes.Any())
            {
                break;
            }
        }
    }

    // Add the new point and store the datetime that it was added in
    // our own queue
    axisTimes.Enqueue(y);
    myCurve.AddPoint(x, y);

    zg1.AxisChange();
    zg1.Invalidate();

    t.Enabled = true;
}
Я извиняюсь, это не в моих силах с ZedGraph - надеюсь, кто-то еще может помочь вам.
да, это верно - он покажет только последние 30 минут данных и откажется от всего остального.
Если я вас понимаю, этот код сжимает график (ось и линия) до 30 минут, а через 30 минут будет "прокручиваться". диаграмма? amaranth
Но я хочу сначала показать 30 минут без диаграммы, пока не произойдет 30 минут. amaranth
У меня есть вопрос об обновлении. Как сделать фиксированные значения меток на Y2Axis? Теперь, когда новые данные вставляются каждые 1 секунду, метки оси всегда меняются, но я хочу иметь метки 15:45:00, 15:50:00, 15:55:00, .... amaranth

Похожие вопросы