首页 文章

如何准备数据集以使用JFreeChart以直方图的形式显示?

提问于
浏览
1

我有一个双重2-D矩阵,它包含负和正浮点值以及NA . 这些值属于图像数据 . 值位于-0.4到0.4范围内我想使用JFreeChart库创建直方图并查看bin宽度为0.05的频率 . 为了将数据集矩阵准备为HistogramDataset,我首先将矩阵转换为1-D双矩阵(下面的代码),然后使用chartFactory类中可用的createHistogram方法绘制直方图 . 但是,我没有得到结果 . 我可以在chartPanel区域看到一条垂直线 . 我查看了这些示例,但它们不使用像数据这样的二维矩阵作为输入 .

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

Image histogram generated by JFreeChart

第二个例子有点类似,但它不使用二维矩阵 .

这是我为准备数据集和创建直方图而实现的代码 .

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

1 回答

  • 0

    我找到了解决方案 . 我首先使用ArrayList从双矩阵中删除所有NA,然后将此arrayList转换为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;
        }
    }
    

相关问题