Шпаргалка по ZedGraph. Как устранить промежутки между данными на календарной оси

В комментариях задали вопрос: Можно ли, используя AxisType.Date, не отображать на оси времени определенные дни, месяца и др.(к примеру выходные дни из-за отсутствия данных) или задать свой календарь рабочих дней, чтобы график был без разрывов. Решение данной проблемы довольно простое, достаточно установить тип горизонтальной оси как AxisType.DateAsOrdinal.

Пусть, например, у нас есть данные для гистограммы, которые заполняются ежедневно кроме выходных. Если использовать тип оси AxisType.Date, то график будет выглядеть вот так:

Если установить тип оси как AxisType.DateAsOrdinal, то график примет вид:

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

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

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

        DrawGraph ();
    }

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

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

        Random rnd = new Random (100);

        // Начальная дата для построения гистограммы
        DateTime startDate = DateTime.Now;

        // Количество дней, для заполнения данных
        int count = 30;

        // Для построения графика даты нужно преобразовать к Double
        List<double> xvalues = new List<double> ();

        // Высота столбиков
        List<double> yvalues = new List<double> ();

        // Заполним данные
        for (int i = 0; i < count; i++)
        {
            // Дата для очередного столбика
            DateTime currentDate = startDate.AddDays (i);

            // Для выходных дней столбики создавать не будем
            if (currentDate.DayOfWeek != DayOfWeek.Saturday &&
                currentDate.DayOfWeek != DayOfWeek.Sunday)
            {
                // Значения по оси X (текущая дата)
                xvalues.Add (new XDate (currentDate));

                // Высота столбиков
                yvalues.Add (rnd.NextDouble ());
            }
        }

        // Создадим гистограмму
        BarItem bar = pane.AddBar ("", xvalues.ToArray(), yvalues.ToArray(), Color.Blue);

        // !!! Для оси X установим тип AxisType.DateAsOrdinal,
        // который обозначает, что отмеченные даты откладываются равномерно
        pane.XAxis.Type = AxisType.DateAsOrdinal;

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

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

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

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

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



kas 06.02.2012 - 19:50

А если использование DateAsOrdinal не допустимо?

Добрый день, я давно мучаюсь с этой проблемой. Мне надо устранить промежуток между данными, приходящийся на ночь (ночью данных нет и получается большой пустой участок). Но использовать DateAsOrdinal нельзя так как промежутки между точками не равны. Это возможно? Спасибо.

Dodger 21.07.2015 - 16:13

Ответ вдруг кому нить еще поможет

Установи для оси MinGrace и MaxGrace в ноль. По умолчанию (0.1) промежуток


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