2016-07-24 5 views
0

Wie die Liniendiagramm Start von Null zu machen und im letzten Bereich enden JFreeChart

ich ein Liniendiagramm wie diese produziert haben. Auch wenn es keine Null-Daten für die blaue Linie und auch die rote Linie hat nur den Wert bis 100. Wie stelle ich die blaue Linie bei Null und rot zu starten, bis 200 so beenden:

enter image description here

Meine Daten in Text-Datei (outputAvgGen.txt) sind:

11752.58,HC 
11819.65,HC 
11941.75,HC 
12398.45,HC 
12401.06,HC 
12531.09,HC 
12634.33,HC 
12748.83,HC 
12787.36,HC 
12799.44,HC 
    . 
    . 
    . 
30137.15,P3 
31919.46,P3 
32323.8,P3  
    . 
    . 
    . 
and so on until 200 data 

Dies ist mein Code:

public class Graph2 extends JFrame{ 
public Graph2(){ 
    setTitle("P3 Performance Analysis"); 
    JPanel chartPanel = createChartPanel(); 
    add(chartPanel, BorderLayout.CENTER); 

    setSize(640, 480); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
} 
public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Graph2().setVisible(true); 
     } 
    }); 
} 
private JPanel createChartPanel() { 
    // creates a line chart object 
    // returns the chart panel 
    String chartTitle = "Average Fitness against No. of Generations"; 
    String xAxisLabel = "No. of Generations"; 
    String yAxisLabel = "Average Fitness"; 

    XYDataset dataset = createDataset(); 

    JFreeChart chart = ChartFactory.createXYLineChart(chartTitle, 
      xAxisLabel, yAxisLabel, dataset); 

    XYPlot plot = chart.getXYPlot(); 
    NumberAxis yAxis = (NumberAxis) plot.getRangeAxis(); 
    yAxis.setAutoRangeIncludesZero(true); 

    return new ChartPanel(chart); 
} 

private XYDataset createDataset() { 
    ArrayList<PlotData2> dataList = readData(); 

    XYSeriesCollection dataset = new XYSeriesCollection(); 
    XYSeries series1 = new XYSeries("Hill Climber"); 
    XYSeries series2 = new XYSeries("P3"); 

    for (int i = 0; i < dataList.size(); i++){ 

     if (dataList.get(i).getAlgo().equals("HC")){ 
      series1.add(i, dataList.get(i).getAvg()); 
      System.out.println("HC i=" + i); 
     } 
     else if (dataList.get(i).getAlgo().equals("P3")){ 
      series2.add(i, dataList.get(i).getAvg()); 
      System.out.println("P3 i=" + i); 
     } 

    } 

    /* 
    for (int i = 0; i < dataList.size(); i++){ 
     if (dataList.get(i).getAlgo().equals("HC")){ 
      System.out.println("i = " + i); 
      series1.add(i, dataList.get(i).getAvg()); 
     } 

    } 

    for (int j = 0; j < dataList.size(); j++){ 
     if (dataList.get(j).getAlgo().equals("P3")){ 
      System.out.println("j = " + j); 
      series2.add(j, dataList.get(j).getAvg()); 
     } 
    }*/ 


    /* 
    series1.add(1.0, 2.0); 
    series1.add(2.0, 3.0); 
    series1.add(3.0, 2.5); 
    series1.add(3.5, 2.8); 
    series1.add(4.2, 6.0); 

    series2.add(2.0, 1.0); 
    series2.add(2.5, 2.4); 
    series2.add(3.2, 1.2); 
    series2.add(3.9, 2.8); 
    series2.add(4.6, 3.0); */ 

    dataset.addSeries(series1); 
    dataset.addSeries(series2); 

    return dataset; 

} 

public static ArrayList<PlotData2> readData(){ 
    ArrayList<PlotData2> dataList = new ArrayList<PlotData2>(); 

    try { 
     BufferedReader in = new BufferedReader(new FileReader("outputAvgGen.txt")); 

     String str; 
     while ((str = in.readLine())!= null) { 
      String[] data = str.split(","); 
      double avg = Double.parseDouble(data[0]); 
      String algo = data[1]; 

      // int gen = Integer.parseInt(data[2]); 

      dataList.add(new PlotData2(algo,avg)); 
     } 
     in.close(); 
    } catch (IOException ex) { 
     System.err.println("Error: Can't open the file for reading."); 
    } 


    return dataList; 
    } 

} 

Eigentlich sind meine ursprünglichen Daten berechnet wird i n Paare von HC und P3 in einem Text-Datei wie folgt aus:

15426.35,HC 
38903.93,P3 
13777.49,HC 
34480.21,P3 
15199.38,HC 
38559.36,P3 
13399.15,HC 
32931.49,P3 
    . 
    . 
    and so on.. 

aber ich sortiert es die Grafik zu machen aufsteigend wird aufgetragen, aber wenn es sortiert plotten nicht die Paare nach.

Kann jemand bitte mit dem Code mindestens helfen, es bei null anzufangen und bei maximaler Strecke für beide Linien zu enden, um es gleichzeitig aussehen zu lassen. Vielen Dank.

+0

Bearbeiten Sie Ihre Frage ein [MCVE] und Beispieldaten enthalten, die dem aktuellen Ansatz zeigt. – trashgod

Antwort

0

Das Hauptproblem mit Ihrem Code ist, dass Sie die X-Werte für beide Serien gleichzeitig erhöhen. Sie müssen das separat machen. Außerdem verwenden Sie hardcodierte Zeichenfolgen in Ihrer createDataset-Methode. diesen Ansatz Versuchen Sie stattdessen:

public static HashMap<String, List<Double>> readData() { 
    HashMap<String, List<Double>> dataList = new HashMap<String, List<Double>>(); 
    try { 
     BufferedReader in = new BufferedReader(new FileReader("outputAvgGen.txt")); 
     String str; 
     while ((str = in.readLine()) != null) { 
      String[] data = str.split(","); 
      String algo = data[1]; 
      if (dataList.get(algo) == null) { 
       dataList.put(algo, new ArrayList<Double>()); 
      } 
      dataList.get(algo).add(Double.parseDouble(data[0])); 
     } 
     in.close(); 
    } 
    catch (IOException ex) { 
     System.err.println("Error: Can't open the file for reading."); 
    } 
    return dataList 
} 
private XYDataset createDataset() { 
    HashMap<String, List<Double>> dataList = readData(); 
    XYSeriesCollection dataset = new XYSeriesCollection(); 
    Set<String> keys = dataList.keySet(); 
    for (String key : keys) { 
     XYSeries series = new XYSeries(key); 
     List<Double> numbers = dataList.get(key); 
     for (int i = 0; i < numbers.size() - 1; i++) { 
      series.add(i, numbers.get(i), false); 
     } 
     series.add(numbers.size() - 1, numbers.get(numbers.size() - 1), true); 
     dataset.addSeries(series); 
    } 
    return dataset; 
} 
Verwandte Themen