2012-08-12 11 views
5

Sto utilizzando JFreeChart per disegnare un grafico. Il codice èJFreeChart con punti evidenziati

package com.daya; 

import java.awt.Color; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

public class Two extends ApplicationFrame { 

    public Two(final String title) { 
     super(title); 
     final XYDataset dataset = createDataset(); 
     final JFreeChart chart = createChart(dataset); 
     final ChartPanel chartPanel = new ChartPanel(chart); 
     chartPanel.setPreferredSize(new java.awt.Dimension(1200, 1100)); 
     setContentPane(chartPanel); 
    } 

    private XYDataset createDataset() { 
     final XYSeries series1 = new XYSeries("SLMM"); 
     final XYSeries series2 = new XYSeries("FSPM"); 
     XYSeries series = new XYSeries("Power Comparision"); 
     final XYSeriesCollection dataset = new XYSeriesCollection(); 
     try { 
      FileInputStream fstream = new FileInputStream("d:\\devs\\Result.txt"); 
      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 
      StringBuffer buffer = new StringBuffer(); 
      while ((strLine = br.readLine()) != null) { 
       buffer.append(strLine); 
      } 
      String message = buffer.toString(); 
      message = message.replaceAll(" ", ""); 
      String[] splitMessage = message.split("&&&"); 
      for (int i = 0; i < splitMessage.length; i++) { 
       double x = 0.0, y = 0.0; 
       String algType = "direct"; 
       String[] insideSplit = splitMessage[i].split("\\|\\|"); 
       if (insideSplit[0].equalsIgnoreCase("isStraightAlg:false")) { 
        algType = "indirect"; 
       } 
       for (int j = 1; j < insideSplit.length; j++) { 
        String[] valueSplit = insideSplit[j].split("\\:"); 
        if (valueSplit[0].equalsIgnoreCase("Transactions")) { 
         x = Double.parseDouble(valueSplit[1]); 
        } else { 
         y = Double.parseDouble(valueSplit[1]); 
        } 
        //System.out.println(valueSplit[1]); 
       } 

       if (!algType.equalsIgnoreCase("direct")) { 
        System.out.println("X :" + x + " Y:" + y); 
        series1.add(x, y); 
       } else { 
        System.out.println("X :" + x + " Y:" + y); 
        series2.add(x, y); 
       } 
      } 


      dataset.addSeries(series1); 
      dataset.addSeries(series2); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return dataset; 
    } 

    private JFreeChart createChart(final XYDataset dataset) { 
     final JFreeChart chart = ChartFactory.createXYLineChart(
      "Power Comparison", 
      "Transaction", 
      "Energy", 
      dataset, 
      PlotOrientation.VERTICAL, 
      true, 
      true, 
      false); 
     chart.setBackgroundPaint(Color.white); 
     final XYPlot plot1 = chart.getXYPlot(); 
     plot1.setBackgroundPaint(Color.lightGray); 
     plot1.setDomainGridlinePaint(Color.white); 
     plot1.setRangeGridlinePaint(Color.white); 

     final XYPlot plot2 = chart.getXYPlot(); 
     plot2.setBackgroundPaint(Color.lightGray); 
     plot2.setDomainGridlinePaint(Color.white); 
     plot2.setRangeGridlinePaint(Color.white); 

     return chart; 
    } 

    public static void main(final String[] args) { 
     final Two demo = new Two("Multi Line Chart"); 
     demo.pack(); 
     RefineryUtilities.centerFrameOnScreen(demo); 
     demo.setVisible(true); 
    } 
} 

e il file di testo è:

isStraightAlg: false || Transazioni: 500 || Energia: 74267 & & & isStraightAlg: true || Transazioni: 500 || Energia: 55984 & & & isStraightAlg: false || Transazioni: 1000 || Energia: 169735 & & & isStraightAlg: true || Transazioni: 1000 || Energia: 162520 & & & isStraightAlg: false || Transazioni: 1500 || Energia: 333668 & & & isStraightAlg: true || Transazioni: 1500 || Energia: 313766 & & & isStraightAlg: false || Transazioni: 2000 || Energia: 494159 & & & isStraightAlg: true || Transazioni: 2000 || Energia: 481627 & & & isStraightAlg: false || Transazioni: 2500 || Energia: 594839 & & & isStraightAlg: true || Transazioni: 2500 || Energia: 594839 & & & isStraightAlg: false || Transazioni: 3000 || Energia: 847096 & & & isStraightAlg: true || Transazioni: 3000 || Energia: 842402 & & &

Con il codice sopra il grafico viene disegnato. Il grafico è mostrato sotto. Come posso mostrare i punti esatti per ciò che viene disegnato il grafico, che il punto selezionato xy deve presentare con il cerchio?

enter image description here

+0

Io sono studente universitario. Sono nuovo di JFree. Per favore suggeriscimi – Daya

+0

+1 per [sscce] (http://sscce.org/). – trashgod

+2

Si prega di non utilizzare un StringBuffer quando è possibile utilizzare un oggetto StringBuilder. –

risposta

6

ChartFactory.createXYAreaChart() utilizza un XYAreaRenderer. Il genitore AbstractRenderer ha metodi per modificare la visibilità e l'aspetto delle forme, come mostrato here per il relativo XYLineAndShapeRenderer.

Addendum: l'esempio completo richiama ChartFactory.createXYLineChart(), che utilizza internamente un XYLineAndShapeRenderer. L'immagine qui sotto il risultato di aggiungere queste righe a createChart():

XYLineAndShapeRenderer renderer = 
    (XYLineAndShapeRenderer) plot1.getRenderer(); 
renderer.setBaseShapesVisible(true); 

image

+0

ho jcommon.jar e jfreechart0.9.20.jar. sto affrontando un problema di compilazione su renderer.setUseFillPaint (true); – Daya

+0

La corrente è jfreechart 1.0.14 e jcommon 1.0.17. – trashgod

+0

Ho aggiornato il mio codice completo. Ho bisogno di confrontare il grafico. Per favore suggeriscimi dove devo fare la modifica. Sono uno studente. Sono nuovo di JFree. Per il mio progetto accademico ho iniziato a utilizzare – Daya

2
plot1.setRangeGridlinePaint(Color.white); // your existing code 
java.awt.geom.Ellipse2D.Double shape = new java.awt.geom.Ellipse2D.Double(-2.0, -2.0, 4.0, 4.0); 
plot1.getRenderer().setBaseShape(shape); 
// or maybe plot1.getRenderer().setSeriesShape(0, shape); 
+0

sono nuovo alla jfree. non riesco a capire dove cambiare il codice. Sono uno studente universitario .. Quindi, per favore, dai un'idea chiara .. Lo sto usando per il mio progetto – Daya

+0

Il grafico restituito da 'ChartFactory.createXYAreaChart()' non usa un 'LineAndShapeRenderer', che è un' CategoryItemRenderer'. – trashgod

+0

chart.getPlot() dovrebbe restituire XYPlot. –