2017-10-24 9 views
1

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

     } 

    } 

任意のアイデアは、なぜそれが動作しないのでしょうか? レンダラーに何か問題がありますか? ご協力いただければ幸いです。ありがとうございました。

+0

してください[MCVE]、代表的なデータを含む含めるための[編集]あなたの質問それは、あなたが説明する問題を示しています。 – trashgod

+0

@trashgod私は完全な例を追加しました。 – Dan

答えて

1

欠けている部分が親に伝えられているようです。AbstractRenderersetShapesVisible()

renderer.setShapesVisible(true); 

私はすべての形の長方形と大きな伝説内のテキストを作りたいです。

hereが示唆されているように、カスタムDrawingSupplierを使用し、チャート凡例の色や形状を調整します。正確な詳細はユースケースによって異なりますが、基本的な方法は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; 
     } 
    } 
} 
+0

追加のコード行は何もしていないようです。 私は前と同じ結果を得ていました。私が望むのは、すべての図形を長方形にし、凡例の中のテキストを大きくすることです。 – Dan

+0

私は上記を詳しく説明しました。 – trashgod

+0

ありがとうございます。試してみます。 – Dan

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

関連する問題