NPlot的基本用法
1、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对象,plot:为控件名称,并引入空间:using NPlot;我们可以通过下面简单的代码示例来了解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对象中,一切就那么简单!
NPlot的下载地址:http://netcontrols.org/nplot/wiki/index.php?n=Main.HomePage
NPlot的开发文档:http://www.andrewtheken.com/nplot/
E_mail:kissyougoodby@163.com QQ:55774088
public void plotline(double[] x,double[] y)
{
// --- Plotting ---
plot.Clear();
// --- Grid Code ---
Grid mygrid = new Grid();
mygrid.HorizontalGridType =Grid.GridType.None;
mygrid.VerticalGridType =Grid.GridType.Fine;
plot.Add(mygrid);
plot.Title ="××××";
LinePlot lp = newLinePlot();
/横坐标赋值
lp.AbscissaData = x;//newdouble[] { 0, 25,125 };
/纵坐标赋值
lp.OrdinateData = y;//newdouble[] { 200, 200, 0};
//StepPlot line = newStepPlot();
//line.Pen = newPen(Color.Red, 1);
//line.OrdinateData = newdouble[] { 5.5, 4.0, 1.5, 2.5, 3.5 };
//line.HideVerticalSegments= false;
plot.Add(lp);
plot.Refresh();
return;
}
2、Nplot用法举例
myPlot.Clear();
//加入网格
Grid mygrid = new Grid();
myPlot.Add(mygrid);
myPlot.Title = "测试";
LinePlot lp = new LinePlot();
double[] a = new double[] { 1,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
string[] b = new string[] {"1", "2", "3", "4", "5","6", "7", "8", "9", "10","11", "12", };
double[] ab = new double[] { 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ArrayList dates = newArrayList();
dates.Add(Convert.ToDateTime("2007-01-01"));
dates.Add(Convert.ToDateTime("2008-01-02 "));
dates.Add(Convert.ToDateTime("2008-01-03 "));
dates.Add(Convert.ToDateTime("2008-01-04 "));
dates.Add(Convert.ToDateTime("2008-01-05 "));
dates.Add(Convert.ToDateTime("2008-01-06"));
dates.Add(Convert.ToDateTime("2008-01-07 "));
dates.Add(Convert.ToDateTime("2008-01-08 "));
dates.Add(Convert.ToDateTime("2008-01-09 "));
dates.Add(Convert.ToDateTime("2008-01-10"));
dates.Add(Convert.ToDateTime("2008-01-11 "));
dates.Add(Convert.ToDateTime("2008-02-12 "));
lp.AbscissaData = dates;
//柱状
BarPlot storeGrowth = newBarPlot();
storeGrowth.AbscissaData =dates;
storeGrowth.OrdinateDataTop =a;
storeGrowth.OrdinateDataBottom= ab;
storeGrowth.FillBrush =NPlot.RectangleBrushes.Solid.Red;
//storeGrowth.BorderPen = newPen( Color.Black, 2.0f );
myPlot.Add(storeGrowth);
//标签
LabelPointPlot tp1 = newLabelPointPlot();
tp1.AbscissaData = dates;
tp1.OrdinateData = a;
tp1.TextData = b;
tp1.LabelTextPosition =LabelPointPlot.LabelPositions.Above;
tp1.Marker = newMarker(Marker.MarkerType.None, 10);
myPlot.Add(tp1);
//lp.
lp.DataSource = a;
lp.Pen = new Pen(Color.Blue,3.0f);
lp.Label = "GaussianFunction";
myPlot.Add(lp);
myPlot.XAxis1.Label = "时间";
myPlot.YAxis1.Label = "次数";
//myPlot.XAxis1.WorldLength = 60 * 60 * 24;
//设置网格距离
//myPlot.XAxis1.WorldMin +=myPlot.XAxis1.WorldLength/ 12;//WorldLength=n*24*60*60;
//myPlot.XAxis1.WorldMax -=myPlot.XAxis1.WorldLength / 2;
//myPlot.XAxis1.
//myPlot.XAxis1.WorldLength =10;
//myPlot.
//让日期斜45度。
myPlot.XAxis1.TicksLabelAngle =45;
//下面代码可让窗体移动begin;
myPlot.AddInteraction(newNPlot.Windows.PlotSurface2D.Interactions.HorizontalDrag());
//myPlot.AddInteraction(newNPlot.Windows.PlotSurface2D.Interactions.VerticalDrag());
myPlot.AddInteraction(newNPlot.Windows.PlotSurface2D.Interactions.AxisDrag(true));
myPlot.Refresh();
3、Nplot用法
///首先要将下载的NPlot.dll加到工具箱里,拖一个控件到窗体上,声明using NPlot;
对所绘的图进行打印与保存//
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 (ExceptionMyEx)
{
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(newNPlot.Windows.PlotSurface2D.Interactions.HorizontalDrag());
this.myPlot.AddInteraction(newNPlot.Windows.PlotSurface2D.Interactions.VerticalDrag());
this.myPlot.AddInteraction(newNPlot.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, newPen(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(newNPlot.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(newVerticalLine(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();
}