ZedGraph плавно перемещает ось Y2 с линией графика

1

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

  • Как плавно перемещать Y2Axis (тип DateTime) с помощью строки диаграммы и показывать в диаграмме всегда только последние 30 минут?

  • Как отформатировать метки Y2Axis "HH: mm", чтобы получить 10:05, 10:10, 10:15,..., 10:30?

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

UPD1: Спасибо kmp! Я пробую ваш код - это хорошо, но с вопросом: когда я начал, я вижу это: Изображение 174551 Когда через несколько минут я вижу эту картину: Изображение 174551

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

UPD2: Еще одна проблема - метки Y2Axis не имеют фиксированных значений. Например, сейчас: Изображение 174551

И через несколько секунд: Изображение 174551

  • 0
    Эта ось показывает только около 5 минут данных - она не будет «двигаться», пока не будут показаны 30 минут - отрегулируйте значение TotalMinutes в коде, скажем, 2, чтобы понять, что я имею в виду.
Теги:
customization
zedgraph
movement

1 ответ

2
Лучший ответ

Начиная с самого легкого - форматирование ярлыков можно сделать так:

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

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

Мне кажется, что получение значения min 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;
}
  • 0
    Если я вас понимаю, этот код сжимает график диаграммы (ось и линия) до 30 минут, а через 30 минут будет «прокручиваться» график?
  • 0
    да, это верно - он покажет только последние 30 минут данных и откажется от всего остального.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню