java调用R 画词云

一直想找个java包画词云,但是网上并没有什么现成方案。在github上用关键词wordcloud搜一下,发现用java开发的没有比较好的开源项目(获得星星都很少,最多也就个位数)。但是又想在java项目上用上词云,考虑了一下,还是用java调取R语言的wordcloud包来画词云,然后用swing界面显示。

下面给出基本步骤:

1. java与R的通信,网上的步骤很多,这里不做具体讲解,这里使用的是Rserve方式连接。基本步骤是:

a.安装好jdk和R。

b.R中安装wordcloud包和Rserve包。

c.java项目中导入REngine.jar和RserveEngine.jar两个包。如下图:


2. 先给出代码:Rutil.java是java连接R的连接类,WordCloud.java是java画词云的实现类

package rserve;

import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
/**
 *****************************************
* @function:
* @author hduxyd
* @note:
*****************************************
 */
public class RUtil {

	private static String R_EXE_PATH = "D:\\R-3.0.1_7\\bin\\R.exe";
	private static String R_SCRIPT_PATH = "D:\\R-3.0.1_7\\MyScript\\rserve.R";

	public static RConnection getRConnection() {
		try {
			RConnection rcon = new RConnection();
			return rcon;
		} catch (RserveException e) {
			System.out.println("Rserve未开启,现在启动RServe……");
			try {
				Runtime rn = Runtime.getRuntime();
				rn.exec(R_EXE_PATH + " CMD BATCH \"" + R_SCRIPT_PATH + "\"");
				Thread.sleep(1000);
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			return getRConnection();
		}
	}
}

package rserve;

/******************************************
 * @function:
 * @author hduxyd
 * @note:
 ******************************************/
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JFrame;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;

public class WordCloud extends JFrame {
	private static final long serialVersionUID = 1L;
	static Image img;

	public static void main(String[] args) throws Exception {
		WordCloud wc = new WordCloud();
		REXP xp = wc.getRobj();// 获得R的内容对象
		wc.PlotDemo(xp, wc);
	}

	/**
	 * @throws Exception
	 * @function:
	 */
	private REXP getRobj() throws Exception {
		RConnection c = RUtil.getRConnection();
		c.setStringEncoding("utf8");
		REXP Rversion = c.eval("R.version.string");
		System.out.println(Rversion.asString());
		System.out.println("\n--------------画图演示----------------");
		REXP xp = c.parseAndEval("jpeg('test.jpg',quality=90)");
		c.eval("library(wordcloud)");
		c.voidEval("colors=c('red','blue','green','yellow','purple')");
		c.eval("data=read.table('C:/Users/xyd/Desktop/测试.txt',header = F)");
		c.parseAndEval("wordcloud(data$V2,data$V1,scale=c(5,0.3),min.freq=-Inf,max.words=60,colors=colors,random.order=F,random.color=F,ordered.colors=F);dev.off()");
		xp = c.parseAndEval("r=readBin('test.jpg','raw',2048*2048); unlink('test.jpg'); r");
		return xp;
	}

	public void PlotDemo(REXP xp, JFrame f) throws Exception {
		img = Toolkit.getDefaultToolkit().createImage(xp.asBytes());
		MediaTracker mediaTracker = new MediaTracker(this);
		mediaTracker.addImage(img, 0);
		mediaTracker.waitForID(0);
		f.setTitle("Test image");
		f.setSize(img.getWidth(null), img.getHeight(null));
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	public void paint(Graphics g) {
		g.drawImage(img, 0, 0, null);
	}
}
3. 需要解释的地方

在Rutil.java中有两个路径,R_EXE_PATH 和R_SCRIPT_PATH

R_EXE_PATH:


R_SCRIPT_PATH:

在R安装路径的根目录下新建一个MyScript文件夹,在文件夹下写一个R脚本,两行代码:

library(Rserve)

Rserve()


4. 需要注意的地方:

这样执行成功的话,程序会关不掉,在myeclipse中点击红色按钮没反应。这时需要打开任务管理器。将Rserve服务关闭才行。这样程序才能结束运行。


解决办法是先关闭原有Rserve进程,打开R软件,运行Rserve()重开一个进程,再执行上文给出的java代码:


问题是解决了,但是感觉并不方便,不知道有没有更好的方案,坐等大神指教。

5. 数据格式以及运行结果

在 c.eval("data=read.table('C:/Users/xyd/Desktop/测试.txt',header = F)");  这条代码中可以看到我是把测试数据放到桌面的。

测试.txt        格式为:词频  词语     //中间空格         内容为:

11 郑州
21 白糖
31 期货
41 小幅
51 低开
61 震荡
71 跌幅
81 分析师
91 表示
101 下跌
111 态势
121 食糖
131 价格
141 昨日
151 继续
141 不过
131 午盘
121 止跌
111 继续
101 反抽
91 力度
81 不大
71 低位
61 买盘
51 积极
41 目前
31 采购
21 糖价
11 反弹

结果图:


最后欢迎各位批评指正吐舌头


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页