2013-06-30 12 views
5

私は、r、rserve、ggplotを遅く使っています。Rserveからggplotを呼び出します。 1KBの空白のpng画像

このコードは、Rコンソールで実行すると、期待通りに2つの棒グラフが直接レンダリングされます。png(ファイル= 'Yash_GenderVsTotalAccountBalance.png'、幅= 400、高さ= 350、res = 72) ggplot(データ= YashCustomersAccounts、aes(x = GENDER_DESC、y = ACCOUNT_BALANCE))+ geom_bar(stat = 'identity') dev.off()

しかし、Rserveを使ってJAVAから同じコード(ggplot呼び出しを含む)を呼び出すと、空のpngが作成されます。 コードは以下の通りです。

package RRnD; 
import java.awt.*; 
import org.rosuda.REngine.*; 
import org.rosuda.REngine.Rserve.*; 

public class PlottingGenderVsTotalAccountBalance { 

    public static void main(String[] args) throws RserveException { 
     try { 
      RConnection c = new RConnection(); // make a new local connection on default port (6311) 
      System.out.println("1. Connection created ----------------------------------------------------------------------");    
      System.out.println("Working directory = "+c.eval("getwd()").asString()); 
      System.out.println("2. Working dir read ----------------------------------------------------------------------"); 
      c.eval("YashCustomers <- read.csv('YashCustomer.csv', header=TRUE)"); 
      c.eval("YashAccounts <- read.csv('YashAccount.csv', header=TRUE)"); 
      c.eval("YashCustomersAccounts <- merge(YashCustomers,YashAccounts, by='CUSTOMER_ID')"); 
      System.out.println("3. Data.frames read ----------------------------------------------------------------------"); 

      c.eval("library(ggplot2)"); 
      c.eval("require(ggplot2)"); 
      System.out.println("4. ggplot2 loaded ----------------------------------------------------------------------"); 

      c.eval("png(file='Yash_GenderVsTotalAccountBalance.png',width=400,height=350,res=72)"); 
      c.parseAndEval("ggplot(data=YashCustomersAccounts, aes(x=GENDER_DESC,y=ACCOUNT_BALANCE)) + geom_bar(stat='identity');dev.off()");    
      System.out.println("5. plotting done ----------------------------------------------------------------------"); 

      REXP xp = c.parseAndEval("r=readBin('Yash_GenderVsTotalAccountBalance.png','raw',1024*1024)"); 
      c.parseAndEval("unlink('Yash_GenderVsTotalAccountBalance.jpg'); r"); 
      Image img = Toolkit.getDefaultToolkit().createImage(xp.asBytes()); 
      System.out.println("img = "+img); 
      System.out.println("6. File reading done ----------------------------------------------------------------------"); 

      System.out.println("10. All done ----------------------------------------------------------------------");    
      c.close(); 
     } catch (REngineException ree) { 
      System.out.println("REngineException ..."); 
      System.out.println(ree.getMessage()); 
     } catch (Exception e) { 
      System.out.println("Exception ..."); 
      System.out.println(e.getMessage()); 
     } 
    } 

} 

注: - ggplot呼び出しの代わりに、次の行のような単純なプロットコールを作成するとうまくいきます。 png画像が正しく作成されます。 c.parseAndEval( "plot(YashCustomers ['CUSTOMER_ID']); dev.off()"); ...代わりに... c.parseAndEval( "ggplot(data = YashCustomersAccounts、aes(x = GENDER_DESC、y = ACCOUNT_BALANCE))+ geom_bar(stat = 'identity'); dev.off()");

問題を見つけるのを助けてください。 ありがとう、 - Yash

+0

は、IMOは ''結果ggplot2'オブジェクトをprint'必要があります。 – daroczig

答えて

2

コンソールでは、ggplotが画像を自動的に描画します。 しかし、Rserverからggplotプロットを呼び出す際には、明示的にイメージを印刷する必要があります。

c.parseAndEval( "print(ggplot(data = YashCustomersAccounts、aes(x = GENDER_DESC、y = ACCOUNT_BALANCE))+ geom_bar(stat = 'identity')); dev.off()");

おかげで、 --Yash

関連する問題