2D-Grafik JFreeChart mehrere Y-Achsen

TheBohne

Aktives Mitglied
Hallo,

Ich habe bei JFreeChart das Problem, dass die Werte sich nur nach der linken Y-Achse richten. Heißt ich habe 2 Graphen die jeweils eine eigene Einheit haben (Eigene Y-Achse). Jedoch orientieren sich alle Graphen nach der linken Y-Achse.
upload_2016-6-22_10-53-52.png

Hier der Code zu dem kleinen Beispiel:
Java:
package Test;

public class Test {

   public Test() {

     Diagramm diagramm = new Diagramm();

     diagramm.addWertObjekt(
         new WertObjekt(System.currentTimeMillis()/* Wert fuer y Achse */, "TestName",
             "TestVariable1" /*
                      * beide Namen ergeben zusammen einen
                      * eindeutigen Namen
                      */, "m1" /* Masseinheit */,
             1/* Wert auf Y-Achse */));
     diagramm.addWertObjekt(new WertObjekt(System.currentTimeMillis(), "TestName", "TestVariable2", "m2", 100));
   }

   public static void main(String[] args) {
     new Test();
   }
}

Java:
package Test;

import java.awt.Font;
import java.util.HashMap;

import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataItem;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public final class Diagramm extends JFrame {

   private HashMap<String, XYSeriesCollection> yAchsen = new HashMap<>();
   private HashMap<String, XYSeries> graphen = new HashMap<>();

   private XYPlot plot;

   public Diagramm() {

     clear();
     this.setVisible(true);
   }

   private void createSwingContent() {
     DateAxis zeitAchse = new DateAxis();
     this.plot.setDomainAxis(zeitAchse);

     JFreeChart chart = new JFreeChart(null, null, plot, false);

     plot.setNoDataMessage("Keine Daten vorhanden");
     plot.setNoDataMessageFont(new Font("SansSerif", Font.BOLD, 22));
     final ChartPanel chartPanel = new ChartPanel(chart);
     chartPanel.setMouseZoomable(true, false);
     chartPanel.setVisible(true);
     this.add(chartPanel);
     this.setVisible(true);
   }

   public void clear() {
     this.yAchsen = new HashMap<>();
     this.graphen = new HashMap<>();
     this.plot = new XYPlot();
     createSwingContent();
   }

   public synchronized void addWertObjekt(WertObjekt wertObjekt) {
     XYSeriesCollection yAchse = this.yAchsen.get(wertObjekt.getMasseinheit());
     if (yAchse == null) {
       yAchse = new XYSeriesCollection();
       XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
       NumberAxis numberAxis = new NumberAxis(wertObjekt.getMasseinheit());

       this.plot.setRangeAxis(this.yAchsen.size(), numberAxis);
       this.plot.setRenderer(this.yAchsen.size(), renderer);
       this.plot.setDataset(this.yAchsen.size(), yAchse);

       this.yAchsen.put(wertObjekt.getMasseinheit(), yAchse);

     }

     XYSeries graph = this.graphen.get(wertObjekt.getEindeutigerName());
     if (graph == null) {
       graph = new XYSeries(wertObjekt.getEindeutigerName());
       yAchse.addSeries(graph);
       this.graphen.put(wertObjekt.getEindeutigerName(), graph);

     }

     graph.add(new XYDataItem(wertObjekt.getZeitStempel().getTime(), wertObjekt.getWert()));
   }

}

Java:
package Test;

import java.text.SimpleDateFormat;
import java.util.Date;

public class WertObjekt {

   public static final String DATUMFORMAT = "yyyy.MM.dd_HH-mm-ss.SSS";

   protected String spsName;
   protected String variablenName;
   protected String masseinheit;
   protected double wert;
   protected Date zeitStempel;
   protected String formatiertesDatum;

   private String eindeutigerName;

   public WertObjekt(long zeitStempel, String spsName, String variablenName, String masseinheit, double wert) {
     this(new Date(zeitStempel), spsName, variablenName, masseinheit, wert);
   }

   public WertObjekt(Date zeitStempel, String spsName, String variablenName, String masseinheit, double wert) {
     this.zeitStempel = zeitStempel;
     this.spsName = spsName;
     this.variablenName = variablenName;
     this.eindeutigerName = this.spsName + "." + this.variablenName;
     this.masseinheit = masseinheit;
     this.wert = wert;
     this.formatiertesDatum = new SimpleDateFormat(DATUMFORMAT).format(zeitStempel);

   }

   public Date getZeitStempel() {
     return this.zeitStempel;
   }

   public String getSpsName() {
     return this.spsName;
   }

   public String getVariablenName() {
     return this.variablenName;
   }

   public String getMasseinheit() {
     return this.masseinheit;
   }

   public double getWert() {
     return this.wert;
   }

   public String getFormatiertesDatum() {
     return this.formatiertesDatum;
   }

   public String parseToString() {
     StringBuffer buffer = new StringBuffer();
     buffer.append(this.formatiertesDatum);
     buffer.append("|");
     buffer.append(this.spsName);
     buffer.append("|");
     buffer.append(this.variablenName);
     buffer.append("|");
     buffer.append(this.masseinheit);
     buffer.append("|");
     buffer.append(this.getWert());
     return buffer.toString();
   }

   public String getEindeutigerName() {
     return eindeutigerName;
   }

}

Wie schaffe ich es nun, dass jeder Graph sich auch nach seiner Y-Achse ausrichtet?

Danke schon mal für eure Hilfe.

Gruß Bohne
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich finde dein denglish und teilweise auch deine Variablenbezeichnung (XYSeriesCollection yAchse, dabei ist XYSeriesCollection ein dataset und keine Achse, XYSeries graph, dabei ist graph nach meinem Verständnis etwas "grafisches" und kein Objekt mit Daten) etwas verwirrend.
Wenn ich es recht überblicke, fehlt vermutlich nur ein
Java:
this.plot.mapDatasetToRangeAxis(this.yAchsen.size(), this.yAchsen.size())
am Ende des ersten if-Blockes deiner addWertObjekt-Methode.
 
Danke hat geklappt. Sollte den Code wirklich noch mal komplett auf englisch umschreiben.
Eventuell auch noch einmal über die Namen gedanken machen 😀
Trotzdem noch mal vielen Dank.
 

Neue Themen


Zurück
Oben