2012-08-12 4 views
5

J'utilise JFreeChart pour dessiner un graphique. Le code estJFreeChart avec des points surlignés

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

et le fichier texte est le suivant:

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

Avec le code au-dessus du graphique est tracé. Le graphique est illustré ci-dessous. Comment puis-je montrer les points exacts pour ce que le graphique est dessiné, c'est-à-dire xy point doit présenter avec un cercle?

enter image description here

+0

Je suis étudiant universitaire. Je suis nouveau au JFree. Veuillez me suggérer – Daya

+0

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

+2

Veuillez ne pas utiliser un StringBuffer lorsque vous pouvez utiliser un StringBuilder. –

Répondre

6

ChartFactory.createXYAreaChart() utilise un XYAreaRenderer. Le parent AbstractRenderer a des méthodes pour modifier la visibilité et l'apparence des formes, comme indiqué here pour le XYLineAndShapeRenderer associé.

Addendum: Votre exemple complet appelle ChartFactory.createXYLineChart(), qui utilise un XYLineAndShapeRenderer en interne. L'image ci-dessous a permis d'ajouter ces lignes à createChart():

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

image

+0

J'ai jcommon.jar et jfreechart0.9.20.jar. Je suis confronté à un problème de compilation à renderer.setUseFillPaint (true); – Daya

+0

Current est jfreechart 1.0.14 et jcommon 1.0.17. – trashgod

+0

J'ai mis à jour mon code complet. J'ai besoin de comparer le graphique. S'il vous plaît me suggérer où je dois faire une modification. Je suis étudiant. Je suis nouveau à JFree. Pour mon projet académique, j'ai commencé à utiliser – 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

je suis nouveau au jfree. Je suis incapable de comprendre où changer le code. Je suis étudiante .. Alors s'il vous plaît donner une idée claire .. Je l'utilise pour mon projet – Daya

+0

Le graphique retourné par 'ChartFactory.createXYAreaChart()' n'utilise pas un 'LineAndShapeRenderer', qui est un' CategoryItemRenderer'. – trashgod

+0

chart.getPlot() doit renvoyer XYPlot. –