Суть примера состоит в том, что к данным периодически (с интервалом 100 мс) добавляются новые числа, при этом надо выводить только последние 30 значений.
Все примеры объединены в одном 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 ();
}
}
Вернуться к остальным примерам
Пожалуйста, оцените материал
Рейтинг 5.0/5. Всего 5 голос(а, ов)
А как интересно сделать что бы с данными двигалась и ось X.
Jenyay 22.02.2010 - 09:32
Нужно менять еще и начальную координату по X - curr_x.
подскажите, пожалуйста, как сделать, чтобы по оси Х был отрезок от 0 до 24, при этом график ресуется с начала координат и до 24. т.е. ось Х не двигается, а двигается только сам график к 24.. ?
Jenyay 28.04.2010 - 14:24
кот, если честно, не понял, Вы имеете в виду.
по оси Х временная шкала. нужно, чтобы за каждую секунду отрисовывалась новая часть графика. в приведенном выше коде, когда значения по Х переваливают за 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 откладывалось системное время в формате часы.минуты.секунды ?