无法更改极坐标图中的图例形状和字体

时间:2017-10-24 17:46:19

标签: java plot jfreechart

我正在尝试使用jfreechart极坐标图在java中创建天空图。 一切都很好。但是我无法更改各种系列图例标记及其大小。

以下是我的代码示例:

public class Skyplot {
       private JFrame plotFrame = null;

       public static void main (String[] args){
           Skyplot sp = new Skyplot();
           sp.display();
       }

       public Skyplot(){
       }

       public void display(){
           javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    plot(); 
                }
            });
       }

       private void plot(){
           // create and set up the window
           plotFrame = new JFrame("Visualizer");
           plotFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
           //Display the window.
           plotFrame.pack();
           plotFrame.setVisible(true);
           plotFrame.setLocation(500, 500);
           plotFrame.setSize(1200, 900);

           // set up the content pane
           Container C = plotFrame.getContentPane();

           Plotter pl = new Plotter();
           pl.setBorder(BorderFactory.createRaisedBevelBorder());
           pl.setBackground(Color.WHITE);

           C.setLayout(new GridLayout(1, 1));
           C.add(pl);  
       }


       private class Plotter extends JPanel {
           private static final long serialVersionUID = 1L;

           public Plotter(){ 
               XYDataset dataset = getXYDataset();

               final ChartPanel chartPanel = createChartPanel(dataset);
               this.add(chartPanel, BorderLayout.CENTER);
           }

           private ChartPanel createChartPanel(XYDataset dataset) {
               // Create chart
               JFreeChart chart = ChartFactory.createPolarChart("Skyplot", dataset, true, true, false);

               PolarPlot polPlot = (PolarPlot) chart.getPlot();
               polPlot.setRadiusMinorGridlinesVisible(false);
               polPlot.setBackgroundPaint(Color.WHITE);
               polPlot.setRadiusGridlinePaint(Color.DARK_GRAY);
               polPlot.setAngleGridlinePaint(Color.BLACK);

               DefaultPolarItemRenderer renderer = (DefaultPolarItemRenderer) polPlot.getRenderer();
               renderer.setBaseLegendShape(new Rectangle(15,15));
               Font legend_font = new Font("Verdana", Font.PLAIN, 24);
               renderer.setBaseLegendTextFont(legend_font);

               NumberAxis rangeAxis = (NumberAxis) polPlot.getAxis();
               rangeAxis.setTickUnit(new NumberTickUnit(10.0));
               rangeAxis.setMinorTickMarksVisible(false);
               rangeAxis.setRange(0.0, 90.0);
               rangeAxis.setInverted(true);


               return new ChartPanel(chart){
                   @Override
                   public Dimension getPreferredSize() {
                       double H = plotFrame.getHeight()*0.9;
                       double W = plotFrame.getWidth()*0.9;
                       return new Dimension((int)W, (int)H);
                   }
               };
           }

           private XYDataset getXYDataset() {
               XYSeriesCollection dataset = new XYSeriesCollection();

              XYSeries g01= new XYSeries("G01");
              series.add(35, 45);
              dataset.addSeries(g01);

              XYSeries g02= new XYSeries("G02");
              series.add(105, 73);
              dataset.addSeries(g01);

              XYSeries g03= new XYSeries("G03");
              series.add(264, 15);
              dataset.addSeries(g03);

              return dataset;
           }

       }

    }

知道为什么它不起作用? 我在渲染器上做错了吗? 任何帮助,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

缺失的部分似乎是告诉父母AbstractRenderer setShapesVisible()

renderer.setShapesVisible(true);
  

我想让所有形状的矩形和图例中的文字更大。

要协调图表和图例中的颜色和形状,请按照建议DrawingSupplier使用自定义here。具体细节取决于您的使用案例,但基本方法是覆盖DefaultDrawingSupplier方法getNextPaint()getNextShape(),以便它们返回您选择的颜色和形状。

要更大图例文字,请更新图表LegendTitle,如下图所示。

LegendTitle title = chart.getLegend();
title.setItemFont(new Font(Font.SERIF, Font.BOLD, 24));

image

经测试:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
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.title.LegendTitle;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Skyplot {

    private double[] position = null;
    private JFrame plotFrame = null;

    public static void main(String[] args) {
        Skyplot sp = new Skyplot();
        sp.display();
    }

    public Skyplot() {
    }

    public void display() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                plot();
            }
        });
    }

    private void plot() {
        // create and set up the window
        plotFrame = new JFrame("Visualizer");
        plotFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //Display the window.
        plotFrame.pack();
        plotFrame.setSize(800, 600);
        plotFrame.setLocationRelativeTo(null);
        plotFrame.setVisible(true);

        // set up the content pane
        Container C = plotFrame.getContentPane();

        Plotter pl = new Plotter();
        pl.setBorder(BorderFactory.createRaisedBevelBorder());
        pl.setBackground(Color.WHITE);

        C.setLayout(new GridLayout(1, 1));
        C.add(pl);
    }

    private class Plotter extends JPanel {

        private static final long serialVersionUID = 1L;

        public Plotter() {
            XYDataset dataset = getXYDataset();

            final ChartPanel chartPanel = createChartPanel(dataset);
            this.add(chartPanel, BorderLayout.CENTER);
        }

        private ChartPanel createChartPanel(XYDataset dataset) {
            // Create chart
            JFreeChart chart = ChartFactory.createPolarChart("Skyplot", dataset, true, true, false);
            LegendTitle title = chart.getLegend();
            title.setItemFont(new Font(Font.SERIF, Font.BOLD, 24));

            PolarPlot polPlot = (PolarPlot) chart.getPlot();
            polPlot.setRadiusMinorGridlinesVisible(false);
            polPlot.setBackgroundPaint(Color.WHITE);
            polPlot.setRadiusGridlinePaint(Color.DARK_GRAY);
            polPlot.setAngleGridlinePaint(Color.BLACK);

            DefaultPolarItemRenderer renderer = (DefaultPolarItemRenderer) polPlot.getRenderer();
            renderer.setBaseLegendShape(new Rectangle(15, 15));
            renderer.setShapesVisible(true);

            NumberAxis rangeAxis = (NumberAxis) polPlot.getAxis();
            rangeAxis.setTickUnit(new NumberTickUnit(10.0));
            rangeAxis.setMinorTickMarksVisible(false);
            rangeAxis.setRange(0.0, 90.0);
            rangeAxis.setInverted(true);

            return new ChartPanel(chart) {
                @Override
                public Dimension getPreferredSize() {
                    double H = plotFrame.getHeight() * 0.9;
                    double W = plotFrame.getWidth() * 0.9;
                    return new Dimension((int) W, (int) H);
                }
            };
        }

        private XYDataset getXYDataset() {
            XYSeriesCollection dataset = new XYSeriesCollection();

            XYSeries g01 = new XYSeries("G01");
            g01.add(35, 45);
            dataset.addSeries(g01);

            XYSeries g02 = new XYSeries("G02");
            g02.add(105, 73);
            dataset.addSeries(g02);

            XYSeries g03 = new XYSeries("G03");
            g03.add(264, 15);
            dataset.addSeries(g03);

            return dataset;
        }
    }
}

答案 1 :(得分:0)

我使用了上面的建议。 创建图表的方法现在看起来像这样:

private ChartPanel createChartPanel(XYDataset dataset) {
               // Create chart
               JFreeChart chart = ChartFactory.createPolarChart("Skyplot", dataset, true, true, false);

               PolarPlot polPlot = (PolarPlot) chart.getPlot();
               polPlot.setRadiusMinorGridlinesVisible(false);
               polPlot.setBackgroundPaint(Color.WHITE);
               polPlot.setRadiusGridlinePaint(Color.DARK_GRAY);
               polPlot.setAngleGridlinePaint(Color.BLACK);
               polPlot.setDrawingSupplier(new DrawingSupplier() {
                    @Override
                    public Paint getNextFillPaint() {
                        // TODO Auto-generated method stub
                        return null;
                    }

                    @Override
                    public Paint getNextOutlinePaint() {
                        // TODO Auto-generated method stub
                        return null;
                    }

                    @Override
                    public Stroke getNextOutlineStroke() {
                        // TODO Auto-generated method stub
                        return null;
                    }

                    @Override
                    public Paint getNextPaint() {
                        Random rand = new Random();
                        int r = rand.nextInt(255);
                        int g = rand.nextInt(255);
                        int b = rand.nextInt(255);

                        return new Color(r,g,b);
                    }

                    @Override
                    public Shape getNextShape() {
                        return ShapeUtilities.createDiamond(5f);
                    }


                    @Override
                    public Stroke getNextStroke() {
                        // TODO Auto-generated method stub
                        return null;
                    }

                });

               NumberAxis rangeAxis = (NumberAxis) polPlot.getAxis();
               rangeAxis.setTickUnit(new NumberTickUnit(10.0));
               rangeAxis.setMinorTickMarksVisible(false);
               rangeAxis.setRange(0.0, 90.0);
               rangeAxis.setInverted(true);

               LegendTitle legend = chart.getLegend();
               Font legend_font = new Font("Verdana", Font.BOLD, 18);
               legend.setItemFont(legend_font);

               return new ChartPanel(chart){
                   @Override
                   public Dimension getPreferredSize() {
                       double H = plotFrame.getHeight()*0.9;
                       double W = plotFrame.getWidth()*0.9;
                       return new Dimension((int)W, (int)H);
                   }
               };
           }

使用DrawingSupplier的结果如下: resulting skyplot