Графики в C#

Для построения различного рода графиков в C# существует множество внешних библиотек и компонентов. В большинстве своем это закрытые и/или платные продукты, хотя встреаются и свободные компоненты. Обо одном из них сейчас и пойдет речь.

Зовут этот компонент ZedGraph.
Скачать его можно тут: исходные тексты, скопилированная сборка.
Компонент позволяет строить как простые линейные графики, так и прямоугольные, а также круговые. Компонент совместим с .NET 2.0 и корректно работает в MS Visual Studio 2005 и 2008 (на предмет совместимости с mono, увы, не проверял).

Использование контрола
Сначала следует добавить новый компонент в ToolBox. Для этого отройте тулбокс (View/Toolbox), Кликните правой кнопкой в любом разделе компонентов и выберите Choose Items.... Далее кликните Browse и укажите путь к файлу zedgraph.dll.
Все, теперь в тулбоксе должен появиться новый компонент ZedGraphControl. Для его использования не забудьте добавить к своему поекту сборку ZedGraph.dll и подключить пространство имен ZedGraph (using ZedGraph;).

Ниже представлен пример использования компонента ZedGraph для рисования синусойды:

// Обработчик события Resize формы с графиком
private void Form1_Resize( object sender, EventArgs e )
{
 SetSize();
}

// Фунция изменения размера и положения графика в зависимости от размера формы
private void SetSize()
{
 zedGraphControl1.Location = new Point( 10, 10 ); // задаем положение графика
 zedGraphControl1.Size = new Size( ClientRectangle.Width - 20, ClientRectangle.Height - 20 ); // размеры графика
}

// обработчик события Load формы с графиком
private void Form1_Load( object sender, EventArgs e )
{
 CreateGraph( zedGraphControl1 ); // строим график
 SetSize(); // и устанавливаем его положение и размер
}

// Функция построения графика
private void CreateGraph( ZedGraphControl zgc )
{
 GraphPane myPane = zgc.GraphPane;

 // Задаем название графика и сторон
 myPane.Title.Text = "График синусойды";
 myPane.XAxis.Title.Text = "Ось X";
 myPane.YAxis.Title.Text = "Ось Y";
 // --------------------------------

 // строим синусойду
 double x, y;
 PointPairList list1 = new PointPairList();
 for ( int i = 0; i < 36; i++ )
 {
 x = i;
 y = Math.Sin(x);
 list1.Add(x, y);
 }
 // ----------------

 LineItem myCurve = myPane.AddCurve( "Sin", list1, Color.Red, SymbolType.Diamond ); // отрисовываем график
 zgc.AxisChange();
}

Остались вопросы? Задавайте!

Поблагодарить автора

32 Responses to Графики в C#

  1. Не рисует график по нажатию на кнопку, подскажите пожалуйста как побороть?

  2. Покажите кусок кода, выполняющийся по нажатию на кнопку

  3. private void button_Click ( object sender, EventArgs e )

    {

    CreateGraph ( zedGraphControl1 ); // строим график

    }

  4. Вы забыли задать размер и положение графика:

    CreateGraph ( zedGraphControl1 ); // строим график

    SetSize (); // и устанавливаем его положение и размер

  5. Все эти манипуляции с положением не нужны — можно настроить свойство Anchors на все четыре стороны и вызвать zedGraphControl1.Refresh (); после построения. При изменении размера само подгонится. Или можно вписать в панель.

  6. лучше скажите как менять диапазоны осей, а то у меня максимальное значение Х=4,5 а оси почему то 6 на 6 выводятся

  7. А можно сделать так, чтобы в каждой точке графика не рисовался квадратик? Чтобы осталась только линия кривой и все.

  8. Кто ни буд может етот Матлаб код конвертироват на C#

    RM=0.00; LM=0.29; D=0.08; FI=1.5708; T=0.05236;TA=0.5236; D0=exp(-D*T); D1=exp(-D*TA); D2=exp(-D*2*TA); N=1200; N1=TA/T; N2=2*N1; N3=N/3; for K=1:N1 E(K)=0; Y(K)=1+RM; end for K=N1:N2 X=(K-N1)*T; E(K)=2*D1*(cos(FI)-cos(X+FI)); Y(K)=1+RM; end for K=N2:N X=(K-N1)*T; E(K)=2*D1*(cos(FI)-cos(X+FI)); Y(K)=1+RM+D2*(1-RM); end Y(1)=Y(1)+LM/T; Y(N2)=Y(N2)-D2*LM/T; R1=1/(T*Y(1)); U(1)=E(1)*R1; for M=2:N L=M-1; K=M; S=0; for I=1:L S=S+U(I)*Y(K);K=K-1; end U(M)=E(M)*R1-S/Y(1); end plot (U(1,1:1200))

    или скажите как. Зарание блогадарен.

  9. Сам решил уже

    private void Form1_Load (object sender, EventArgs e)

    {

    CreateGraph (zedGraphControl1);

    SetSize ();

    }

    public void _data ()

    {

    RM = 0; LM = 0.29; D = 0.08; FI = 1.5708; T = 0.05236; TA = 0.5236;

    D0 = Math.Exp (-D * T); D1 = Math.Exp (-D * TA); D2 = Math.Exp (-D * 2 * TA);

    n = 600; n1 = Convert.ToInt16 (TA / T); n2 = 2 * n1;

    }

    int n, n1, n2;

    double RM, LM, D, FI, T, TA, D0, D1, D2, R1, S;

    double[] E; double[] Y; double[] U;

    public double Q (int z)

    {

    int k, m, l, i;

    int j = n + 1;

    E = new double[j]; Y = new double[j]; U = new double[j];

    double x;

    for (k = 1; k < n1; k++)

    {

    E[k] = 0;

    Y[k] = 1 + RM;

    }

    for (k = n1; k < n2; k++)

    {

    x = (k — n1) * T;

    E[k] = 2 * D1 * (Math.Cos (FI) — Math.Cos (x + FI));

    Y[k] = 1 + RM;

    }

    for (k = n2; k <= n; k++)

    {

    x = (k — n1) * T;

    E[k] = 2 * D1 * (Math.Cos (FI) — Math.Cos (x + FI));

    Y[k] = 1 + RM + D2 * (1 — RM);

    }

    Y[1] = Y[1] + LM / T; Y[n2] = Y[n2] — D2 * LM / T;

    R1 = 1 / (T * Y[1]); U[1] = E[1] * R1;

    for (m = 2; m < n; m++)

    {

    l = m — 1; k = m; S = 0;

    for (i = 1; i <= l; i++)

    {

    S = S + U[i] * Y[k]; k=k-1;

    }

    U[m] = E[m] * R1 — S / Y[1];

    }

    return U[z];

    }

    public void CreateGraph (ZedGraphControl zgc)

    {

    _data ();

    GraphPane myPane = zgc.GraphPane;

    myPane.CurveList.Clear ();

    myPane.Title.Text = "QRAFIK\n (For CodeProject Sample)";

    myPane.XAxis.Title.Text = "X oxu";

    myPane.YAxis.Title.Text = "Y oxu";

    PointPairList list1 = new PointPairList ();

    for (int i = 1; i < n; i++)

    {

    list1.Add (i, Q (i));

    label1.Text = Math.Round (S,4) + " = -27.3154";

    }

    LineItem myCurve1 = myPane.AddCurve ("Y (K)", list1, Color.Blue, SymbolType.None);

    zgc.AxisChange ();

    zgc.Invalidate ();

    }

    }

  10. Ребята подскажи как можно оси х присвоить вывод текущего системного времени времени, бюсь четвёртый день :)

  11. Можете детальнее привести пример? по оси «у» данные в формате double а по оси «х» текущее системное время, зарание благодарен ;)

  12. а точнее вот такая штука: данные приходят с комп порта в переменную string (msg)это данные по шкале Y (значение от 0 до 255) и берёться текущее системное время это ось х, как это всё прикрутить додуматься немогу, мало опыта в С#

  13. Допустим у Вас есть событие, которое вызывается при приходе данных с порта и глобавльная переменная пар значений графика:

    // Пары значений графика

    PointPairList list1 = new PointPairList ();

    // Функция, вызываемая при получении данных

    public static void gotData (string msg)

    {

    // Получаете текущее время

    strind date = DateTime.Now.ToString ();

    // Связываете его с принятыми данными

    list1.Add (date, msg);

    // И обновляете график

    zedGraphControl1.AxisChange ();

    }

    В остальном всё как в примере: при загрузке формы инициализируете свой график (строка 17) и понеслась ;)

    А функция построения графика в Вашем случае будет примерно такой:

    // Функция построения графика

    private void CreateGraph ( ZedGraphControl zgc )

    {

    GraphPane myPane = zgc.GraphPane;

    // Задаем название графика и сторон

    myPane.Title.Text = «Какой-то график»;

    myPane.XAxis.Title.Text = «Время приема данных»;

    myPane.YAxis.Title.Text = «Данные»;

    // --------------------------------

    LineItem myCurve = myPane.AddCurve ( «О», list1, Color.Red, SymbolType.Diamond ); // отрисовываем график

    zgc.AxisChange ();

    }

  14. У метода Add значения double, каким образом Вы пытаетесь туда добавить string?

  15. Возможно, код писал на коленке, и похоже это не учел.

    Сделайте строке Double.Parse () и добавляйте результат.

  16. Ребята помоги вот с какой проблемкой побороться:

    нужно график рисовать одной линией но линия должна быть разной,

    к пример до значения 100 идёт линия с Color.Blue, SymbolType.Diamond, а со 100 до 150 Color.Blue, SymbolType.Star,а со 150 до 200 SymbolType.Triangle. как это можно сделать ? Зарание благодарен.

  17. Здравствуйте!

    А если допустим значение аргумента некой функции скажем ln (x) будет интервальным [10,20] или аффинным x=10-5e1+3e2+2e4 e интервал [-1,1]!!!

    Как это можно реализовать?

  18. С интервалом всё просто. Задаем нужный диапазон x, и вычисляем:

    for ( int i = 10; i < 20; i++ ) // интервал, для которого строить с шагом в 1

    {

    x = i;

    y = Math.Log10 (x);

    list1.Add (x, y);

    }

    Насчет аффирности не совсем понимаю что это такое, но может как-то так:

    for ( double i = -1; i < 1; i+=0.1 ) // интервал, для которого строить [-1,1] с шагом в 0.1

    {

    x = 10-5e1+3e2+2e4 + i; // ?????????

    y = Math.Log10 (x);

    list1.Add (x, y);

    }

  19. ;) Всем привет)))) Заинтересовался данной библиотекой, но столкнулся с трудностью))) у меня график по клику правой кнопкой на юзер контрол зэдграф выдаёт менюшку и там есть сэйв ас вот она у мну не работает вылетает))) что сделать помогите))

    Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process

  20. Обычно эта ошибка должна выскакивать если вы запускаете программу в отладчике. Когда запускаете без отладчика ошибка выскакивает?

  21. С недавнего времени с помощью этой библиотеки можно даже нарисовать график в mono for android!

  22. Здравствуйте, подскажите как можно задать с клавиатуры параметры для вычисления функции по которой считается координата y? Например в примере функция y = Math.Sin (x);, а мне нужно сделать так, чтобы у этой функции были некий коэффициент, который я задаю перед построением с клавиатуры... (y = k * Math.Sin (x); где k — задается с клавиатуры)

  23. Элементарно.

    Добавьте на форму новый TextBox, в который будет вводиться значение k, и в функции построения графика делайте следующее:

    int k = Convert.ToInt32 (textbox1.Text);

    y = k * Math.Sin (x);

  24. Как обновить рисунок? ну чтоб при новых числах был новый рисунок, а то при нажатии старый остается

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>