полярный график с использованием диаграмм javafx

Я создаю полярный сюжет (звездный сюжет) и хотел бы сделать это в JavaFX. Я видел несколько коммерческих компаний, у которых есть такая возможность, однако я хотел бы иметь собственную библиотеку, которую мы могли бы модифицировать позже по мере необходимости. Я исследовал документацию и библиотеки, чтобы найти способ создать полярный график. Мне не везет. Можете ли вы указать мне в правильном направлении, пожалуйста? Я посмотрел на CategoryAxis, NumberAxis, ValueAxis, ScatterChart, PieChart, LineChart безрезультатно. В основном я смотрю на круговую сетку, и у меня возникают проблемы, даже не с нанесенными на график данными. Я работал с Arc и Canvas, а также с Scenegraph с Arcs. Я бы очень хотел использовать функции диаграммы, такие как построение данных и связывание этих данных с таблицей на полярном графике. Моя первоначальная мысль заключалась в том, чтобы использовать диаграмму XY с радиусом в качестве одной оси и углами, под которыми будут находиться точки осей. Любая помощь будет принята с благодарностью.


person user2886917    schedule 16.10.2013    source источник
comment
Другой вопрос, должен ли я использовать холст для рисования полярного графика или использовать узлы, если я не использую возможности построения диаграмм в javafx? Это мыслящий клиент.   -  person user2886917    schedule 24.04.2014


Ответы (2)


О встроенной реализации PolarChart в JavaFX

Я думаю, вам нужно будет создать подкласс Chart напрямую (для создания нового типа диаграммы — PolarChart) вместо использования XYдиаграмма.

Вы можете много позаимствовать из реализация XYChart (и, возможно, даже реализация круговой диаграммы при создании нового PolarChart. В JavaFX существует код Java для PolarCharts, который вы могли бы помочь, некоторые из них (хотя они используют другую структуру и технологию рендеринга) могут вдохновить вас при создании PolarChart, см., например: DefaultPolarItemRender.java и PolarPlot.java.

Я предполагаю, что реализация будет сложной и требует значительного объема работы.

Об использовании альтернативных технологий

В качестве альтернативы вы можете использовать Java 8 и встроить полярный график JFreeChart в приложение JavaFX, используя SwingNode или используйте одну из множества отличных библиотек построения графиков на основе JavaScript (например, HighCharts), внедрив диаграмму, созданную с помощью JavaScript, в WebView.

person jewelsea    schedule 16.10.2013
comment
Какой существующий код Java находится в PolarCharts JavaFX? Я думаю, что пропустил это при исследовании. Я просмотрел JFreeChart и некоторые другие, но, поскольку мне нужно пока оставаться на Java 7, я не могу включить Swing в приложение. - person user2886917; 17.04.2014
comment
В настоящее время нет существующего кода для полярных диаграмм в JavaFX. Если вы хотите использовать JavaFX для построения такой диаграммы, вам нужно будет извлечь из Chart и написать код самостоятельно. - person jewelsea; 02.05.2014
comment
Для тех, кто хочет использовать JFreeChart в JavaFX, нет необходимости использовать SwingNode, поскольку в JFreeChart встроен узел ChartViewer на основе холста. - person David Gilbert; 03.05.2016
comment
Хотя в JFreeChart есть ChartViewer JavaFX в качестве замены ChartPanel Swing, похоже, он не поддерживает стиль CSS для PolarPlot. И класс JFreeChart, и класс PolarPlot по-прежнему используют некоторый код Java Swing/AWT. - person DJViking; 10.02.2017

Вместо того, чтобы переписывать логику полярных графиков в JavaFx, вы можете повторно использовать уже существующую библиотеку JavaScript. Я написал оболочку для использования известной библиотеки JavaScript d3.js из JavaFx:

https://github.com/stefaneidelloth/javafx-d3

Это позволяет вам использовать возможности d3 для создания красивой графики и графиков в JavaFx. Вот пример полярного графика d3.js:

http://bl.ocks.org/mbostock/4583749

var data = d3.range(0, 2 * Math.PI, .01).map(function(t) {
  return [t, Math.sin(2 * t) * Math.cos(2 * t)];
});

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2 - 30;

var r = d3.scale.linear()
    .domain([0, .5])
    .range([0, radius]);

var line = d3.svg.line.radial()
    .radius(function(d) { return r(d[1]); })
    .angle(function(d) { return -d[0] + Math.PI / 2; });

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

var gr = svg.append("g")
    .attr("class", "r axis")
  .selectAll("g")
    .data(r.ticks(5).slice(1))
  .enter().append("g");

gr.append("circle")
    .attr("r", r);

gr.append("text")
    .attr("y", function(d) { return -r(d) - 4; })
    .attr("transform", "rotate(15)")
    .style("text-anchor", "middle")
    .text(function(d) { return d; });

var ga = svg.append("g")
    .attr("class", "a axis")
  .selectAll("g")
    .data(d3.range(0, 360, 30))
  .enter().append("g")
    .attr("transform", function(d) { return "rotate(" + -d + ")"; });

ga.append("line")
    .attr("x2", radius);

ga.append("text")
    .attr("x", radius + 6)
    .attr("dy", ".35em")
    .style("text-anchor", function(d) { return d < 270 && d > 90 ? "end" : null; })
    .attr("transform", function(d) { return d < 270 && d > 90 ? "rotate(180 " + (radius + 6) + ",0)" : null; })
    .text(function(d) { return d + "°"; });

svg.append("path")
    .datum(data)
    .attr("class", "line")
    .attr("d", line);

Вы можете применить стратегию javafx-d3, чтобы включить любую библиотеку JavaScript, которую вы хотите. Следующая библиотека полярного блоттинга построена поверх d3.js и может предоставлять некоторые более специализированные функции:

https://github.com/biovisualize/micropolar

person Stefan    schedule 01.05.2016