2015-09-24 38 views
1

我有一個雙重的二維矩陣,其中包含負值和正值的浮動值以及NA。這些值屬於圖像數據。值在-0.4到+0.4範圍內我想使用JFreeChart庫創建直方圖並查看寬度爲0.05的頻率。爲了將數據集矩陣準備爲HistogramDataset,我首先將矩陣轉換爲一維雙矩陣(下面的代碼),然後使用chartFactory類中可用的createHistogram方法繪製直方圖。但是,我沒有得到結果。我只能在chartPanel區域看到一條垂直線。我看了這些例子,但他們不使用像數據這樣的2-D矩陣作爲輸入。如何準備數據集以使用JFreeChart以直方圖的形式顯示?

http://www.java2s.com/Code/Java/Chart/JFreeChartXYSeriesDemo3.htm

Image histogram generated by JFreeChart

第二個例子是一個小相似,但它不使用2-d矩陣。

這是我已經實現的代碼,用於準備數據集並創建直方圖。

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.statistics.HistogramDataset; 
import org.jfree.data.statistics.HistogramType; 

import java.awt.*; 

public class Histogram { 

    public JFreeChart createHistogram(double[][] doubleMatrix){ 

     // Generate a one dimensional array of the size w*h of the double matrix 
     double[] data = new double[doubleMatrix.length * doubleMatrix[0].length]; 
     int count = 0; 

     for (int i=0; i<doubleMatrix.length; i++) { 
      for (int j = 0; j < doubleMatrix[i].length; j++) { 
       data[count] = doubleMatrix[i][j]; 
       count++; 
      } 
     } 

     // int number = data.length; 
     HistogramDataset dataset = new HistogramDataset(); 
     dataset.setType(HistogramType.FREQUENCY); 
     dataset.addSeries("Hist",data,50); // Number of bins is 50 
     String plotTitle = ""; 
     String xAxis = "Frequency"; 
     String yAxis = "Mass Error (Da)"; 
     PlotOrientation orientation = PlotOrientation.VERTICAL; 

     boolean show = false; 
     boolean toolTips = false; 
     boolean urls = false; 
     JFreeChart chart = ChartFactory.createHistogram(plotTitle, xAxis, yAxis, 
       dataset, orientation, show, toolTips, urls); 

     chart.setBackgroundPaint(Color.white); 

     return chart; 
    } 
} 

我使用的2-d雙矩陣可以在這裏找到:http://www.filedropper.com/data_4

我獲得使用上述代碼此數據集是下面的柱狀圖(!)。這是不適合ChartPanel或JPanel的直方圖的大小嗎?

enter image description here

+0

請編輯您的問題包括[完整的示例](http://stackoverflow.com/help/mcve),顯示您目前的做法,對於[示例](HTTP:// stackoverflow.com/q/28519355/230513)和[示例](http://stackoverflow.com/q/29279550/230513)。 – trashgod

+0

我已經添加了當前的代碼實現:) – novicegeek

+0

你不需要'SimpleHistogramBin'嗎? 'doubleMatrix'中有什麼?一些有代表性的數據會讓別人試用你的代碼。 – trashgod

回答

0

我找到了解決辦法。我首先通過使用ArrayList從雙重矩陣中移除所有的NA,然後將此數組列表轉換爲一維數組,然後生成直方圖。它現在有效。下面是代碼:

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.statistics.HistogramDataset; 
import org.jfree.data.statistics.HistogramType; 

import java.awt.*; 
import java.util.ArrayList; 

public class Histogram { 

    public JFreeChart createHistogram(double[][] doubleMatrix){ 

     // Generate a one dimensional array of the size w*h of the double matrix 
     ArrayList<Double> dataArrayList = new ArrayList<Double>(); 

     for (int i=0; i<doubleMatrix.length; i++) { 
      for (int j = 0; j < doubleMatrix[i].length; j++) { 
       double value = doubleMatrix[i][j]; 
       if(Double.isNaN(value)) 
        continue; 
       else 
        dataArrayList.add(value); 
        System.out.println(value); 
      } 
     } 

     double[] data = new double[dataArrayList.size()]; 

     for(int p = 0; p < dataArrayList.size();p++) 
      data[p] = dataArrayList.get(p); 


     // int number = data.length; 
     HistogramDataset dataset = new HistogramDataset(); 
     dataset.setType(HistogramType.RELATIVE_FREQUENCY); 
     dataset.addSeries("Hist",data,200); // Number of bins is 50 
     String plotTitle = ""; 
     String xAxis = "Frequency"; 
     String yAxis = "Mass Error (Da)"; 
     PlotOrientation orientation = PlotOrientation.VERTICAL; 

     boolean show = false; 
     boolean toolTips = false; 
     boolean urls = false; 
     JFreeChart chart = ChartFactory.createHistogram(plotTitle, xAxis, yAxis, 
       dataset, orientation, show, toolTips, urls); 

     chart.setBackgroundPaint(Color.white); 

     return chart; 
    } 
} 
+0

也許會添加一些示例數據和/或[*截圖*](http://meta.stackoverflow.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post)以補充問題中的圖像。 – trashgod

相關問題