【问题标题】:JFreeChart - XYBarChart Show Separate Bars for Each SeriesJFreeChart - XYBarChart 为每个系列显示单独的条形图
【发布时间】:2012-07-07 04:17:45
【问题描述】:

我正在使用 JFreeChart 创建一个 XYBarChart 并向其中添加多个系列。目前,对于给定的 x 值和系列中的不同 Y 值,所有这些都堆叠在一起。

对于给定的 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());
        }
    }
});

Here's a screenshot 它目前的显示方式

【问题讨论】:

  • 您的代码使用的是 XYBarRenderer,而不是 StackedXYBarRenderer?您能否发布创建条形图的代码?。
  • @sperumal:刚刚更新了我的帖子。这有帮助吗?

标签: java jfreechart bar-chart


【解决方案1】:

编辑使用ClusteredXYBarRenderer 而不是XYBarRenderer。这会绘制相邻的条形图(而不是 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;
}

【讨论】:

  • 使用 CategoryDataset 的问题是它不提供域轴的缩放功能。这是我实现的一个非常重要的要求:(
  • 听起来棒极了。我将尝试将这种技术用于时间序列条形图。
  • 要使用 CategoryDataset 我必须更改 Plot 实现,你能告诉我如何更改它吗?
  • 使用添加了多个 XYSeries 的 DefaultTableXYDataset 作为 createClusteredChart 方法的数据集参数,而不是不起作用的 CategoryDataset。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多