C# 使用NPlot绘图技巧

图表控件一直是很难找的,特别是免费又强大的。NPlot是一款非常难得的.Net平台下的图表控件,能做各种曲线图,柱状图,饼图,散点图,股票图等,而且它免费又开源,使用起来也非常符合程序员的习惯。唯一的缺点就是文档特别难找,难读。通过对其文档的阅读和对示例程序源代码的分析,现在将NPlot的基本概念整理如下:

NPlot的命名空间包括NPlot,NPlot.Bitmap,NPlot.Web,NPlot.Web.Design,NPlot.Windows等,其中最核心的,管理各种图表的类都属于NPlot命名空间,NPlot.Bitmap针对位图的管理,NPlot.Web,NPlot.Web.Design和NPlot.Windows则可视为NPlot图表在Web Form和Windows Form上的容器(PlotSurface2D)。这些容器可以拖到Form上,也可以位于其他容器之中。

要在应用程序中应用NPlot控件,首先要把所下载的NPlot.dll添加到.Net工程中。并将其添加到工具箱托盘中。添加方式为:在工具箱上单击右键,选择“选择项”,会出现“选择工具箱项”对话框,在“.Net Frameworks组件”属性页,选择浏览,找到NPlot.dll添加到工具箱项。这时工具箱中会出现NPlot控件。在设计应用程序界面时,可以将其拖入应用程序界面,系统会在代码中自动创建一个PlotSurface2D对象。

PlotSurface2D对象是NPlot图表的容器,所有的图表图形,坐标,标题(都继承IDrawable接口)等各种信息都可以被加入PlotSurface2D。PlotSurface2D拥有一个非常重要的方法:Add。各种图表图形,坐标,标题都可以通过Add加入PlotSurface2D对象。

我们可以通过下面简单的代码示例来了解NPlot的基本用法:

public void plotline()

{

// --- Plotting ---

plot.Clear();

// --- Grid Code ---

Grid mygrid = new Grid();

mygrid.HorizontalGridType = Grid.GridType.None;

mygrid.VerticalGridType = Grid.GridType.Fine;

plot.Add(mygrid);

plot.Title = "Test";

StepPlot line = new StepPlot();

line.Pen = new Pen (Color.Red, 1);

line.OrdinateData = new int [] {0, 1, 0, 1, 1, 0};

line.HideVerticalSegments = false;

plot.Add(line);

plot.Refresh();

return;

}

Grid对象和StepPlot对象都是NPlot命名空间中的对象,都继承于NPlot.IDrawable,都可以作为PlotSurface2D.Add函数调用,在NPlot中画图,就是把网格,坐标,图形等各种对象加入PlotSurface2D对象中,一切就那么简单!

下面给出更多代码例子

////////对所绘的图进行打印与保存//////////

private void print()

{

myPlot.Print(true);

}

private void save()

{

saveFileDialog1.Filter = "位图(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg;*.jpeg;*,jpe|Gif(*.gif)|*.gif|Tiff(*.tiff)|*.tiff|Png(*.png)|*.png|Exif(*.exif)|*.exif|所有文件(*.*)|*.*";

if (saveFileDialog1.ShowDialog() == DialogResult.OK)

{

try

{

int h = myPlot.Size.Height;

int w = myPlot.Size.Width;

Bitmap bm = new Bitmap(w, h);

Bitmap bm1 = new Bitmap(w, h);

Rectangle rt = new Rectangle(1, 1, w, h);

saveFileDialog1.RestoreDirectory = true;

saveFileDialog1.CreatePrompt = true;

myPlot.DrawToBitmap(bm, rt);

if (saveFileDialog1.FilterIndex == 1)

{

bm.Save(saveFileDialog1.FileName);

}

if (saveFileDialog1.FilterIndex == 2)

{

bm.Save(saveFileDialog1.FileName, ImageFormat.Jpeg);

}

if (saveFileDialog1.FilterIndex == 3)

{

bm.Save(saveFileDialog1.FileName, ImageFormat.Gif);

}

if (saveFileDialog1.FilterIndex == 4)

{

bm.Save(saveFileDialog1.FileName, ImageFormat.Tiff);

}

if (saveFileDialog1.FilterIndex == 5)

{

bm.Save(saveFileDialog1.FileName, ImageFormat.Png);

}

if (saveFileDialog1.FilterIndex == 6)

{

bm.Save(saveFileDialog1.FileName, ImageFormat.Exif);

}

}

catch (Exception MyEx)

{

MessageBox.Show(MyEx.ToString(), "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}

}

///放大缩小

private void changeSize()

{

this.myPlot.XAxis1.IncreaseRange(0.1);

this.myPlot.YAxis1.IncreaseRange(0.1); //缩小

this.myPlot.XAxis1.IncreaseRange(-0.1);

this.myPlot.YAxis1.IncreaseRange(-0.1); //放大

this.myPlot.Refresh();

}

/////////各种绘图//////////

private void plot()

{

this.myPlot.Clear(

////////标签//////////

string[] strLabel = new string[leng];

for (int i = 0; i < leng; i++)

strLabel[i] = Convert.ToString(p[i]);

LabelPointPlot labp = new LabelPointPlot();

labp.AbscissaData = X;

labp.OrdinateData = p;

labp.TextData = strLabel;

labp.LabelTextPosition = LabelPointPlot.LabelPositions.Above;

labp.Marker = new Marker(Marker.MarkerType.Square, 8);

labp.Marker.Color = Color.Blue;

myPlot.Add(labp);

myPlot.Refresh();

////////网格//////////

Grid mygrid = new Grid();

mygrid.HorizontalGridType = Grid.GridType.Fine;

mygrid.VerticalGridType = Grid.GridType.Fine;

this.myPlot.Add(mygrid);

////////曲线,双坐标轴//////////

///////水平线//////////

HorizontalLine line = new HorizontalLine(1.2);

line.LengthScale = 0.89f;

this.myPlot.Add(line, -10);

///////垂直线///////////

VerticalLine line2 = new VerticalLine(1.2);

line2.LengthScale = 0.89f;

this.myPlot.Add(line2);

///////普通的线///////////

LinePlot lp3 = new LinePlot();

lp3.OrdinateData = yPW;

lp3.AbscissaData = x;

lp3.Pen = new Pen(Color.Orange);

lp3.Pen.Width = 2;

lp3.Label = " 价格";

this.myPlot.Add(lp3);

LinearAxis linx = (LinearAxis)myPlot.XAxis1;

this.myPlot.XAxis1 = linx;

LinearAxis liny = (LinearAxis)myPlot.YAxis1;

liny.Label = "价格";

liny.AxisColor = Color.Orange;

liny.LabelColor = Color.Orange;

liny.TickTextColor = Color.Orange;

this.myPlot.YAxis1 = liny;

LinePlot lp4 = new LinePlot();

lp4.OrdinateData = yUw;

lp4.AbscissaData = x;

lp4.Pen = new Pen(Color.Green);

lp4.Pen.Width = 2;

lp4.Label = "销售量";

this.myPlot.Add(lp4, PlotSurface2D.XAxisPosition.Top, PlotSurface2D.YAxisPosition.Right);

LinearAxis liny2 = (LinearAxis)myPlot.YAxis2;

liny2.WorldMax = 1.2;

liny2.WorldMin = 0;

liny2.Label = "销售量";

liny2.AxisColor = Color.Green;

liny2.LabelColor = Color.Green;

liny2.TickTextColor = Color.Green;

this.myPlot.YAxis2 = liny2;

///////图例//////////

this.myPlot.Legend = new Legend();

this.myPlot.Legend.AttachTo(PlotSurface2D.XAxisPosition.Top, PlotSurface2D.YAxisPosition.Right);

this.myPlot.Legend.NumberItemsHorizontally = 2;

this.myPlot.Legend.HorizontalEdgePlacement = Legend.Placement.Inside;

this.myPlot.Legend.VerticalEdgePlacement = Legend.Placement.Inside;

this.myPlot.Legend.YOffset = 5;

this.myPlot.Legend.XOffset = -5;

///////窗体移动//////////

this.myPlot.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.HorizontalDrag());

this.myPlot.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.VerticalDrag());

this.myPlot.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.AxisDrag(true));

//////累加的柱状图////////

HistogramPlot hp3 = new HistogramPlot();

hp3.AbscissaData = x;

hp3.OrdinateData = yCC1;

hp3.BaseWidth = 0.6f;

hp3.RectangleBrush = RectangleBrushes.Vertical.FaintBlueFade;

hp3.Filled = true;

hp3.Label = "一月";

HistogramPlot hp4 = new HistogramPlot();

hp4.AbscissaData = x;

hp4.OrdinateData = yCC2;

hp4.Label = "二月";

hp4.RectangleBrush = RectangleBrushes.Horizontal.FaintGreenFade;

hp4.Filled = true;

hp4.StackedTo(hp3);

this.myPlot.Add(hp3);

this.myPlot.Add(hp4);

//////阶状图////////

StepPlot sp1 = new StepPlot();

sp1.OrdinateData = yCH1;

sp1.AbscissaData = x;

sp1.Label = "高度";

sp1.Pen.Width = 2;

sp1.Pen.Color = Color.Blue;

this.myPlot.Add(sp1);

/////点状图////////

Marker m = new Marker(Marker.MarkerType.Cross1, 6, new Pen(Color.Blue, 2.0F));

PointPlot pp = new PointPlot(m);

pp.OrdinateData = a;

pp.AbscissaData = new StartStep(-500.0, 10.0);

pp.Label = "Random";

this.myPlot.Add(pp);

/////Image图////////

double[,] map = new double[19, 19];

for (int i = 0; i < 19; ++i)

{

for (int j = 0; j < 19; ++j)

{

map[i, j] = Convert.ToDouble(tokens[i * 19 + j], new

System.Globalization.CultureInfo("en-US"));

}

}

ImagePlot ip = new ImagePlot(map, -9.0f, 1.0f, -9.0f, 1.0f);

ip.Gradient = new LinearGradient(Color.Gold, Color.Black);

this.myPlot.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;

this.myPlot.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.RubberBandSelection());

this.myPlot.Add(ip);

///////蜡烛图///////////

int[] opens = { 1, 2, 1, 2, 1, 3 };

double[] closes = { 2, 2, 2, 1, 2, 1 };

float[] lows = { 0, 1, 1, 1, 0, 0 };

System.Int64[] highs = { 3, 2, 3, 3, 3, 4 };

int[] times = { 0, 1, 2, 3, 4, 5 };

CandlePlot cp = new CandlePlot();

cp.CloseData = closes;

cp.OpenData = opens;

cp.LowData = lows;

cp.HighData = highs;

cp.AbscissaData = times;

this.myPlot.Add(cp);

/////对数坐标轴////////

// x axis

LogAxis logax = new LogAxis(plotSurface.XAxis1);

logax.WorldMin = xmin;

logax.WorldMax = xmax;

logax.AxisColor = Color.Red;

logax.LabelColor = Color.Red;

logax.TickTextColor = Color.Red;

logax.LargeTickStep = 1.0f;

logax.Label = "x";

this.myPlot.XAxis1 = logax;

// y axis

LogAxis logay = new LogAxis(plotSurface.YAxis1);

logay.WorldMin = ymin;

logay.WorldMax = ymax;

logay.AxisColor = Color.Red;

logay.LabelColor = Color.Red;

logay.TickTextColor = Color.Red;

logay.LargeTickStep = 1.0f;

logay.Label = "x^2";

this.myPlot.YAxis1 = logay;

/////字符坐标轴////////

LabelAxis la1 = new LabelAxis(this.myPlot.XAxis1);

string[] sX = new string [15];

for (int i = 0; i < 15; i++)

{

la1.AddLabel(sX[i].ToString(), i);

}

la1.Label = "时间";

la1.TickTextFont = new Font("Courier New", 10);

la1.TicksBetweenText = true;

this.myPlot.XAxis1 = la1;

/////区域着色////////

FilledRegion fr = new FilledRegion(new VerticalLine(1.2),new VerticalLine(2.4));

//两条线之间的区域: FilledRegion fr = new FilledRegion(lp1, lp2);

fr.Brush = Brushes.BlanchedAlmond;

this.myPlot.Add(fr);

//////画箭头//////////

ArrowItem a = new ArrowItem(new PointD(2, 4),360-(30-90), "Arrow");

a.HeadOffset = 5;

a.ArrowColor = Color.Red;

a.TextColor = Color.Purple;

this.myPlot.Add(a);

this.myPlot.Refresh();

}

转载:http://blog.sina.com.cn/s/blog_4b1260cb0100kjz7.html

http://blog.csdn.net/complexadaptivesys/article/details/935553