2012-07-06 25 views
4

我使用JFreeChart创建了一个XYBarChart并向其中添加了多个系列。目前,对于给定的x值和来自系列的不同Y值,所有这些都是堆叠在一起。JFreeChart - XYBarChart为每个系列显示单独的酒吧

对于一个给定的x值,将每个系列显示为不同的条可能吗?

编辑:我发布了我的代码的相关部分,用于创建图表供您参考。

注意我不能使用CategoryDataset因为这不提供域坐标轴缩放功能。这是我实施的基本要求。

XYSeriesCollection intervalXYDataSet = new XYSeriesCollection(); 
int countPlotPoints = populateBandData(intervalXYDataSet, optionList); //optionList is a HashMap<Integer,ArrayList<Integer>> where key = seriesKey, and ArrayList<Integer> builds up the value for each series 

if (countPlotPoints == 0) { 
    print("No options selected.\n"); 
    JOptionPane.showMessageDialog(this, "No Plot Points Were Selected!", "Warning", JOptionPane.WARNING_MESSAGE); 
    return; 
} 

/** 
* Chart Creation Section 
*/ 
JFreeChart chart = ChartFactory.createXYBarChart(tabTitle, "Frequency Bands", false, "rxlev", intervalXYDataSet, PlotOrientation.VERTICAL, true, true, false); 
XYPlot plot = (XYPlot) chart.getPlot(); 
plot.getRangeAxis().setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 
plot.getDomainAxis().setAutoRange(true); 

//   
final XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); 
renderer.setDrawBarOutline(false); 
renderer.setShadowVisible(false); 
renderer.setMargin(0.2); 
renderer.setDefaultShadowsVisible(false); 

ChartPanel chartpanel = new ChartPanel(chart); 
chartpanel.setDefaultDirectoryForSaveAs(new File(lastAnalyzedPath)); 

JFrame frame = new JFrame(); 
frame.setTitle(plotTitle); 
frame.add(new JScrollPane(chartpanel)); 
frame.pack(); 
frame.setVisible(true); 

frame.addWindowListener(new java.awt.event.WindowAdapter() { 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent evt) { 
     try { 
      System.out.println(":: Clearning Memory ::"); 
      System.out.println("\tFree Memory (Before cleanup): "+Runtime.getRuntime().freeMemory()); 
      Component component = getComponent(0); 
      if(component instanceof ChartPanel){ 
       JFreeChart chart = ((ChartPanel) component).getChart(); 
       XYPlot plot = (XYPlot) chart.getPlot(); 
       plot  = null; 
       chart  = null; 
       component = null; 
      } 
     } finally { 
      System.runFinalization(); 
      System.gc(); 
      System.out.println("\tFree Memory (Post cleanup): "+Runtime.getRuntime().freeMemory()); 
     } 
    } 
}); 

它是如何当前出现

+0

是你的代码使用* XYBarRenderer *,而不是* StackedXYBarRenderer * ?.你可以请发布创建条形图的代码吗? – sperumal 2012-07-06 17:59:00

+0

@sperumal:刚更新了我的帖子。这有帮助吗? – Sujay 2012-07-06 18:09:19

回答

7

编辑使用ClusteredXYBarRenderer,而不是XYBarRendererHere's a screenshot。这会绘制相邻的条(而不是StackedBars)并提供缩放功能。

ChartFactory没有工厂方法创建ClusteredXYBarRenderer

使用以下方法创建条形图。

private static JFreeChart createClusteredChart(String title, String categoryAxisLabel, String valueAxisLabel, IntervalXYDataset dataset) { 

    NumberAxis domainAxis = new NumberAxis(categoryAxisLabel); 
    domainAxis.setAutoRangeIncludesZero(false); 

    ValueAxis valueAxis = new NumberAxis(valueAxisLabel); 

    XYBarRenderer renderer = new ClusteredXYBarRenderer(); 

    XYPlot plot = new XYPlot(dataset, domainAxis, valueAxis, renderer); 
    plot.setOrientation(PlotOrientation.VERTICAL); 

    JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, true); 

    return chart; 
} 

XYBarRenderer您正在使用是正确的。但我认为你应该使用CategoryDataSet而不是XYSeriesCollection。尝试使用下面的数据集而不是XYSeriesCollection。这将产生相邻的酒吧,而不是堆积酒吧。

private static CategoryDataset createDataset() { 
    String series1 = "First"; 
    String series2 = "Second"; 
    String series3 = "Third"; 

    String category1 = "Category 1"; 
    String category2 = "Category 2"; 
    String category3 = "Category 3"; 
    String category4 = "Category 4"; 
    String category5 = "Category 5"; 

    DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 

    dataset.addValue(1.0D, series1, category1); 
    dataset.addValue(4.0D, series1, category2); 
    dataset.addValue(3.0D, series1, category3); 
    dataset.addValue(5.0D, series1, category4); 
    dataset.addValue(5.0D, series1, category5); 

    dataset.addValue(5.0D, series2, category1); 
    dataset.addValue(7.0D, series2, category2); 
    dataset.addValue(6.0D, series2, category3); 
    dataset.addValue(8.0D, series2, category4); 
    dataset.addValue(4.0D, series2, category5); 

    dataset.addValue(4.0D, series3, category1); 
    dataset.addValue(3.0D, series3, category2); 
    dataset.addValue(2.0D, series3, category3); 
    dataset.addValue(3.0D, series3, category4); 
    dataset.addValue(6.0D, series3, category5); 

    return dataset; 
} 
+0

使用CategoryDataset的问题是它不提供域轴的缩放功能。这是我执行的一个非常重要的要求:( – Sujay 2012-07-06 19:25:57

+0

请参阅我的编辑 – sperumal 2012-07-06 20:35:49

+0

这工作就像一个魅力!感谢您的帮助 – Sujay 2012-07-06 21:02:29