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

Для сравнения значений массива данных иногда удобно представлять данные в виде гистограмм с наложением друг на друга. Данный пример показывает, как это делается с помощью ZedGraph.

Для использования такого типа графиков используется свойство BarSettings.Type класса GraphPane. Чтобы столбцы перекрывались, свойство BarSettings.Type может иметь значения BarType.Overlay или BarType.SortedOverlay. Чем они отличаются описано в комментариях и видно на скриншоте

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

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

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

        DrawGraph ();
    }

    private void DrawGraph ()
    {
        // Удалим существующую панель с графиком
        zedGraph.MasterPane.PaneList.Clear ();

        // Создадим две панели для графика, где будут отображаться
        // одинаковые данные, но с разными значениями BarType
        GraphPane pane1 = new GraphPane ();
        GraphPane pane2 = new GraphPane ();

        // Количество столбцов
        int itemscount = 9;
        Random rnd = new Random ();

        // Сгенерируем данные для высот столбцов
        double[] YValues1 = GenerateData (itemscount, rnd);
        double[] YValues2 = GenerateData (itemscount, rnd);
        double[] YValues3 = GenerateData (itemscount, rnd);

        double[] XValues = new double[itemscount];

        // Заполним данные
        for (int i = 0; i < itemscount; i++)
        {
            XValues[i] = i + 1;
        }

        // По одинаковым данным построим две гистограммы
        CreateBars (pane1, XValues, YValues1, YValues2, YValues3);
        CreateBars (pane2, XValues, YValues1, YValues2, YValues3);

        // !!! У первого графика столбцы накладываются один на другой
        // всегда в одинаковой последовательности:
        // впереди синий, затем красный, затем желтый
        pane1.BarSettings.Type = BarType.Overlay;
        pane1.Title.Text = "BarType.Overlay";

        // !!! У второго графика порядок наложения столбцов такой, чтобы все они были видны
        pane2.BarSettings.Type = BarType.SortedOverlay;
        pane2.Title.Text = "BarType.SortedOverlay";

        // Добавим созданные панели в MasterPane
        zedGraph.MasterPane.Add (pane1);
        zedGraph.MasterPane.Add (pane2);

        // Зададим расположение графиков
        using (Graphics g = CreateGraphics ())
        {
            // Графики будут размещены в один столбец друг под другом
            zedGraph.MasterPane.SetLayout (g, PaneLayout.SingleColumn);
        }

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

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


    /// <summary>
    /// Сгенерировать случайные данные для графика
    /// </summary>
    /// <param name="itemscount"></param>
    /// <param name="rnd"></param>
    /// <returns></returns>
    private double[] GenerateData (int itemscount, Random rnd)
    {
        double[] values = new double[itemscount];

        // Заполним данные
        for (int i = 0; i < itemscount; i++)
        {
            values[i] = rnd.NextDouble ();
        }

        return values;
    }


    /// <summary>
    /// Создать столбики по данным
    /// </summary>
    /// <param name="pane">Панель, куда добавляются столбцы</param>
    /// <param name="XValues">Координаты по оси X</param>
    /// <param name="YValues1">Данные по оси Y для первого набора столбцов</param>
    /// <param name="YValues2">Данные по оси Y для второго набора столбцов</param>
    /// <param name="YValues3">Данные по оси Y для третьего набора столбцов</param>
    private static void CreateBars (GraphPane pane,
        double[] XValues,
        double[] YValues1, double[] YValues2, double[] YValues3)
    {
        pane.CurveList.Clear ();

        // Создадим три гистограммы
        pane.AddBar ("", XValues, YValues1, Color.Blue);
        pane.AddBar ("", XValues, YValues2, Color.Red);
        pane.AddBar ("", XValues, YValues3, Color.Yellow);
    }
}

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

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

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



Пётр 10.08.2011 - 18:48

А как их повернуть по горизонтали??? Я пробовал типа как в примере у Вас, но не получилось...

Jenyay 10.08.2011 - 21:36

Чтобы сделать столбики горизонтальными, надо добавить pane.BarSettings.Base = BarBase.Y;

Ну и поменять местами данные для осей X и Y.

Jenyay 10.08.2011 - 22:49

Добавил пример про горизонтальную гистограмму.

Пётр 11.08.2011 - 10:44

Ооо класс! Спасибо.

Юрий 27.05.2012 - 20:22

цвет столбцов

Здравствуйте!
подскажите пожалуйста, как сделать так чтобы столбцы имели монолитный цвет(не градиент а сплошная заливка)? И возможно ли удалить границу столбцов(черную прямоугольную рамку)?

Jenyay 29.05.2012 - 20:44

Скоро выложу пример на эту тему. Если коротко, то делается это вот так:

curve.Bar.Fill.Color = Color.YellowGreen;
curve.Bar.Fill.Type = FillType.Solid;
curve.Bar.Border.IsVisible = false;

Jenyay 29.05.2012 - 21:11

Сделал пример - http://jenyay.net/ZedGraph/BarView

Юрий 02.06.2012 - 13:36

цвет столбцов

Огромное спасибо!

Никита 12.06.2012 - 12:34

Гистограмма

А можно ли чтобы гистограммы начинались не от оси Y, от определенной точки?


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