Java呼叫R ,從資料庫讀取資料,用R根據讀取的資料生成圖片儲存
阿新 • • 發佈:2018-12-20
Java呼叫R 以及用R生成的圖片儲存 使用 png()可以保證圖片質量
有人說繪製的圖片上有中文會出現亂碼,其實設定下字型就好了
family=‘STXihei’
Java呼叫R 以及用R生成的圖片儲存
Rserve的配置和啟動:
①安裝Rserve包。通過R命令列:install.packages(“Rserve”);
②在R命令列輸入:library(Rserve),載入Rserve;
然後輸入Rserve(),啟動服務。
Java呼叫R:
maven專案,座標為:
<dependency> <groupId>org.rosuda.REngine</groupId> <artifactId>REngine</artifactId> </dependency> <dependency> <groupId>org.rosuda.REngine</groupId> <artifactId>Rserve</artifactId> </dependency>
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的圖片