画面・グラフィック
- グラフ描画ライブラリ - NPlot
グラフ描画ツールは.NET Frameworkには標準で付属していません。そこでここではNPlotというグラフ描画ライブラリを紹介します。このライブラリなのですが、一見するとものすごくきれいに描画してくれるように見えます。ただ、本格的に使用していくとやはり物足りなさを感じてきます。やはり難しいのではないのでしょうか、グラフ描画ツールって。(有料のものは使ったことないですが)使っていくうちにどんどん要求が高くなってくるからです。もっときれいに見せるために「ああしたい、こうしたい」という欲望がわいてきます。NPlotはオープンソースですが、追加要求があるたびにソースコードを解析するのも大変です。結局私もNPlotでは満足せず、自分でライブラリを作ってしまいました。自作ならいくらでも機能追加していけるからです。とはいえ、ここでは自作ライブラリを公開するわけにもいかないので、NPlotでここまでできるということをお見せするにとどめておきたいと思います。
NPlotは公式サイトよりダウンロードしてください。
http://netcontrols.org/nplot/wiki/
NPlotによるグラフ表示例
下記のようにNPlot.Windows.PlotSurface2Dクラスをインスタンス化することも出来ますし、 デザイナからコントロールを貼り付けることも出来ます。
public partial class FormNplot : Form
{
private NPlot.Windows.PlotSurface2D _ploter;
private void FormNplot_Load( object sender, EventArgs e )
{
// コントロール生成(デザイナで貼り付けることもできます)
_ploter = new NPlot.Windows.PlotSurface2D();
this.Controls.Add( _ploter );
// 基本設定
_ploter.Clear();
_ploter.Title = "Title";
_ploter.BackColor = Color.LightGray;
_ploter.PlotBackColor = Color.WhiteSmoke;
_ploter.ShowCoordinates = true;
_ploter.TitleColor = Color.Black;
_ploter.DateTimeToolTip = true;
// ドラッグによるビュー移動
_ploter.AddInteraction( new NPlot.Windows.PlotSurface2D.Interactions.HorizontalDrag() );
_ploter.AddInteraction( new NPlot.Windows.PlotSurface2D.Interactions.VerticalDrag() );
_ploter.AddInteraction( new NPlot.Windows.PlotSurface2D.Interactions.AxisDrag( true ) );
// レジェンド
NPlot.Legend legend = new NPlot.Legend();
legend.AttachTo( NPlot.PlotSurface2D.XAxisPosition.Top, NPlot.PlotSurface2D.YAxisPosition.Left );
legend.VerticalEdgePlacement = NPlot.Legend.Placement.Inside;
legend.HorizontalEdgePlacement = NPlot.Legend.Placement.Inside;
legend.YOffset = 8;
_ploter.Legend = legend;
_ploter.LegendZOrder = 1000;
// 生データ
List<double> x = new List<double>();
List<double> y = new List<double>();
for( int i = 0; i < 10; i++ )
{
x.Add( i );
y.Add( i*i );
}
// データ描画
NPlot.LinePlot plot = new NPlot.LinePlot();
plot.Label = "Sample";
plot.Pen.Width = 2;
plot.Color = Color.Blue;
plot.ShowInLegend = true;
plot.OrdinateData = y;
plot.AbscissaData = x;
_ploter.Add( plot );
// 表示更新
_ploter.Refresh();
}
}