2017-10-24 1 views
1

Ich versuche ein Himmelsdiagramm in Java zu erstellen, indem ich das jfreechart-Polar-Plot verwende. Alles funktioniert gut. Allerdings konnte ich die verschiedenen Serienlegenden-Marker und deren Größe nicht ändern. HierDie Form und Schriftart der Legende im Polarplot kann nicht geändert werden

ist ein Beispiel für meinen Code:

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

     } 

    } 

Jede Idee, warum es nicht funktionieren würde? Mache ich etwas falsch mit dem Renderer? Jede Hilfe wäre willkommen. Danke.

+0

Bitte [Bearbeiten] Ihre Frage ein [MCVE] enthält, einschließlich repräsentativen Daten , das zeigt das Problem, das du beschreibst. – trashgod

+0

@trashgod Ich habe das vollständige Beispiel hinzugefügt. – Dan

Antwort

1

Das fehlende Stück scheint dem Elternteil AbstractRenderer zu setShapesVisible() zu sagen.

renderer.setShapesVisible(true); 

Ich möchte innerhalb der Legende größer alle Formen Rechteck und den Text machen.

Um Farben und Formen in der Grafik und der Legende zu koordinieren, verwenden Sie eine benutzerdefinierte DrawingSupplier, wie here vorgeschlagen. Die genauen Details hängen von Ihrem Anwendungsfall ab, aber der grundlegende Ansatz wäre, die DefaultDrawingSupplier Methoden getNextPaint() und getNextShape() zu überschreiben, damit sie die von Ihnen gewählten Farben und Formen zurückgeben.

Um den Legendentext zu vergrößern, aktualisieren Sie die Tabelle LegendTitle, wie unten dargestellt.

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

image

Wie getestet:

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; 
     } 
    } 
} 
+0

Diese zusätzliche Codezeile scheint nichts zu tun. Ich bekam vorher die gleichen Ergebnisse. Was ich will, ist, alle Formen Rechteck und den Text in der Legende größer zu machen. – Dan

+0

Ich habe oben ausgearbeitet. – trashgod

+0

Danke. Ich werde es versuchen. – Dan

0

habe ich die Beratung von oben eingesetzt. Das Verfahren zum Erstellen des Diagramms sieht wie folgt nun:

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

Das Ergebnis der DrawingSupplier der Verwendung ist wie folgt: resulting skyplot

Verwandte Themen