2012-08-12 21 views
5

Estoy usando JFreeChart para dibujar un gráfico. El código esJFreeChart con puntos resaltados

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

y el archivo de texto es:

isStraightAlg: false || Transacciones: 500 || Energía: 74267 & & & isStraightAlg: true || Transacciones: 500 || Energía: 55984 & & & isStraightAlg: false || Transacciones: 1000 || Energía: 169735 & & & isStraightAlg: true || Transacciones: 1000 || Energía: 162520 & & & isStraightAlg: false || Transacciones: 1500 || Energía: 333668 & & & isStraightAlg: true || Transacciones: 1500 || Energía: 313766 & & & isStraightAlg: false || Transacciones: 2000 || Energía: 494159 & & & isStraightAlg: true || Transacciones: 2000 || Energía: 481627 & & & isStraightAlg: false || Transacciones: 2500 || Energía: 594839 & & & isStraightAlg: true || Transacciones: 2500 || Energía: 594839 & & & isStraightAlg: false || Transacciones: 3000 || Energía: 847096 & & & isStraightAlg: true || Transacciones: 3000 || Energía: 842402 & & &

Con el código anterior se dibuja el gráfico. El gráfico se muestra a continuación. ¿Cómo puedo mostrar los puntos exactos de lo que se dibuja el gráfico, es decir, el xy punto seleccionado debe mostrarse con un círculo?

enter image description here

+0

soy estudiante académico. Soy nuevo en el JFree. Por favor sugiérame – Daya

+0

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

+2

No use un StringBuffer cuando puede usar un StringBuilder. –

Respuesta

6

ChartFactory.createXYAreaChart() utiliza un XYAreaRenderer. El elemento primario AbstractRenderer tiene métodos para cambiar la visibilidad y la apariencia de las formas, como se muestra en here para el XYLineAndShapeRenderer relacionado.

Adición: Su ejemplo completo invoca ChartFactory.createXYLineChart(), que utiliza un XYLineAndShapeRenderer internamente. La imagen de abajo como resultado de la adición de estas líneas a createChart():

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

image

+0

tengo jcommon.jar y jfreechart0.9.20.jar. Estoy enfrentando un problema de compilación en renderer.setUseFillPaint (verdadero); – Daya

+0

La corriente es jfreechart 1.0.14 y jcommon 1.0.17. – trashgod

+0

He actualizado mi código completo. Necesito comparar el gráfico. Por favor sugiérame dónde tengo que hacer la modificación. Soy estudiante. Soy nuevo en JFree. Para mi proyecto académico, he comenzado a usar – 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

soy nuevo en jfree. No puedo entender dónde cambiar el código. Soy estudiante universitario. Por favor, den una idea clara. Lo estoy usando para mi proyecto – Daya

+0

El gráfico devuelto por 'ChartFactory.createXYAreaChart()' no usa 'LineAndShapeRenderer', que es' CategoryItemRenderer'. – trashgod

+0

chart.getPlot() debería devolver XYPlot. –