JFreechart 极坐标图形状注释 [英] JFreechart Polar Chart shape annotation

查看:29
本文介绍了JFreechart 极坐标图形状注释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用不同的颜色为极坐标图的不同区域着色.例如,为角度 20 和 60 之间以及半径 2 和 4 之间的区域着色.我怎样才能做到这一点?我正在考虑使用形状注释并从那里绘制一条弧线,但似乎极坐标图没有形状注释.有任何想法吗?谢谢

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

推荐答案

DefaultPolarItemRenderer 通常用于 PolarPlot 具有方法 setSeriesFilled(),该方法控制是否填充系列.渲染器指定 AlphaComposite.SRC_OVER 模式,值为 50%,因此重叠填充看起来特别好.

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.

附录:要创建下面的图表,请从这个示例开始并在 createDataset() 中将数据集的域从 6π 减少到 2π:

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++) { ...

然后将系列填入createChart():

...
DefaultPolarItemRenderer renderer = new DefaultPolarItemRenderer();
renderer.setSeriesFilled(0, true);
...

这篇关于JFreechart 极坐标图形状注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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