Шпаргалка по ZedGraph. Как выводить постоянно обновляемые данные (более простой вариант)

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

Однако, в библиотеке ZedGraph для подобной работы есть уже готовый класс-контейнер RollingPointPairList. Как его использовать демонстрирует следующий код.

zedgraph_rolling_01.png: 600x500, 9k (31.05.2012 10:09)
zedgraph_rolling_02.png: 600x500, 9k (31.05.2012 10:09)

Все примеры объединены в одном solution для Visual Studio 2005 и написаны на языке C#, скачать их можно отсюда.

Проект в примере - RollingPoint

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;

using ZedGraph;
using System.Drawing;

namespace QueueTime
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Количество отображаемых точек
        /// </summary>
        int _capacity = 100;

        /// <summary>
        /// Здесь храним данные
        /// </summary>
        RollingPointPairList _data;

        // Параметры отображаемой синусоиды
        double _amplitude = 5;
        double _freq = 3;
        double _step = 0.1;

        // Текущее значение на графике
        double _currentx = 0;


        public Form1 ()
        {
            // !!! Создаем массив данных с ограниченной емкостью.
            // При превышениизаданной емкости первые элементы в массиве будут удаляться
            _data = new RollingPointPairList (_capacity);

            InitializeComponent ();
            PrepareGraph ();
        }


        /// <summary>
        /// Метод вызывается по таймеру
        /// </summary>
        private void timer_Tick (object sender, EventArgs e)
        {
            // Вычислим новое значение
            double newValue = _amplitude * Math.Sin (_currentx * _freq);

            // !!! Добавим новый отсчет к данным
            _data.Add (_currentx, newValue);
            _currentx += _step;

            // Рассчитаем интервал по оси X, который нужно отобразить на графике
            double xmin = _currentx - _capacity * _step;
            double xmax = _currentx;

            GraphPane pane = zedGraph.GraphPane;
            pane.XAxis.Scale.Min = xmin;
            pane.XAxis.Scale.Max = xmax;

            // Обновим оси
            zedGraph.AxisChange ();

            // Обновим сам график
            zedGraph.Invalidate ();
        }


        /// <summary>
        /// Подготовка к отображению данных
        /// </summary>
        private void PrepareGraph ()
        {
            // Получим панель для рисования
            GraphPane pane = zedGraph.GraphPane;

            // Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
            pane.CurveList.Clear ();

            // Добавим кривую пока еще без каких-либо точек
            LineItem myCurve = pane.AddCurve ("sin (x)", _data, Color.Blue, SymbolType.None);

            // Устанавливаем интересующий нас интервал по оси Y
            pane.YAxis.Scale.Min = -_amplitude;
            pane.YAxis.Scale.Max = _amplitude;

            // Вызываем метод AxisChange (), чтобы обновить данные об осях.
            zedGraph.AxisChange ();

            // Обновляем график
            zedGraph.Invalidate ();
        }
    }
}

Вернуться к остальным примерам


Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.9/5. Всего 7 голос(а, ов)



Дмитрий 16.04.2012 - 12:23

real-timi graph

встречал похожий вопрос в комментах, но так и не увидел на него ответа...возможно ли рисовать новые точки не стирая при этом старые? как? ведь что invalidate(), что Refresh() затирают ранее нарисованные точки;( просто мне нужно в реальном времени постепенно отрисовать две тысячи точек и если я каждый раз по новой буду отрисовывать "старые" точки добавяя новую, то процесс рисования с каждой "новой" точкой будет затягиваться в разы;(( подскажите что-нибудь дельное пожалуйста...

Jenyay 16.04.2012 - 18:17

Есть у меня одна мысль, но не уверен, что сработает, надо будет попробовать. Сохранить переменную со списком точек, а потом, когда нужно добавить точки, то добавлять их прямо в этот список и вызывать Invalidate. Не знаю, поймет ли ZedGraph, что данные изменились и их надо будет перерисовать.

Дмитрий 17.04.2012 - 08:00

real-timi graph

с ZedGraphom не получилось...пришлось MSChart юзать...

ale912 29.06.2012 - 18:49

Сделал как предлагал Jenyay. Все работает: график обновляется.

Дмитрий 02.11.2015 - 18:39

Пришлось код
LineItem myCurve = pane.AddCurve ("sin (x)", _data, Color.Blue, SymbolType.None);
вставлять в тик таймера, естесственно


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 987