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

标签 java matrix charts histogram jfreechart

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

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;
    }
} 

我正在使用的二维双矩阵可以在这里找到:http://www.filedropper.com/data_4

我对这个数据集使用上述代码得到的是以下直方图(!)。直方图的大小是否不适合 ChartPanel 或 JPanel?

enter image description here

最佳答案

我找到了解决方案。我首先使用 ArrayList 从双矩阵中删除所有 NA,然后将此 arrayList 转换为一维数组,然后生成直方图。现在它起作用了。这是代码:

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;
    }
}

关于java - 如何使用 JFreeChart 准备数据集以直方图的形式显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32767933/

相关文章:

java - 超时后如何取消任务?

java - 底部栏和抽屉导航如何与 JAVA 配合使用?

ruby - 你如何从初始化方法调用类方法?

javascript - 有没有办法在 vue-google-charts vue.js 包装器中使用 NumberFormat() 格式化程序(谷歌图表)

javascript - 在 Flot 中移动水平条形图中条形的位置

java - JMockit 问题(刚开始)

java - 无法解析 pom.xml 依赖项 - Eureka DiscoveryClient

algorithm - 0 1 矩阵平衡

r - 通过排列 R 中的列来最大化矩阵的对角线

java - Apache POI 设置 Excel 图表标题