JFreeChart для представления трехмерных данных на двухмерном графике с использованием цветовых карт - PullRequest
4 голосов
/ 09 декабря 2011

В настоящее время я пытаюсь использовать JFreeChart для представления 3D-данных в 2D-графике.

По сути, у меня есть двумерный массив с именем data[i][j]. i и j представляют координаты y и x, где я хочу построить график. Значение data[i][j] представляет значение частоты, которое я хочу представить на графике в виде цвета.

Я не совсем уверен, как называется нечто подобное, но это будет выглядеть примерно так:

enter image description here

Сейчас я пытаюсь сделать это, используя XYBlockRenderer, однако у меня возникают проблемы с определением набора данных. Я пытаюсь использовать DefaultXYZDataset, но я действительно запутался в том, как вообще определить данные здесь.

Может кто-нибудь объяснить, как использовать DefaultXYZDataset для выполнения такой задачи?

DefaultXYZDataset dataset = new DefaultXYZDataset();

Concentration.dataoutHeight = Concentration.dataout[0].length;

System.out.println(Concentration.dataoutHeight);
System.out.println(ImageProcessor.MAXCBVINT);
double[][] data = new double[3][ImageProcessor.MAXCBVINT];


for (int i = 0; i < Concentration.dataoutHeight; i++) {
    for (int j = 0; j < ImageProcessor.MAXCBVINT; j++) {
        data[0][j] = j;//x value
        data[1][j] = i;//y value
        data[2][j] = Concentration.dataout[j][i][0];//Colour
    }
    dataset.addSeries(i, data);

}
NumberAxis xAxis = new NumberAxis("Intensity");
xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
xAxis.setLowerMargin(0.0);
xAxis.setUpperMargin(0.0);
NumberAxis yAxis = new NumberAxis("Distance to Closest Blood Vessel (um)");
yAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
yAxis.setLowerMargin(0.0);
yAxis.setUpperMargin(0.0);
XYBlockRenderer renderer = new XYBlockRenderer();
PaintScale scale = new GrayPaintScale(0, 10000.0);
renderer.setPaintScale(scale);
renderer.setBlockHeight(1);
renderer.setBlockWidth(1);
XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinesVisible(false);
plot.setRangeGridlinePaint(Color.white);
JFreeChart chart = new JFreeChart("Surface Plot", plot);
chart.removeLegend();
chart.setBackgroundPaint(Color.white);

ChartFrame frame = new ChartFrame("Surface Map - "
    + (Concentration.testing ? "TESTING using "
    + Concentration.testfile : currentFile.getName()), chart);
frame.pack();
frame.setVisible(true);

1 Ответ

1 голос
/ 31 августа 2012

У вас есть два варианта:

  1. Представьте их как 3d 3D Lib для JFreeChart

  2. Вам нужно использовать класс: XYBlockRenderer , который делает именно то, что вы просите. Вы можете скачать демонстрационную коллекцию JFreeChart, где указан код для этого. (исходный код класса здесь ) Существует также этот пример полного кода с очень похожим 4D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...