JFreeChart PolarPlot:数学方向 [英] JFreeChart PolarPlot: mathematical orientation

查看:167
本文介绍了JFreeChart PolarPlot:数学方向的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

解决方案

顺便说一下,

  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
* /
公共类ArchimedesSpiral扩展JFrame {

private static final String title =Archimedes'Spiral;

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

private static XYDataset createDataset(){
XYSeriesCollection result = new XYSeriesCollection();
XYSeries系列=新的XYSeries(标题);
for(int t = 0; t< = 3 * 360; t ++){
series.add(90-t,t);
}
result.addSeries(系列);
返回结果;
}

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);
}
返回滴答;
}
};
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);
返回图表;
}

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


I'd like to create a polar plot where the data is plotted in mathematical orientation (thus, the series starts and the east and continues counter-clockwise). The default behavior of JFreeChart's PolarPlot is to start north and continue the series clockwise.

Is there any support for this built in the PolarPlot class? I know how to transform the data to reach the goal, but this approach is rather cumbersome, since I'd need to adapt the angle labeling too.

解决方案

As an aside, org.jfree.chart.plot.PolarPlot appears to have been designed for navigational and geodetic applications.

Using the transformation θ' = π/4 – θ and overriding refreshAngleTicks(), as suggested by @mort, produces reasonable results.

Addendum: See also this variation using the new PolarPlot API.

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

这篇关于JFreeChart PolarPlot:数学方向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆