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

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

Обычно ZedGraph сам расставляет подписи у меток по осям, хотя их формат можно и изменять. Но может так оказаться, что надо более гибко настраивать вывод меток, например, добавлять к ним какие-то надписи или еще что-нибудь. В этом случае поможет событие ScaleFormatEvent, которое вызывается каждый раз, когда надо отобразить очередную метку. Подписавшись на это событие, мы можем для каждой метки менять выводимый текст.

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

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

public partial class Form1 : Form
{
    public Form1 ()
    {
        InitializeComponent ();

        // Установка свойств оси X
        SetAxisProperties ();

        DrawGraph ();
    }

    /// <summary>
    /// Установка свойств оси X
    /// </summary>
    void SetAxisProperties ()
    {
        GraphPane pane = zedGraph.GraphPane;

        // Установим шаг основных меток, равным 5
        pane.XAxis.Scale.MajorStep = 5;

        // Немного уменьшим шрифт меток, чтобы их больше умещалось
        pane.XAxis.Scale.FontSpec.Size = 10;

        // Подпишемся на событие, которое будет вызываться при выводе каждой отметки на оси
        pane.XAxis.ScaleFormatEvent += new Axis.ScaleFormatHandler (XAxis_ScaleFormatEvent);   
    }


    /// <summary>
    /// Метод, который вызывается, когда надо отобразить очередную метку по оси
    /// </summary>
    /// <param name="pane">Указатель на текущий GraphPane</param>
    /// <param name="axis">Указатель на ось</param>
    /// <param name="val">Значение, которое надо отобразить</param>
    /// <param name="index">Порядковый номер данного отсчета</param>
    /// <returns>Метод должен вернуть строку, которая будет отображаться под данной меткой</returns>
    string XAxis_ScaleFormatEvent (GraphPane pane, Axis axis, double val, int index)
    {
        if (val % 10 == 0)
        {
            // Если текущее значение кратно 10, то возьмем его в квадратные скобки
            return string.Format ("[{0}]", val);
        }
        else
        {
            // Остальные числа просто преобразуем в строку
            return val.ToString ();
        }
    }


    private double f (double x)
    {
        if (x == 0)
        {
            return 1;
        }

        return Math.Sin (x) / x;
    }

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

        // Очистим список кривых
        pane.CurveList.Clear ();

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

        double xmin = -29;
        double xmax = 29;

        // Заполняем список точек
        for (double x = xmin; x <= xmax; x += 0.01)
        {
            // добавим в список точку
            list.Add (x, f (x));
        }

        // Создадим кривую
        LineItem myCurve = pane.AddCurve ("", list, Color.Blue, SymbolType.None);

        // Обновить данные об осях.
        zedGraph.AxisChange ();

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

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

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

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



Писарь 04.03.2015 - 12:03

Как изменить надписи на осях, если мне их надо перевести в другую шкалу (скажем время)? Не могу понять где надо пристроить переводной коэффициент.

Писарь 04.03.2015 - 12:15

Получилось реализовать идею, добавив коэффициент к результату метода XAxis_ScaleFormatEvent:

 return (val*koefficient).ToString ();

где koefficient - переводной коэффициент


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