我有一个双重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;
}
}
我正在使用的二维双矩阵可以在这里找到:http://www.filedropper.com/data_4
我使用上述代码获得的数据集是以下直方图(!)。它是直方图的大小,不适合ChartPanel或JPanel吗?
答案 0 :(得分: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;
}
}