2009-09-07 12 views
5

Quiero crear un gráfico de barras, pero los valores altos extraordinarios deben acortarse. Un ejemplo es esta imagen:¿Cómo puedo crear un gráfico de barras con JFreeChart, que acorta las barras demasiado largas con una pista visible?

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

espero que sea claro lo que quiero.

Mi pregunta es: ¿Cómo puedo hacer esto con JFreeChart. Si no es posible con JFreeChart, posiblemente pueda recomendar bibliotecas Java de código abierto alternativas para producir dicho resultado.

Respuesta

11

Puede hacerlo con un CombinedDomainCategoryPlot o CombinedDomainXYPlot. Establezca el eje del rango del primer gráfico en su valor de corte y luego haga algo similar con el segundo gráfico. Luego, agréguelos a una trama combinada.

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

    } 

} 

Los trazados compartirán el mismo eje X. Tendrá que jugar con los renderizadores para establecer colores y etiquetas.

eliminado enlace ImageShack muertos

+0

Grande, que se ve exactamente como se desee, gracias por la ayuda rápida. – Mnementh

+0

Sé que fue hace mucho tiempo, pero esta es una respuesta increíblemente completa. –

0

No estoy seguro de que pueda hacer eso en JFreeChart.

Una solución (que no es buena) es representar el gráfico en una imagen y luego manipularlo (cortarlo, etc.) como una imagen, utilizando RenderedImage, y no como un JFreeChart. Desafortunadamente eso va a ser un poco molesto ya que probablemente quiera cortar en un lugar en particular en el eje y, etc.

Cuestiones relacionadas