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

Суть примера состоит в том, что к данным периодически (с интервалом 100 мс) добавляются новые числа, при этом надо выводить только последние 30 значений.

zedgraph_queue000.png: 600x500, 8k (31.05.2012 10:09)
zedgraph_queue002.png: 600x500, 8k (31.05.2012 10:09)
zedgraph_queue003.png: 600x500, 8k (31.05.2012 10:09)
zedgraph_queue004.png: 600x500, 8k (31.05.2012 10:09)

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

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

public partial class Form1 : Form
{
    /// <summary>
    /// Максимальный размер очереди
    /// </summary>
    int _capacity = 30;

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

    /// <summary>
    /// Для генерации слуайных данные по таймеру
    /// </summary>
    Random _rnd = new Random ();

    // Интервал изменения данных по вертикали
    double _ymin = -1.0;
    double _ymax = 1.0;


    public Form1 ()
    {
        _data = new List<double> ();

        InitializeComponent ();

        DrawGraph ();
    }

    private void timer_Tick (object sender, EventArgs e)
    {
        // Вычислим новое значение
        double newValue = _rnd.NextDouble () * (_ymax - _ymin) + _ymin;

        // Добавим его в конец списка
        _data.Add (newValue);

        // Удалим первый элемент в списке данных,
        // если заполнили максимальную емкость
        if (_data.Count > _capacity)
        {
            _data.RemoveAt (0);
        }

        DrawGraph ();
    }

    private void DrawGraph ()
    {
        // Получим панель для рисования
        GraphPane pane = zedGraph.GraphPane;

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

        // Создадим список точек
        PointPairList list = new PointPairList ();

        // Интервал, где есть данные
        double xmin = 0;
        double xmax = _capacity;

        // Расстояние между соседними точками по горизонтали
        double dx = 1.0;

        double curr_x = 0;

        // Заполняем список точек
        foreach (double val in _data)
        {
            list.Add (curr_x, val);
            curr_x += dx;
        }

        // Очистим список кривых от прошлых рисунков (кадров)
        pane.CurveList.Clear ();
        LineItem myCurve = pane.AddCurve ("Random Value", list, Color.Blue, SymbolType.None);


        // Устанавливаем интересующий нас интервал по оси X
        pane.XAxis.Scale.Min = xmin;
        pane.XAxis.Scale.Max = xmax;

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

        // Вызываем метод AxisChange (), чтобы обновить данные об осях.
        // В противном случае на рисунке будет показана только часть графика,
        // которая умещается в интервалы по осям, установленные по умолчанию
        zedGraph.AxisChange ();

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

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

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

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



wers 22.02.2010 - 01:06

а как ?

А как интересно сделать что бы с данными двигалась и ось X.

Jenyay 22.02.2010 - 09:32

Нужно менять еще и начальную координату по X - curr_x.

кот 28.04.2010 - 14:08

как сделать

подскажите, пожалуйста, как сделать, чтобы по оси Х был отрезок от 0 до 24, при этом график ресуется с начала координат и до 24. т.е. ось Х не двигается, а двигается только сам график к 24.. ?

Jenyay 28.04.2010 - 14:24

кот, если честно, не понял, Вы имеете в виду.

кот 28.04.2010 - 14:32

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

Jenyay 28.04.2010 - 15:27

Тогда самое простое - завести массив, куда будут добавляться данные, а по мере поступления новых данных его дополнять, при этом выводить все точки.

sasha_g1981 01.10.2010 - 12:06

using System;
using System.Drawing;
using System.Windows.Forms;
using ZedGraph;

namespace zed_graf_test
{
    public partial class Form1 : Form
    {
        int tickStart = 0;

        GraphPane myPane;
        PointPairList list;
        LineItem curve;

        // количество точек на графике 1600
        private int numberPointsInChart=1600;

        // удалять точки с графика по 1
        private int deletePoints=1;

        bool IsLeftButtonDown = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            myPane = zedGraphControl1.GraphPane;

            myPane.Title.Text = "";
            myPane.XAxis.Title.Text = "";
            myPane.YAxis.Title.Text = "";

            myPane.XAxis.Scale.MaxAuto = true;
            myPane.XAxis.Scale.MinAuto = true;

            // myPane.XAxis.Scale.MinorStep = 1;
            // myPane.XAxis.Scale.MajorStep = 5;

            myPane.YAxis.Scale.Min = -5;
            myPane.YAxis.Scale.Max = 5;

            //myPane.YAxis.Scale.MaxAuto = true;
            //myPane.YAxis.Scale.MinAuto = true;

            zedGraphControl1.IsEnableHPan = false;
            zedGraphControl1.IsEnableHZoom = false;

            zedGraphControl1.IsEnableVPan = false;
            zedGraphControl1.IsEnableVZoom = true;

            list = new PointPairList();

            curve = myPane.AddCurve("(time,  8*Math.Sin(Math.PI * time)n"+
                "-4*Math.Sin(-Math.PI * time) * Math.Sin(64.0* Math.PI * time ))",
                list, Color.Blue, SymbolType.None);

            zedGraphControl1.AxisChange();

            timer1.Interval = 10;
            timer1.Enabled = true;
            timer1.Start();

            tickStart = Environment.TickCount;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            double time = (Environment.TickCount - tickStart) / 10000.0;

            list.Add(time,  8*Math.Sin(1*Math.PI * time)
                -4*Math.Sin(-Math.PI * time) * Math.Sin(64.0* Math.PI * time ));

            Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale;
            xScale.Max = curve.Points[list.Count - 1].X;

            while (list.Count > numberPointsInChart)
            {
                while (list.Count > (numberPointsInChart - deletePoints))
                {
                    list.RemoveAt(0);
                }
                xScale.Min = curve.Points[0].X;              
            }

            zedGraphControl1.AxisChange();

            if(!IsLeftButtonDown)
            zedGraphControl1.Refresh();

        }

        private bool zedGraphControl1_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (e.Button==MouseButtons.Left)
            IsLeftButtonDown = true;
            return default(bool);
        }

        private bool zedGraphControl1_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            IsLeftButtonDown = false;
            return default(bool);
        }

    }
}

qu_dot 25.05.2011 - 12:07

с временем по X

Как сделать этот изменяющийся график чтобы по X откладывалось системное время в формате часы.минуты.секунды ?

KokosSPb 19.03.2012 - 09:25

Как выводить постоянно обновляемые данные

Jenyay 28.04.2010 - 15:27

Тогда самое простое - завести массив, куда будут добавляться данные, а по мере поступления новых данных его дополнять, при этом выводить все точки.

да, но как при этом постоянно смещать график правее? я пишу на С++, не получается ввести в отрисовке myPane, она для Load_Graw прописана, для создания и всё...

Андрей 03.08.2012 - 17:35

Прокрутка тренда

Как-нибудь можно сделать ось X c прокруткой. У меня временной график, скажем за сутки. Я хочу сделать, чтобы в окне был график за час (с выбором интервала). Двигая прокруткой - двигается график и выбираешь нужный интервал. Можно так сделать?

Varro 19.11.2012 - 13:40

Отключить автопрокрутку

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

Snow 30.11.2012 - 11:32

AxisChange() - Out of memory exception

Выдает такую вот ошибку,не представляю в чем может быть проблема frowning smiley
Что посоветуете?

 20.09.2014 - 21:54

Приём данных из файла

Пробовал написать свою простенькую программу через DrawLine() и Refresh + Timer, но максимум это первый фрэйм, далее у меня не происходит смещения начала координат. Решил, что проще будет остановиться на Zed библиотеке, но как-то не пошло. В моей собственной программе график строится по одномерному массиву точек y. Но убираю изначально заданные в вышеприведенном примере случайные точки, пробую прикрутить своё и ничего не строится - возможно, накосячил с событием (построение по щелчку кнопки)

Олег 06.12.2016 - 02:32

Как скролбар сделать в ZedGraph

Не получается никак сделать скролбар. Хочу чтобы прокручивать график можно было.
А как скрол добавить ?


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