JFreeChart的极坐标图形状标注 [英] JFreechart Polar Chart shape annotation
问题描述
我试图用颜色不同颜色的极坐标图的不同区域。例如着色角20和60之间以及在半径2和4之间的区域。
我怎样才能做到这一点?我想用一个形状的注释,并从那里绘制弧形,但似乎没有形状标注为极坐标图。
有任何想法吗?
谢谢
进口java.awt.Color中;
进口java.awt.Dimension中;
进口的java.util.ArrayList;
进口的java.util.List;
进口javax.swing.JFrame中;
进口org.jfree.chart.ChartPanel;
进口org.jfree.chart.JFreeChart;
进口org.jfree.chart.axis.NumberAxis;
进口org.jfree.chart.axis.NumberTick;
进口org.jfree.chart.axis.ValueAxis;
进口org.jfree.chart.plot.PolarPlot;
进口org.jfree.chart.renderer.DefaultPolarItemRenderer;
进口org.jfree.chart.renderer.PolarItemRenderer;
进口org.jfree.data.xy.XYDataset;
进口org.jfree.data.xy.XYSeries;
进口org.jfree.data.xy.XYSeriesCollection;
进口org.jfree.ui.TextAnchor;公共类test2的扩展JFrame的{ 私有静态最后弦乐标题=阿基米德螺旋 公共TEST2(字符串名称){
超(职称);
JFreeChart的图表= createChart(createDataset());
ChartPanel面板=新ChartPanel(图)
panel.set preferredSize(新尺寸(500,500));
panel.setMouseZoomable(假);
this.add(面板);
} 私有静态XYDataset createDataset(){
XYSeriesCollection结果=新XYSeriesCollection();
XYSeries系列=新XYSeries(职称);
XYSeries SER =新XYSeries(测试);
对于(INT T = 0; T< = 1 * 360;吨++){
series.add(90 - T,T);
} 对于(INT T = 0; T< = 1 * 120;吨++){
ser.add(90 - T,40);
ser.add(90 - T,120);
}
result.addSeries(系列);
result.addSeries(SER);
返回结果;
} 私有静态的JFreeChart createChart(XYDataset数据集){
ValueAxis radiusAxis =新NumberAxis();
radiusAxis.setTickLabelsVisible(假);
PolarItemRenderer渲染器=新DefaultPolarItemRenderer();
PolarPlot情节=新PolarPlot(数据集,radiusAxis,渲染器){ @覆盖
保护列表refreshAngleTicks(){
清单< NumberTick>蜱=新的ArrayList< NumberTick>();
INT,δ=(int)的this.getAngleTickUnit()的getSize();
对于(INT T = 0; T< 360; T + =三角形){
INT TP =(360 + 90 - T)的360%;
NumberTick打勾=新NumberTick(
Double.valueOf(吨),将String.valueOf(TP),
TextAnchor.CENTER,TextAnchor.CENTER,0.0);
ticks.add(打勾)
}
返回蜱;
}
};
plot.setBackgroundPaint(新颜色(0x00f0f0f0));
plot.setRadiusGridlinePaint(Color.gray);
plot.addCornerTextItem(R(θ)=θ; 0℃;θ<6π);
DefaultPolarItemRenderer仁=新DefaultPolarItemRenderer();
ren.setSeriesFilled(0,真);
ren.setSeriesFilled(1,真);
plot.setRenderer(仁);
JFreeChart的图表=新的JFreeChart(
标题,JFreeChart.DEFAULT_TITLE_FONT,情节,真正的);
chart.setBackgroundPaint(Color.white);
返回图;
} 公共静态无效的主要(字串[] args){
test2的演示=新TEST2(职称);
demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
demo.pack();
demo.setLocationRelativeTo(NULL);
demo.setVisible(真);
}
}
的<一个href=\"http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/renderer/DefaultPolarItemRenderer.html\"相对=nofollow> DefaultPolarItemRenderer
通常在的 PolarPlot
有方法 setSeriesFilled()
,它控制系列是否被填满。渲染器指定 的AlphaComposite .SRC_OVER
为50%的数值模式,所以重叠罢了,显得格外漂亮。
附录:要创建看到下面的图表中,这个启动<一个href=\"http://stackoverflow.com/questions/3458824/jfreechart-polarplot-mathematical-orientation/3467341#3467341\">example并降低数据集的域中的6π在 createDataset到2π()
:
的for(int T = 0; T&LT; = 1 * 360;吨++){...
然后进行填充系列createChart()
:
...
DefaultPolarItemRenderer渲染器=新DefaultPolarItemRenderer();
renderer.setSeriesFilled(0,真);
...
I am trying to color different region of a polar chart with different colors. e.g coloring the region between the angle 20 and 60 and between the radii 2 and 4. How can I do this? I was thinking of using a shape annotation and from there drawing an arc, but it seems there is no shape annotation for polar plots. Any ideas? Thank you
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;
public class test2 extends JFrame {
private static final String title = "Archimedes' Spiral";
public test2(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);
XYSeries ser = new XYSeries("test");
for (int t = 0; t <= 1 * 360; t++) {
series.add(90 - t, t);
}
for (int t = 0; t <= 1 * 120; t++) {
ser.add(90 - t, 40);
ser.add(90 - t, 120);
}
result.addSeries(series);
result.addSeries(ser);
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π");
DefaultPolarItemRenderer ren = new DefaultPolarItemRenderer();
ren.setSeriesFilled(0, true);
ren.setSeriesFilled(1, true);
plot.setRenderer(ren);
JFreeChart chart = new JFreeChart(
title, JFreeChart.DEFAULT_TITLE_FONT, plot, true);
chart.setBackgroundPaint(Color.white);
return chart;
}
public static void main(String[] args) {
test2 demo = new test2(title);
demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
demo.pack();
demo.setLocationRelativeTo(null);
demo.setVisible(true);
}
}
The DefaultPolarItemRenderer
typically used in a PolarPlot
has the method setSeriesFilled()
, which controls whether a series is filled. The renderer specifies the AlphaComposite.SRC_OVER
mode with a value of 50%, so overlapping fills look especially nice.
Addendum: To create the chart seen below, start with this example and reduce the data set's domain from 6π to 2π in createDataset()
:
for (int t = 0; t <= 1 * 360; t++) { ...
Then make the series filled in createChart()
:
...
DefaultPolarItemRenderer renderer = new DefaultPolarItemRenderer();
renderer.setSeriesFilled(0, true);
...
这篇关于JFreeChart的极坐标图形状标注的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!