Java调用R ,从数据库读取数据,用R根据读取的数据生成图片保存

Java调用R 以及用R生成的图片保存
使用 png()可以保证图片质量

有人说绘制的图片上有中文会出现乱码,其实设置下字体就好了

family=‘STXihei’


Java调用R 以及用R生成的图片保存

Rserve的配置和启动:

①安装Rserve包。通过R命令行:install.packages(“Rserve”);

②在R命令行输入:library(Rserve),加载Rserve;

然后输入Rserve(),启动服务。

Java调用R:

下载Rserve提供的jar包(http://www.rforge.net/Rserve/files/)下载REngine.jar和RserveEngine.jar。然后导入java项目。

maven项目,坐标为:


    org.rosuda.REngine
    REngine


    org.rosuda.REngine
    Rserve

Java代码

/**
 * 从数据库中查找25组打击-警情的数据,绘制线性关系图
 * @param args
 */
public static void main(String[] args) {
        String host = "127.0.0.1";
        int port = 6311;
        String db_name = "mytest";
        String db_user = "sa";
        String db_pwd = "1234qwer!";
        try {
            //连接 R
            RConnection connection = new RConnection(host, port);
            connection.setStringEncoding("utf8");
            //加载包,创建连接
            connection.eval("library(RODBC)");
            connection.eval("conn <- odbcConnect(\"" + db_name + "\",uid=\"" + db_user + "\",pwd=\"" + db_pwd + "\")");
            //从数据库查询数据
            connection.eval("base <- sqlQuery(conn,\"SELECT u.*, cc.field11 as djzs, " +
                    "pc.field11 as 'jqzs' " +
                    "FROM unit u LEFT JOIN population_v2 p ON p.field2 = u.code LEFT JOIN police_forces_v2 pf ON pf.field2 = u.code " +
                    "LEFT JOIN police_case_v2 pc ON pc.field2 = u.code " +
                    "LEFT JOIN combat_crime_v2 cc ON cc.field2 = u.code where p.year = '2017' and pf.year = '2017' and pc.year = '2017' and cc.year = '2017' ORDER BY u.code\")");
            //生成线性图片的存储路径
            connection.eval("png('/Users/ianly/Desktop/test.png',width=600*3,height=3*600,res=72*3))");
            // 绘图,散列点
            connection.eval("plot(base$jqzs,base$djzs,xlab='警情',ylab='打击',main='打击-警情关系图',family='STXihei')");
            // 绘图 ,线性直线
            connection.eval("abline(lm(base$djzs~base$jqzs),col='red')");
            //本单位散点特殊标色
            connection.eval("index <- which(base$name == '虹桥所')");
            connection.eval("current_dj_point_x <- base$jqzs[index]");
            connection.eval("current_dj_point_y <- base$djzs[index]");
            connection.eval("points(current_dj_point_x, current_dj_point_y, pch=19, col='red', cex=2)");
            //关闭设备 生成图片
            connection.eval("dev.off()");
            //记得关闭连接,否则内存的资源不被释放,会引起进程冲突
            connection.close();
        } catch (RserveException e) {
            e.printStackTrace();
        }
    }

family=‘STXihei’
这个是设置中文乱码的

最后在桌面生成test.jpg的图片
Java调用R ,从数据库读取数据,用R根据读取的数据生成图片保存_第1张图片

你可能感兴趣的:(R)