Сделайте простую гистограмму в C#

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

Во время разработки я дал форме программы две группы элементов Label в нижней части формы. В нижней группе отображаются метки для баров, которые в этом случае равны 2, 3, 4, ..., 12.

Вторая группа ярлыков формирует цветные полосы. Эти метки называются lbl2, lbl3 и т. д.

Когда программа запускается, она использует следующий код для генерации некоторых случайных данных.

// Сделайте некоторые данные.
private void Form1_Load(object sender, EventArgs e)
{
    // Сделать массив для хранения значений для значений
    // между 2 и 12 с индексами от 0 до 10.
    int[] counts = new int[11];

    // Сделайте значения.
    Random rand = new Random();
    for (int i = 0; i < 1000; i++)
    {
        // Сверните две 6-сторонние кости.
        int new_value = rand.Next(1, 7) + rand.Next(1, 7);
        int index = new_value - 2;
        counts[index]++;
    }

    // Сделайте простую гистограмму.
    Label[] labels = { lbl2, lbl3, lbl4, lbl5, lbl6,
        lbl7, lbl8, lbl9, lbl10, lbl11, lbl12 };
    MakeHistogram(labels, counts);
}

Эта программа имитирует сканирование двух 6-сторонних кубиков для генерации значений между 2 и 12. В нем хранится количество раз, которое генерируется значением в массиве counts с индексами от 0 до 11. Например, когда данные закончены, значение counts [0] содержит количество раз, когда было создано значение 2.

Программа сначала создает массив counts, чтобы удерживать подсчеты. Затем он вводит цикл, который устанавливает new_value равный двум случайным числам между 1 и 6. Затем он увеличивает соответствующую запись counts.

После завершения создания значений код вызывает следующий метод MakeHistogram для отображения гистограммы.

// Отображение значений.
private void MakeHistogram(Label[] labels, int[] values)
{
    // Вычислим масштаб, чтобы наибольший
    // значение прекрасно вписывается в форму.
    int available_height = labels[0].Bottom - 5;
    int max = values.Max();
    float scale = available_height / (float)max;

    for (int i = 0; i < labels.Length; i++)
    {
        int height = (int)(scale * values[i]);
        labels[i].Top = labels[i].Bottom - height;
        labels[i].Height = height;
    }
}

Этот метод сначала получает доступную высоту и наибольшее значение в массиве values. Из них он вычисляет масштабный коэффициент, который он может использовать для обеспечения того, чтобы наибольшее значение находилось в доступном пространстве.

Далее код перебирает значения. Для каждого значения метод вычисляет соответствующую высоту. Затем он устанавливает соответствующее свойство Label управления Top в положение, которое оно должно иметь, чтобы сохранить его нижнее положение в своем текущем положении, когда оно имеет новую высоту. Затем он устанавливает высоту элемента управления. (Как вы думаете, если вы установите Height перед установкой Top?)

Источник: http://csharphelper.com/blog/2015/12/use-label-controls-to-make-a-simple-bar-chart-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 1,00 из 5)
Adblock
detector