2015-09-24 2 views
1

У меня есть двойная двумерная матрица, которая содержит отрицательные и постные значения float, а также NA. Эти значения относятся к данным изображения. Значения лежат в диапазоне от -0,4 до +0,4. Я хочу использовать библиотеку JFreeChart для создания гистограммы и просмотра частоты с шириной ячейки 0,05. Чтобы подготовить матрицу набора данных как HistogramDataset, я сначала преобразовал матрицу в одномерную двойную матрицу (код ниже), а затем использовал метод createHistogram, доступный в классе chartFactory, для рисования гистограммы. Но я не получаю результатов. Я могу просто увидеть вертикальную линию в области chartPanel. Я посмотрел на эти примеры, но они не используют двумерную матрицу, такую ​​как данные в качестве входных данных.Как подготовить набор данных для отображения в виде гистограммы с помощью 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

Я нашел решение. Сначала я удалил все NA из двойной матрицы, используя ArrayList, а затем преобразовал этот массивList в 1D-массив и затем создал гистограмму. Теперь это сработало. Вот код:

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

Возможно, добавьте образцы данных и/или [* screenshot *] (http://meta.stackoverflow.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post) в дополнение к изображению в вопросе. – trashgod