简体   繁体   English

如何用 jfree polar plot 改变点的形状?

[英]how to change dot shape with jfree polar plot?

I would like to know what are the methods to use to change dots polarplot size and shape.我想知道改变点极坐标图大小和形状的方法是什么。 And also if it's possible to disable dots for this type of plot.而且如果可以禁用这种类型的 plot 的点。

here is the code plotting polar of two series with default dots.这是使用默认点绘制两个系列的极坐标的代码。

Thank you谢谢

package jfreechart;

import java.awt.Color;
import javax.swing.JFrame;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PolarPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class JFreeChartPolarChartExample extends JFrame {

   private static final long serialVersionUID = 1L;

   public JFreeChartPolarChartExample(String applicationTitle) {
       super(applicationTitle);
       XYSeriesCollection  dataSet = new XYSeriesCollection();
       
       XYSeries series1 = createRandomData("Series 1", 500);
       XYSeries series2 = createRandomData("Series 2", 60);
  
       dataSet.addSeries(series1);
       dataSet.addSeries(series2);
   
      PolarPlot pp = new PolarPlot();
      pp.setAngleGridlinePaint (Color.BLACK);
       
       JFreeChart polarChart = ChartFactory.createPolarChart(null, dataSet, true, true, false);

       // Adding chart into a chart panel
       ChartPanel chartPanel = new ChartPanel(polarChart);
  
       // settind default size
       chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
     
       setContentPane(chartPanel);
   
   }

   private static XYSeries createRandomData(final String name, final double maxvalue ) {
       final XYSeries series = new XYSeries(name);
       for (double az = 0.0; az < 360.0; az =az+10*Math.random()) 
       {
           final double value = maxvalue*(0.8 +0.2*Math.random());
           series.add(az, value);
       }
       return series;
   }

   public static void main(String[] args) {
       JFreeChartPolarChartExample chart = new JFreeChartPolarChartExample(null);
       chart.pack();
       chart.setVisible(true);
   }
}

with it, default dots are square.有了它,默认点是正方形的。

Yes, the DefaultPolarItemRenderer uses a 6 x 6 square DEFAULT_SHAPE :是的, DefaultPolarItemRenderer使用 6 x 6 方形DEFAULT_SHAPE

public static final Shape DEFAULT_SHAPE =
   new Rectangle2D.Double(-3.0, -3.0, 6.0, 6.0);

how to [make] them round and smaller?如何[使]它们变圆变小?

As suggested here , use a custom DrawingSupplier .正如此处所建议的那样,使用自定义DrawingSupplier In the example below, the default Shape for all series is set to a circle of radius 2.5.在下面的示例中,所有系列的默认Shape都设置为半径为 2.5 的圆。 ShapeUtils , shown in a comment, may also be useful:评论中显示的ShapeUtils也可能有用:

DefaultPolarItemRenderer renderer = (DefaultPolarItemRenderer) polarPlot.getRenderer();
renderer.setAutoPopulateSeriesShape(false);
renderer.setDefaultShape(new Ellipse2D.Double(-2, -2, 5, 5));
//renderer.setDefaultShape(ShapeUtils.createDiamond(3));

how to disabled them?如何禁用它们?

Invoke setShapesVisible() as warranted:根据需要调用setShapesVisible()

renderer.setShapesVisible(true);

In addition,此外,

  • You can zoom the chart radially as shown here .您可以按此处所示径向缩放图表。

  • Instead of making a new PolarPlot() , get the one instantiated by the chart's factory.不是制作一个new PolarPlot() ,而是获取由图表工厂实例化的那个。

  • To establish the chart's initial size, override getPreferredSize() , as suggested here .要确定图表的初始大小,请按照此处的建议覆盖getPreferredSize()

  • Use (nearly) equal width and height to maximize the plot in the enclosing container.使用(几乎)相等的宽度和高度来最大化封闭容器中的 plot。

  • Construct and manipulate Swing GUI objects only on the event dispatch thread .仅在事件调度线程上构造和操作 Swing GUI 对象。

图片

As tested:经过测试:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.PolarPlot;
import org.jfree.chart.renderer.DefaultPolarItemRenderer;
import org.jfree.chart.util.ShapeUtils;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/q/71632468/230513
 * @see https://stackoverflow.com/a/46931762/230513
 */
public class Skyplot {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Skyplot()::plot);
    }

    private void plot() {
        JFrame plotFrame = new JFrame("PolarPlot");
        plotFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        plotFrame.add(new Plotter());
        plotFrame.pack();
        plotFrame.setLocationRelativeTo(null);
        plotFrame.setVisible(true);
    }

    private static final class Plotter extends JPanel {

        public Plotter() {
            super(new GridLayout());
            this.add(createChartPanel(getXYDataset()));
        }

        private ChartPanel createChartPanel(XYDataset dataset) {
            JFreeChart chart = ChartFactory.createPolarChart(
                "Random Data", dataset, true, true, false);

            PolarPlot polarPlot = (PolarPlot) chart.getPlot();
            polarPlot.setAngleGridlinePaint (Color.BLACK);
            polarPlot.setRadiusGridlinePaint(Color.BLACK);

            DefaultPolarItemRenderer renderer = (DefaultPolarItemRenderer) polarPlot.getRenderer();
            renderer.setAutoPopulateSeriesShape(false);
            renderer.setDefaultShape(new Ellipse2D.Double(-2, -2, 5, 5));
            //renderer.setDefaultShape(ShapeUtils.createDiamond(3));
            renderer.setShapesVisible(true);

            NumberAxis rangeAxis = (NumberAxis) polarPlot.getAxis();
            rangeAxis.setTickUnit(new NumberTickUnit(100.0));

            return new ChartPanel(chart) {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(500, 500);
                }
            };
        }

        private XYDataset getXYDataset() {
            XYSeriesCollection dataset = new XYSeriesCollection();
            dataset.addSeries(createRandomData("Series 1", 500));
            dataset.addSeries(createRandomData("Series 2", 60));
            return dataset;
        }

        private static XYSeries createRandomData(final String name, final double maxvalue) {
            final XYSeries series = new XYSeries(name);
            for (double az = 0.0; az < 360.0; az = az + 10 * Math.random()) {
                final double value = maxvalue * (0.8 + 0.2 * Math.random());
                series.add(az, value);
            }
            return series;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM