Pull to refresh

Графики в GTK#

Reading time2 min
Views2.7K
У меня неоднократно возникала потребность строить в своих приложениях простые графики, но каждый раз под рукой не оказывалось подходящего инструмента. В этот раз я обнаружил библиотеку NPlot, которая показалась мне достаточно удобной.

Чем же так хороша NPlot? Существует далеко не одна библиотека для построения графиков, но многие из них работают только под .NET или слишком завязаны на Windows.Forms. Но я заинтересован в кроссплатформенности, то есть мне нужно нечто совместимое с mono и gtk. NPlot соответствует этим требованиям, причем лицензирована она под BSD, что тоже приятно.

Однако знакомство с NPlot было омрачено отсутствием нормальной документации. Да и тестовый пример, идущий вместе с библиотекой, работает ужасно:
image

Но все же видно, что основную функцию — рисование графиков — NPlot выполняет, а потому я решил разобраться и написать подобие документации. Быть может, кому-нибудь пригодится.

В первую очередь надо нарисовать сами линии графика:
//Как нетрудно догадаться, линии строятся по точкам. Зададим их
double[] a = {0, 200, 140, 14, 240, 320, 150, 80, 170, 90};
//Теперь можно нарисовать соответствующую линию и задать ей название в легенде
LinePlot lp = new LinePlot();
lp.DataSource = a;
lp.Label = "My Label";
//По умолчанию линия черная и тонкая. Это можно изменить предварительно созданным объектом System.Drawing.Pen
lp.Pen = PenName;
//Для лучшего вида на график наносится сетка
Grid myGrid = new Grid();
//По неясной причине, Vertical обозначает горизонтальные линии, которые будут видимы в данном случае
myGrid.VerticalGridType = Grid.GridType.Fine;
//а Horizontal — вертикальные линии сетки, которые будут убраны
myGrid.HorizontalGridType = Grid.GridType.None;

* This source code was highlighted with Source Code Highlighter.



Когда все линии нарисованы, пора заняться плоскостью графика, где они будут отображены:
//Первое, что нужно сделать для построения графика — объявить поле для его построения
NPlot.Gtk.PlotSurface2D plot = new NPlot.Gtk.PlotSurface2D();
//И очистить его от лишнего содержимого, если имеется
plot.Clear();
//Можно установить заголовок
plot.Title = "Title";
//Добавить рамочку с легендой графика
plot.Legend = new Legend();
//переместить ее вправо-вниз
plot.Legend.AttachTo(NPlot.PlotSurface2D.XAxisPosition.Bottom, NPlot.PlotSurface2D.YAxisPosition.Right);
//отодвинуть от оси, чтобы не перекрывать числа
plot.Legend.YOffset = 16;
//и вынести за плоскость графика
plot.Legend.HorizontalEdgePlacement = Legend.Placement.Outside;
plot.Legend.VerticalEdgePlacement = Legend.Placement.Inside;
//Расширим пространство вокруг плоскости графика
plot.Padding = 40;
//Чтобы линии выглядели не так убого, стоит их сгладить
plot.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

//Осталось добавить все элементы на график
plot.Add(myGrid);
plot.Add(lp);
//Если график финансовый, то надо это четко обозначить, подписав ось
plot.YAxis1.Label = "Money";
//и сделав нормальное отображение чисел на оси (по умолчанию — экспоненциальный вид)
plot.YAxis1.NumberFormat = "{0:n}";
//Последний шаг
plot.Refresh()


* This source code was highlighted with Source Code Highlighter.


В результате получается простое и качественное изображение
image

Как я понял, функционал этим не ограничен и проект еще не мертв(последнее сообщение «Code Committed» на Sourceforge было всего 64 дня назад). По мере изучения NPlot буду дополнять статью.
Tags:
Hubs:
Total votes 9: ↑8 and ↓1+7
Comments1

Articles