2010-09-13 8 views
8

Ich habe ein Problem mit einem überlagerten JFreeChart-Diagramm. Ich benutze JFreeChart 1.0.13. Was ich versuche, scheint in früheren Versionen von JFreeChart einfacher zu sein?Hilfe mit JFreeChart-Overlay

Die Grafik zeigt ein Liniendiagramm und ein Balkendiagramm. Der vom Liniendiagramm für die Y-Achse gezeichnete Datenbereich liegt im Bereich 0-100 und die Achse für das Balkendiagramm im Bereich 0-5.

Individuell, wenn ich jedes Diagramm auslege und es male, sehen sie gut aus. Hier ein Beispiel:

Balkendiagramm alt text Liniendiagramm alt text

Aber wenn ich sie überlagern, wird das Balkendiagramm abgespeckte zu unglaublich nutzlos aussehen ... vermutlich weil die Skalen der beiden Datensätze so unterschiedlich sind.

Beispiel: alt text

Was will ich wirklich ist, die Reihendaten für die beiden Datensätze zu spalten, und zeigen Sie die 0-100 Bereich für das Liniendiagramm auf der linken Y-Achse und das Balkendiagramm zu haben Vollgröße wie in meinem ersten Beispiel unten, aber die Skala 0-5 wird auf der rechten Seite der Y-Achse des Diagramms angezeigt.

die Grafik zu erstellen, ich bin mit dem Balkendiagramm zunächst die Schaffung eines XYSeriesCollection verwenden, um die Daten hinzufügen und das Grundstück ... und

XYSeriesCollection histogramDataset= new XYSeriesCollection(); 
XYSeries xy= new XYSeries("Temp"); 
xy.add(100,0.0); 
xy.add(101,0.3769791404875597); 
histogramDataset.addSeries(xy); 
... 
final NumberAxis xAxis = new NumberAxis("Temperature C"); 
xAxis.setAutoRangeIncludesZero(false); 
final ValueAxis yAxis = new NumberAxis("Percent Time above Temperature"); 
final XYItemRenderer renderer = new XYBarRenderer(); 

final XYPlot plot = new XYPlot((XYDataset) histogramDataset, xAxis, yAxis, renderer); 

Dann erstelle ich das Liniendiagramm in ähnlicher Weise und fügen Sie die zweite Reihe auf dem Grundstück ...

final XYSeries xy = new XYSeries("First"); 
final XYDataset xySeriesData = new XYSeriesCollection(); 
final XYItemRenderer xyLineRenderer = new XYLineAndShapeRenderer(); 
xyLineRenderer.setSeriesShape(0, new Line2D.Double(0.0, 0.0, 0.0, 0.0)); 
xyLineRenderer.setSeriesStroke(0, new BasicStroke(4.5f)); 
xy.add(100,100.0); 
xy.add(101,100.0); 
xyseriesData.add(xy); 
plot.setDataset(1, xySeriesData); 
plot.setRenderer(1, xyLineRenderer); 
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); 

Mein Verdacht ist, dass irgendwie jeder graph eine eigene Handlung sein muss und miteinander kombiniert werden. Kann jemand helfen? Was ich hier mache, ist etwas in der Art: alt text

Außer ich möchte nicht das Balkendiagramm ein Hintergrundbild sein. Die X-Achse sollte die gleiche sein, und die Y-Achse sollte auf der rechten Seite mit der richtigen Skalierung liegen, damit der Graph in voller Größe angezeigt werden kann.

Jede/alle Antworten sind willkommen ...

Antwort

6

Ich sehe Sie einen zweiten Datensatz und Renderer auf Ihrem Grundstück sind hinzufügen, aber Sie zwingen sie die gleiche Reichweite Achse zu verwenden. Geben Sie stattdessen dem Diagramm einen neuen NumberAxis für den Bereich des zweiten Datensatzes.

Nebenbei, übersehen Sie nicht die Achse im Beispiel in der JFreeChart Demo, und unterschätzen Sie nicht den Wert der JFreeChart Developer Guide.

+0

Nicht in Verbindung mit http://www.jfree.org/jfreechart/; nur ein zufriedener Kunde und irgendwann Mitwirkender. – trashgod

+1

Danke für den Push in die richtige Richtung. Hinzufügen: final ValueAxis yAxis = new NumberAxis ("Prozent Zeit bei Temperatur"); \t \t plot.setRangeAxis (1, yAxis); plot.mapDatasetToRangeAxis (0, 1); MapDataSetToRange war der Schlüssel ... – Griff