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 .
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); } }
Advertisement
Answer
with it, default dots are square.
Yes, the DefaultPolarItemRenderer
uses a 6 x 6 square 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
. In the example below, the default Shape
for all series is set to a circle of radius 2.5. ShapeUtils
, shown in a comment, may also be useful:
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:
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.To establish the chart’s initial size, override
getPreferredSize()
, as suggested here.Use (nearly) equal width and height to maximize the plot in the enclosing container.
Construct and manipulate Swing GUI objects only on the event dispatch thread.
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; } } }