2012-08-12 13 views
5

Używam JFreeChart do rysowania wykresu. Kod jestJFreeChart z podświetlonymi punktami

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

a plik tekstowy jest:

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

Z powyższego kodu wykres jest rysowany. Wykres pokazano poniżej. Jak mogę wyświetlić dokładne punkty dla wykresu, który został narysowany, tj. Zaznaczony jako jeden z okręgów?

enter image description here

+0

Jestem studentem akademicki. Jestem nowy w JFree. Proszę zasugerować mi – Daya

+0

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

+2

Proszę nie używać StringBuffer, jeśli można użyć StringBuilder. –

Odpowiedz

6

ChartFactory.createXYAreaChart() wykorzystuje XYAreaRenderer. Macierz AbstractRenderer ma sposoby zmiany widoczności i wyglądu kształtów, jak pokazano here dla powiązanego XYLineAndShapeRenderer.

Dodatek: Twój pełny przykład wywołuje ChartFactory.createXYLineChart(), który wewnętrznie używa XYLineAndShapeRenderer. Poniższy obraz będący wynikiem dodawania te linie do createChart():

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

image

+0

Mam jcommon.jar i jfreechart0.9.20.jar. Mam do czynienia z problemem kompilacji w renderer.setUseFillPaint (true); – Daya

+0

Obecny jest jfreechart 1.0.14 i jowialny 1.0.17. – trashgod

+0

Zaktualizowałem mój pełny kod. Muszę porównać wykres. Proszę zasugeruj mi, gdzie muszę dokonać modyfikacji. Jestem studentem. Jestem nowy w JFree. Do mojego projektu akademickiego zacząłem używać – 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

Jestem nowy w jfree. nie jestem w stanie zrozumieć, gdzie zmienić kod. Jestem studentem .. Więc proszę dać jasny obraz .. Używam go dla mojego projektu – Daya

+0

wykres zwracany przez 'ChartFactory.createXYAreaChart()' nie używa 'LineAndShapeRenderer', która jest' CategoryItemRenderer'. – trashgod

+0

chart.getPlot() powinien zwrócić XYPlot. –