java - JFreeChart PolarPlot : mathematical orientation

标签 java jfreechart

我想创建一个极坐标图,其中数据以数学方向绘制(因此,该系列从东开始并逆时针继续)。 JFreeChart 的 PolarPlot 的默认行为是从北开始并顺时针继续序列。

PolarPlot 类中是否对此有任何支持?我知道如何转换数据以达到目标,但这种方法相当麻烦,因为我还需要调整角度标签。

最佳答案

顺便说一句,org.jfree.chart.plot.PolarPlot似乎是designed对于 navigationalgeodetic应用程序。

使用变换 θ' = π/4 – θ 并覆盖 refreshAngleTicks(),如 suggested通过@mort,产生合理的结果。

附录:另见 variation使用新的 PolarPlot API。

archimedes spiral

import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTick;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PolarPlot;
import org.jfree.chart.renderer.DefaultPolarItemRenderer;
import org.jfree.chart.renderer.PolarItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.TextAnchor;

/**
 * @see http://en.wikipedia.org/wiki/Polar_coordinate_system
 * @see https://stackoverflow.com/questions/3458824
 */
public class ArchimedesSpiral extends JFrame {

    private static final String title = "Archimedes' Spiral";

    public ArchimedesSpiral(String title) {
        super(title);
        JFreeChart chart = createChart(createDataset());
        ChartPanel panel = new ChartPanel(chart);
        panel.setPreferredSize(new Dimension(500, 500));
        panel.setMouseZoomable(false);
        this.add(panel);
    }

    private static XYDataset createDataset() {
        XYSeriesCollection result = new XYSeriesCollection();
        XYSeries series = new XYSeries(title);
        for (int t = 0; t <= 3 * 360; t++) {
            series.add(90 - t, t);
        }
        result.addSeries(series);
        return result;
    }

    private static JFreeChart createChart(XYDataset dataset) {
        ValueAxis radiusAxis = new NumberAxis();
        radiusAxis.setTickLabelsVisible(false);
        PolarItemRenderer renderer = new DefaultPolarItemRenderer();
        PolarPlot plot = new PolarPlot(dataset, radiusAxis, renderer) {

            @Override
            protected List refreshAngleTicks() {
                List<NumberTick> ticks = new ArrayList<NumberTick>();
                int delta = (int) this.getAngleTickUnit().getSize();
                for (int t = 0; t < 360; t += delta) {
                    int tp = (360 + 90 - t) % 360;
                    NumberTick tick = new NumberTick(
                        Double.valueOf(t), String.valueOf(tp),
                        TextAnchor.CENTER, TextAnchor.CENTER, 0.0);
                    ticks.add(tick);
                }
                return ticks;
            }
        };
        plot.setBackgroundPaint(new Color(0x00f0f0f0));
        plot.setRadiusGridlinePaint(Color.gray);
        plot.addCornerTextItem("r(θ) = θ; 0 < θ < 6π");
        JFreeChart chart = new JFreeChart(
            title, JFreeChart.DEFAULT_TITLE_FONT, plot, true);
        chart.setBackgroundPaint(Color.white);
        return chart;
    }

    public static void main(String[] args) {
        ArchimedesSpiral demo = new ArchimedesSpiral(title);
        demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        demo.pack();
        demo.setLocationRelativeTo(null);
        demo.setVisible(true);
    }
}

关于java - JFreeChart PolarPlot : mathematical orientation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3458824/

相关文章:

java - XY block 渲染器 jfreechart 中 block 的轮廓

java - Java 循环迭代器抛出 ConcurrentModificationException

java - Kafka 客户端连接池

java - 过滤列表的属性不包含在另一个列表的属性中

java - 如何在 JList 中将项目设置为选中

java - JFreeChart 多系列问题

java - 如何从批处理文件中查找 32 位 jvm.dll

Java-方法同步

java - JavaFX 2.0 可以用作科学图表包吗?

java - 如何从java中的mysql数据库获取图表数据?