2009-09-07 8 views
5

Je souhaite créer un graphique à barres, mais les valeurs élevées extraordinaires doivent être raccourcies. Un exemple est cette image:Comment créer un graphique à barres avec JFreeChart, qui raccourcit les barres trop longues avec un indice visible?

shortened graph http://www.epa.gov/recovery/images/bar-chart.gif

J'espère qu'il est clair ce que je veux.

Ma question est: Comment puis-je faire cela avec JFreeChart. Si ce n'est pas possible avec JFreeChart, vous pouvez éventuellement recommander d'autres bibliothèques Java open-source pour produire une telle sortie.

Répondre

11

Vous pourriez le faire avec un CombinedDomainCategoryPlot ou CombinedDomainXYPlot. Définissez l'axe de la plage de la première parcelle à votre valeur de coupure, puis faites quelque chose de similaire avec la deuxième parcelle. Puis ajoutez-les à un complot combiné.

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartFrame; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.CategoryPlot; 
import org.jfree.chart.plot.CombinedDomainCategoryPlot; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.category.DefaultCategoryDataset; 

public class PlayChart { 

    public static void main(String[] args) { 


     DefaultCategoryDataset ds = new DefaultCategoryDataset(); 
     ds.addValue(100, "A", "A"); 
     ds.addValue(200, "A", "B"); 
     ds.addValue(400, "A", "C"); 
     ds.addValue(500, "A", "D"); 
     ds.addValue(2000, "A", "E"); 


     JFreeChart bc = ChartFactory.createBarChart("My Bar Chart", "Things", "Counts", ds, PlotOrientation.VERTICAL, true, false, false); 
     JFreeChart bcTop = ChartFactory.createBarChart("My Bar Chart", "Things", "Counts", ds, PlotOrientation.VERTICAL, true, false, false); 

     CombinedDomainCategoryPlot combinedPlot = new CombinedDomainCategoryPlot(); 
     CategoryPlot topPlot = bcTop.getCategoryPlot(); 
     NumberAxis topAxis = (NumberAxis) topPlot.getRangeAxis(); 
     topAxis.setLowerBound(1500); 
     topAxis.setUpperBound(2000); 

     combinedPlot.add(topPlot, 1); 
     CategoryPlot mainPlot = bc.getCategoryPlot(); 
     combinedPlot.add(mainPlot, 5); 

     NumberAxis mainAxis = (NumberAxis) mainPlot.getRangeAxis();; 
     mainAxis.setLowerBound(0); 
     mainAxis.setUpperBound(600); 

     JFreeChart combinedChart = new JFreeChart("Test", combinedPlot); 

     ChartFrame cf = new ChartFrame("Test", combinedChart); 
     cf.setSize(800, 600); 
     cf.setVisible(true); 

    } 

} 

Les tracés partageront le même axe X. Vous aurez besoin de jouer avec les moteurs de rendu pour définir les couleurs et les étiquettes.

lien mort ImageShack enlevé

+0

Grand, qui ressemble exactement comme souhaité, merci pour l'aide rapide. – Mnementh

+0

Je sais que c'était il y a longtemps, mais c'est une réponse incroyablement complète. –

0

Je ne suis pas sûr que vous pouvez le faire dans JFreeChart.

Une solution (qui n'est pas sympa) consiste à rendre le graphique à une image, puis à le manipuler (hacher, etc.) en tant qu'image, en utilisant RenderedImage, et non en JFreeChart. Malheureusement cela va être un peu pénible puisque vous voudrez probablement couper à un endroit particulier sur l'axe des ordonnées etc.

Questions connexes