2013-01-10 2 views
1

Je voudrais dessiner un symbole Dirac (ou Kronecker si vous préférez), je veux dire dessiner des valeurs discrètes sur mon graphique avec une barre verticale comme ça (sans les étiquettes):Comment dessiner un dirac avec JFreeChart

Good example Je pourrais le faire avec un BarChart mais ce n'est pas très beau ... Y at-il une bonne façon de le faire?

EDIT: je votre méthode et j'ai fait que:

enter image description here

Mais comme vous pouvez voir des barres ont une couleur différente, peut-être du dégradé de couleurs? Savez-vous comment rendre les barres tout rouge?

Voici le code:

public class XYDiscreteBarChart { 

    private final Color CHART_BACKGROUND_COLOR = new JPanel().getBackground(); 
    private final Color CHART_FOREGROUND_COLOR = new JLabel().getForeground(); 
    private final Color CROSSHAIR_COLOR = Color.BLUE; 
    private final String title; // Titre du graphique 
    private final String xTitle; // Titre de l'axe des abscisses 
    private final String yTitle; // Titre de l'axe des ordonnées 
    private final XYDataset dataset; // Les données affichées dans le graphique 
    private final boolean isLegendVisible; // Affichage de la légende 
    private final boolean isTooltipsVisible; // Affichge des tooltips 
    private final boolean isUrlVisible; // Affichage des urls 
    private final boolean isGridXVisible; // Affichage de la grille verticale 
    private final boolean isGridYVisible; // Affichage de la grille horizontale 
    private JFreeChart chart; // Le graphique 
    private XYPlot plot; // La zone de dessin des courbes 

    public XYDiscreteBarChart(String title, String xAxisLabel, String yAxisLabel, XYDataset dataset, boolean legend, 
     boolean tooltip, boolean url) { 
     this.title = title; 
     this.xTitle = xAxisLabel; 
     this.yTitle = yAxisLabel; 
     this.isLegendVisible = legend; 
     this.isTooltipsVisible = tooltip; 
     this.isUrlVisible = url; 
     this.dataset = dataset; 
     this.isGridXVisible = true; 
     this.isGridYVisible = true; 

     createChart(); 
     setChartStyle(); 
    } 

    private void createChart() { 
     this.chart = ChartFactory.createXYBarChart(
      this.title, 
      this.xTitle, 
      false, 
      this.yTitle, 
      formatDataset(), 
      PlotOrientation.VERTICAL, 
      this.isLegendVisible, 
      this.isTooltipsVisible, 
      this.isUrlVisible); 
     this.plot = (XYPlot) this.chart.getPlot(); 
    } 

    private void setChartStyle() { 
     this.plot.setBackgroundAlpha((float) 0.0); 
     this.plot.setDomainCrosshairVisible(this.isGridXVisible); 
     this.plot.setDomainCrosshairLockedOnData(true); 
     this.plot.setRangeCrosshairVisible(this.isGridYVisible); 
     this.plot.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT); 
     this.plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0)); 

     this.chart.setBackgroundPaint(this.CHART_BACKGROUND_COLOR); 
     this.plot.getDomainAxis(0).setAxisLinePaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getDomainAxis(0).setLabelPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getDomainAxis(0).setTickLabelPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getDomainAxis(0).setTickMarkPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getRangeAxis(0).setAxisLinePaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getRangeAxis(0).setLabelPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getRangeAxis(0).setTickLabelPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.getRangeAxis(0).setTickMarkPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.setBackgroundPaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.setDomainGridlinePaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.setRangeGridlinePaint(this.CHART_FOREGROUND_COLOR); 
     this.plot.setDomainCrosshairPaint(this.CROSSHAIR_COLOR); 
     this.plot.setRangeCrosshairPaint(this.CROSSHAIR_COLOR); 

     XYBarRenderer renderer = (XYBarRenderer) this.plot.getRenderer(); 
     renderer.setBarPainter(createBarPainter()); 
     renderer.setSeriesPaint(0, Color.RED); 
    } 

    private IntervalXYDataset formatDataset() { 
     final XYSeries series = new XYSeries("Filter Coefficients"); 

     for (int i = 0; i < this.dataset.getItemCount(0); i++) { 
      series.add(this.dataset.getX(0, i), this.dataset.getY(0, i)); 
     } 

     final XYSeriesCollection dataset = new XYSeriesCollection(series); 
     return dataset; 
    } 

    private GradientXYBarPainter createBarPainter() { 
     return new GradientXYBarPainter() { 

      private static final long serialVersionUID = -1997018568242678921L; 

      @Override 
      public void paintBar(Graphics2D g2, XYBarRenderer renderer, int row, int column, 
       RectangularShape bar, RectangleEdge base) { 
       double wCoeff = 0.25; 
       double hCoeff = 1.0; 
       double newWidth, deltaW, deltaX; 

       Rectangle2D rect = bar.getFrame(); 
       newWidth = rect.getWidth() * wCoeff; 
       deltaW = rect.getWidth() - newWidth; 
       deltaX = deltaW/2; 
       rect.setRect(rect.getX() + deltaX, rect.getY(), newWidth, rect.getHeight() * hCoeff); 
       bar.setFrame(rect); 
       super.paintBar(g2, renderer, row, column, bar, base); 
      } 
     }; 
    } 
} 

Répondre

1

En supposant que vous voulez dire les flèches, XYBarRenderer semble un point de départ probable. Vous pouvez remplacer son XYBarPainter par une implémentation personnalisée, pour example.

+0

Ok merci, ça marche :) mais pensez-vous qu'il soit possible de dessiner un cercle ou peut-être un triangle en haut de la flèche? – AwaX

+0

J'ai édité ma question pour vous montrer un autre problème – AwaX

+0

Je chercherais à étendre 'RectangularShape' ou à utiliser [' XYShapeAnnotation'] (http://stackoverflow.com/a/11751239/230513) – trashgod