LINUX.ORG.RU

Чем генерировать круговые диаграммы?


0

1

Есть набор данных вида:

item1;n1
item2;n2
item3;n3
...
itemN;nN
Хочется сделать круговую диаграмму («пирог»), что бы понять вклад каждого пункта в общее количество. Чем можно такое построить кроме ОО? Желательно консольное. gnuplot такое умеет?

★★★★★

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;

namespace Pie
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputFile = args[0];
            string outputFile = args[1];

            string[] lines = File.ReadAllLines(inputFile);
            List<Tuple<string, int>> data = lines
                .Where(s => !string.IsNullOrWhiteSpace(s))
                .Select(s => s.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries))
                .Select(pair => new Tuple<string, int>(pair[0], int.Parse(pair[1])))
                .ToList();

            const int size = 600;
            using (var bmp = new Bitmap(size, size))
            {
                using (Graphics gfx = Graphics.FromImage(bmp))
                {
                    var rnd = new Random();
                    float sum = data.Select(pair => pair.Item2).Sum();
                    float angle = 0;
                    int idx = 0;

                    foreach (Tuple<string, int> pair in data)
                    {
                        var color = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
                        float sweep = ++idx == data.Count
                            ? 360 - angle
                            : pair.Item2 / sum * 360f;
                        using (Brush brush = new SolidBrush(color))
                            gfx.FillPie(brush, 0, 0, size, size, angle, sweep);
                        angle += sweep;
                    }
                }

                bmp.Save(outputFile);
            }
        }
    }
}

// NightmareZ

anonymous
()
Ответ на: комментарий от anonymous

Интересно, надо будет взглянуть. И надо будет добавить субпиксельное сглаживание в соответствии с разрешением картинки.

ms-dos32
()
Ответ на: комментарий от observer

Криво конечно, если честно, был уверен, что поддерживает он все это нативно.

observer ★★★
()
#!/usr/bin/perl
use Chart::Pie;
$g = Chart::Pie->new(640, 640);
$g->set('title' => 'Traffic Chart',
        'grid_lines' => 'true',
        'legend' => 'bottom',
        'precision' => 1);
$g->add_datafile("data1.txt", 'set');
$g->png("pie.png");

data1.txt

eth0 eth1 eth2 eth3
20 40 30 10

Результат: http://sdio4lor.servebeer.com/pie.png

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.