2009-09-07 12 views
5

Voglio creare un grafico a barre, ma i valori alti straordinari dovrebbero essere abbreviati. Un esempio è questa immagine:Come posso creare un grafico a barre con JFreeChart, che accorcia le barre troppo lunghe con un suggerimento visibile?

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

Spero sia chiaro quello che voglio.

La mia domanda è: come posso fare questo con JFreeChart. Se non è possibile con JFreeChart, è possibile consigliare librerie Java open-source alternative per produrre tale output.

risposta

11

Si potrebbe farlo con un CombinedDomainCategoryPlot o CombinedDomainXYPlot. Imposta l'asse del raggio del primo grafico sul valore di taglio e poi fai qualcosa di simile con il secondo grafico. Quindi aggiungili a una trama combinata.

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

    } 

} 

I grafici condivideranno lo stesso asse X. Avrai bisogno di giocare con i renderer per impostare colori ed etichette.

rimosso collegamento ImageShack morti

+0

Grande, che appare esattamente come voleva, grazie per l'aiuto veloce. – Mnementh

+0

So che è stato tanto tempo fa, ma questa è una risposta incredibilmente completa. –

0

Non sono sicuro che sia possibile farlo in JFreeChart.

Una soluzione (che non è piacevole) consiste nel rendere il grafico su un'immagine e quindi manipolarlo (tagliarlo in su ecc.) Come un'immagine, utilizzando RenderedImage e non come JFreeChart. Purtroppo che sta per essere un po 'di dolore in quanto si sarebbe probabilmente desidera tagliare in un determinato posto sulla asse y ecc

Problemi correlati