JFreeChart PolarPlot:数学方向 [英] JFreeChart PolarPlot: mathematical orientation
问题描述
我想创建一个极坐标图,其中数据以数学方向绘制(因此,系列开始,向东并逆时针继续)。 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屋!