2009-09-07 9 views
5

Ich möchte ein Balkendiagramm erstellen, aber außergewöhnlich hohe Werte sollten verkürzt werden. Ein Beispiel dafür ist das Bild:Wie kann ich mit JFreeChart ein Balkendiagramm erstellen, das zu lange Balken mit einem sichtbaren Hinweis verkürzt?

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

Ich hoffe, es ist klar, was ich will. Meine Frage ist: Wie kann ich das mit JFreeChart tun. Wenn dies mit JFreeChart nicht möglich ist, können Sie möglicherweise alternative Open-Source-Java-Bibliotheken zur Erstellung einer solchen Ausgabe empfehlen.

Antwort

11

Sie könnten es mit einem CombinedDomainCategoryPlot oder CombinedDomainXYPlot tun. Stellen Sie die Bereichsachse des ersten Plots auf Ihren Cut-Off-Wert ein und machen Sie dann etwas ähnliches mit dem zweiten Plot. Dann fügen Sie sie zu einer kombinierten Handlung hinzu.

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

    } 

} 

Die Diagramme teilen sich die gleiche X-Achse. Sie müssen mit den Renderern spielen, um Farben und Beschriftungen festzulegen.

entfernt tot Images Link

+0

Große, sieht das genau so, wie gewünscht, danke für die schnelle Hilfe. – Mnementh

+0

Ich weiß, es war lange her, aber das ist eine unglaublich gründliche Antwort. –

0

Ich bin mir nicht sicher, dass Sie das in JFreeChart tun können.

Eine Lösung (die nicht nett ist) ist, das Diagramm zu einem Bild zu rendern und es dann zu manipulieren (hacken es etc.) als ein Bild mit RenderedImage, und nicht als ein JFreeChart. Leider wird das ein wenig schmerzhaft sein, da Sie wahrscheinlich an einer bestimmten Stelle auf der Y-Achse usw. hacken möchten.