2010-09-13 11 views
8

Sto riscontrando un problema con un grafico sovrapposto JFreeChart. Sto usando JFreeChart 1.0.13. Quello che sto cercando di fare sembra che fosse più facile da fare nelle versioni precedenti di JFreeChart?Guida con overlay JFreeChart

Il grafico mostra un grafico a linee e un grafico a barre. L'intervallo di dati tracciato dal grafico a linee per l'asse Y è compreso nell'intervallo 0-100 e l'asse per il grafico a barre è compreso nell'intervallo 0-5.

Individualmente, quando dispongo ogni grafico e lo dipingo, hanno un bell'aspetto. Ecco un esempio:

Bar Chart alt text Grafico a linee alt text

Ma quando li sovrappongo, il grafico a barre viene ridimensionato a guardare incredibilmente inutile ... presumibilmente perché la bilancia dei due insiemi di dati sono così diverse.

Esempio: alt text

Quello che voglio è quello di dividere i dati di serie per le due serie di dati, e visualizzare l'intervallo 0-100 per il grafico linea sull'asse Y mano sinistra e di avere il grafico a barre visualizzato a grandezza intera come nel mio primo esempio qui sotto, ma avere la scala 0-5 visualizzata sul lato dell'asse Y destro del grafico.

Per creare il grafico, sto creando prima il grafico a barre utilizzando un XYSeriesCollection, aggiungendo i dati e creare la trama ...

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

Poi ho creare il grafico a linee in modo simile e aggiungere il seconda serie per la trama ...

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

il mio sospetto è che in qualche modo ogni grafico ha bisogno di essere il proprio appezzamento e combinate insieme. Qualcuno può aiutare? Quello che sto andando qui è qualcosa del genere: alt text

Tranne che non voglio che il grafico a barre sia un'immagine di sfondo. L'asse X dovrebbe essere lo stesso e l'asse Y dovrebbe essere sul lato destro con la scala appropriata che consente di mostrare il grafico a grandezza intera.

Qualsiasi/tutte le risposte sono apprezzati ...

risposta

6

Vedo che stai aggiungendo un secondo set di dati e renderer alla trama, ma il gioco è costringendoli a usare lo stesso asse di gamma. Invece, dare alla trama un nuovo NumberAxis per l'intervallo del secondo set di dati.

Come parte a parte, non trascurare l'esempio relativo all'asse nel JFreeChart Demo e non sottovalutare il valore di JFreeChart Developer Guide.

+0

Non affiliato con http://www.jfree.org/jfreechart/; solo un cliente soddisfatto e qualche volta contributore. – trashgod

+1

Grazie per la spinta nella giusta direzione. Aggiunta: valore finaleAxis yAxis = new NumberAxis ("Percent Time at Temperature"); \t \t plot.setRangeAxis (1, yAxis); plot.mapDatasetToRangeAxis (0, 1); MapDataSetToRange era la chiave ... – Griff