JFreeChart X-Achse Werte skalieren, begrenzen, zoomen

Chefselber

Mitglied
Hallo Gemeinde,

nach langer Suche komme ich einfach nicht weiter,
ich habe einen Graphen angelegt mit mehreren Y-Achsen.
Ich lese die Daten aus einer Datenbank aus.
Aber wie kann ich die x-Achse skalieren?

Anhand, der vielen Datenpunkte kann er sie hier nicht darstellen.
Wie kann ich es realisieren nur jede halbe Stunde oder ganze Stunde eine Anzeige zu visualisieren? (01:00:00, 02:00:00 usw.)


Das hier sind Werte eines ganzen Tages, im 20s Takt.

2023-05-15 20_38_10-Window.png
folgender Code:
Java:
public class Graphen extends ApplicationFrame 
{

    final JDBCCategoryDataset dataset;
 
    public Graphen(final String title)
    {
        super(title);

        final String chartTitel = "PV Daten";
        dataset = Verbinden_thread_Datenbank.DatenAbfrage();

        

        final JFreeChart chart = ChartFactory.createLineChart("PV Daten", "Uhrzeit","Batteriespannung", dataset,PlotOrientation.VERTICAL,true,true,false);
        
              

        final CategoryPlot plot = chart.getCategoryPlot();
  
        // 2.Achse
        final NumberAxis axis2 = new NumberAxis("Temperatur Kessel");
        plot.setRangeAxis(1,axis2);
        plot.setDataset(1,Verbinden_thread_Datenbank.DatenAbfrage2());
        plot.mapDatasetToRangeAxis(1, 1);

        // 3. Achse

        final NumberAxis axis3 = new NumberAxis("Batteriekapazität");
        plot.setRangeAxis(2,axis3);
        plot.setDataset(2,Verbinden_thread_Datenbank.DatenAbfrage3());
        plot.mapDatasetToRangeAxis(2, 2);




    

    //    final CategoryAxis axis = (CategoryAxis) plot.getDomainAxis();
    //  axis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);

    
     //   Stroke stroke = new BasicStroke(3.0f);     
        
  ///      renderer.setSeriesOutlineStroke(1, stroke);


      //   axis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_90);
    //     axis.setMaximumCategoryLabelLines(5);
   //     axis.setPlot(plot);
        final ChartPanel panel = new ChartPanel(chart);
    
        panel.setPreferredSize(new java.awt.Dimension(1200,500));
        panel.setRangeZoomable(true);
        panel.setDomainZoomable(true);
      
   setContentPane(panel);
/*

CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(
    CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 2.0));
*/
}


}


Vielleicht weiss jemand Rat.

Danke.
 
Ticks gibts in der CategoryAxis Klasse nicht.

Ich wäre hier auf der Spur:
Wenn das überhaupt zielführend ist?

Java:
 final NumberAxis axis0 = new NumberAxis("Uhrzeit");
         axis0.setRange(range);
        plot.setRangeAxis(0, axis0);

aber wie könnte ich der Range eine Zeit von 00:00:00 - 23:59:00 hinzufügen?
Will ja einen double Wert...
 
Die Skalierung mit der X-Achse funktioniert jetzt.
Benutze jetzt ResultSet und nicht mehr JDBCCategoryPlot.
Jetzt funktioniert es wenigstens mit der richtigen X-Achsen Bezeichnung,
aber leider nicht mehr eine 2. y-Achse für die Temperatur zum darstellen! 🙁
"plot.setDataset" will ja einen XYDataset als Übergabe und ich habe keine Ahnung wie ich den aus der TimeseriesCollection (TSC) bekomme.

In der TimeSeriesCollection stecken für die 2. TimeSeries genau dieselben Uhrzeitwerte.
2023-05-25 21_47_39-Window.png
Hier die Graphen Klasse

Java:
 public Graphen(final String title)
    {
        super(title);

        final String chartTitel = "PV Daten";
        resultSet = Verbinden_thread_Datenbank.DatenAbfrage3();
        TimeSeriesCollection TSC = new TimeSeriesCollection();
 ////    XYSeriesCollection XYSC = new XYSeriesCollection();
      
        TimeSeries s = Batterieleistung(resultSet);
        TSC.addSeries(s);
        TemperaturKesselResultSet = Verbinden_thread_Datenbank.DatenAbfrage2();
        
        TimeSeries s2 = TemperaturKessel(resultSet);
        TSC.addSeries(s2);
//// 2. TimeSeries???? mit gleicher X-Achse


        final JFreeChart chart = ChartFactory.createTimeSeriesChart("PV Daten", "Uhrzeit","Batterieleistung", TSC);   ///new TimeSeriesCollection(s)

        SimpleDateFormat f = new SimpleDateFormat("HH:mm:ss");
        f.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

        XYPlot plot = (XYPlot) chart.getPlot();
        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
      
        final NumberAxis axis3 = new NumberAxis("Temperatur Kessel");
        plot.setRangeAxis(2,axis3);
     // plot.setDataset(2,s2);
        r.setDefaultShapesVisible(true);
        DateAxis domain = (DateAxis) plot.getDomainAxis();
        domain.setDateFormatOverride(f);
        domain.setVerticalTickLabels(true);

Hier eine Methode für die TimeSeries:

Code:
private TimeSeries Batterieleistung(ResultSet resultSet1)
{
     TimeSeries series = new TimeSeries("Batterieleistung");
     SimpleDateFormat f = new SimpleDateFormat("HH:mm:ss");
    
    
     try {
           int Spalten = resultSet1.getMetaData().getColumnCount();
           System.out.println("Spalten: " + Spalten);
      
           for(int i=1 ; i<=Spalten; i++)   {     
                System.out.print( resultSet1.getMetaData().getColumnLabel(i));
      
           }
           System.out.println();
           System.out.println("-------------------------------------------------------------");
          
           String[] daten= new String[2];
          
           String doppelt=null;

           while (resultSet1.next())
           {
               for(int j=1 ; j<=Spalten; j++)
               {
                   daten[j-1] = resultSet1.getString(j);
                   System.out.print( resultSet1.getString(j) + " ");
                  
               }
           System.out.println(" ");
           if (daten[0].equals(doppelt))
           {
                 System.out.println("DOPPELT");
            
           }
           else
           {
               series.add(new Second(f.parse(daten[0])), Double.parseDouble(daten[1]));
           }
           doppelt = daten[0];
          
           }
     } catch (Exception e) {
          e.printStackTrace();
    }
     return series;
}

Hier die Methode zum Abholen der Datenbankdaten:

Code:
public static ResultSet DatenAbfrage2()
{

     String Befehl = "SELECT uhrzeit, temperaturkessel FROM pvdaten WHERE (uhrzeit BETWEEN '00:00:00' AND '23:55:00') AND          datum='20230524'";     // datum BETWEEN '20230508 AND '20230509'";

     ResultSet rs = null;
     Statement stat;
     try {
          stat = con.createStatement();
          rs = stat.executeQuery(Befehl);
        
     } catch (Exception e) {
      
     }
 
     return rs;
}
 

Zurück
Oben