2010-09-13 19 views
8

Je rencontre un problème avec un graphique superposé JFreeChart. J'utilise JFreeChart 1.0.13. Qu'est-ce que j'essaie de faire semble que c'était plus facile à faire dans les versions antérieures de JFreeChart?Aide sur l'incrustation JFreeChart

Le graphique montre un graphique linéaire et un graphique à barres. La plage de données tracée par le graphique linéaire de l'axe Y est comprise entre 0 et 100 et l'axe du graphique à barres est compris entre 0 et 5.

Individuellement, lorsque j'étale chaque graphique et le peins, ils ont fière allure. Voici un exemple:

Bar Chart alt text Graphique ligne alt text

Mais quand je les superposer, le graphique à barres se réduite à regarder incroyablement inutile ... probablement parce que les échelles des deux ensembles de données sont si différents.

Exemple: alt text

Ce que je veux vraiment est de diviser les données en série pour les deux ensembles de données, et afficher la gamme 0-100 pour le graphique en ligne sur l'axe côté Y gauche et d'avoir le diagramme à barres s'affiche en taille réelle comme dans mon premier exemple ci-dessous, mais affiche l'échelle 0-5 sur le côté droit de l'axe Y du graphique.

Pour créer le graphique, je suis d'abord créais le diagramme à barres en utilisant un XYSeriesCollection, en ajoutant les données et la création de l'intrigue ...

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

Puis-je créer le graphique en ligne d'une manière similaire et ajouter la deuxième série à l'intrigue ...

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

Je soupçonne que en quelque sorte chaque graphique doit être son propre terrain et combinés ensemble. Quelqu'un peut-il aider? Ce que je vais faire ici est quelque chose comme ceci: alt text

Sauf que je ne veux pas que l'histogramme soit une image de fond. L'axe X doit être le même, et l'axe Y doit être sur le côté droit avec l'échelle appropriée qui permet au graphique d'être affiché en taille réelle.

/toutes les réponses sont appréciées ...

Répondre

6

Je vois que vous ajoutez un deuxième ensemble de données et à votre parcelle renderer, mais vous les forçant à utiliser le même axe de gamme. Au lieu de cela, donnez à l'intrigue un nouveau NumberAxis pour la plage du deuxième ensemble de données. En outre, ne négligez pas l'exemple lié à l'axe dans le JFreeChart Demo, et ne pas sous-estimer la valeur de JFreeChart Developer Guide.

+0

Non affilié à http://www.jfree.org/jfreechart/; juste un client satisfait et parfois un contributeur. – trashgod

+1

Merci pour la poussée dans la bonne direction. Ajout: final ValueAxis yAxis = new NumberAxis ("Pourcentage de temps à la température"); \t \t plot.setRangeAxis (1, yAxis); plot.mapDatasetToRangeAxis (0, 1); MapDataSetToRange était la clé ... – Griff