你的位置:首页 > ASP.net教程

[ASP.net教程]Windows Form调用R进行绘图并显示


  R软件功能非常强大,可以很好的进行各类统计,并能输出图形。下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上。

1 前提准备

   安装R软件,需要安装32位的R软件,64位的调用会报错。另外就是讲R添加到电脑环境变量中。

  打开R软件,安装包 scatterplot3d,演示需要用到此R包。

2 创建项目GraphGenerateByR,项目结构如下:

注意这里需要引入RDotNet类库,可以自行下载:http://rdotnet.codeplex.com/

3 Main窗体代码

 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace GraphGenerateByR11 {12   using RDotNet;13   public partial class Main : Form14   {15     public Main()16     {17       InitializeComponent();18     }19     REngine engine = null;20 21     string Rcode = "";22     private void btnPlot_Click(object sender, EventArgs e)23     {24       try25       {26         if(this.txtRcode.Text=="")27         {28           Rcode = @"library('scatterplot3d')29               z <- seq(-10, 10, 0.01) 30               x <- cos(z)31               y <- sin(z) 32               scatterplot3d(x, y, z, highlight.3d=TRUE, col.axis='blue', col.grid='lightblue',main='3d绘图',pch=20)33              ";34         }35         else36         {37           Rcode = this.txtRcode.Text;38         }39 40         //R.3.2.441         engine = REngine.GetInstance();42         engine.Initialize();43         //图片加入GUID,防止重名(还有一种就是先删除后保存)44         string rnd = System.Guid.NewGuid().ToString().Replace("-", "");45         string filename ="i"+ rnd+ "__Rimage.png";46         engine.Evaluate(string.Format("png(file='{0}',bg ='transparent',width={1},height={2})", filename, this.ptbGraphic.Width, this.ptbGraphic.Height));47 48         //engine.Evaluate(@"x <- (0:12) * pi / 1249         //        y <- cos(x)50         //        plot(x,y);51         //        ");52         engine.Evaluate(Rcode);53         engine.Evaluate("dev.off()");54         string path = System.IO.Path.GetFullPath(filename);55 56         Bitmap image = new Bitmap(path);57         ptbGraphic.Image = image;58       }59       catch(Exception ex)60       {61         MessageBox.Show(ex.Message);62       }63     64     }65 66     private void Main_FormClosing(object sender, FormClosingEventArgs e)67     {68       if(engine!=null)69       {70         //clean up71         engine.Dispose();72       }73     }74   }75 }

 

4 运行:

单击plot后,调用默认R代码,结构如下:

输入合法的R绘图语句,再次单击Plot,结果如下: