JFreeChart-XYBarChart为每个系列显示单独的条 [英] JFreeChart - XYBarChart Show Separate Bars for Each Series

查看:259
本文介绍了JFreeChart-XYBarChart为每个系列显示单独的条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用JFreeChart创建XYBarChart,并向其中添加多个序列.当前,对于给定的x值和该系列中不同的Y值,它们全部堆叠在一起.

I'm creating a XYBarChart using JFreeChart and adding multiple series to it. Currently for a given x-value and different Y-values from the series, all of them are getting stacked on top of each other.

是否可以将每个系列显示为给定x值的不同条形?

Would be possible to show each series as a different bar for a given x-value?

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

Edit: I'm posting the relevant section of my code that is used to create the chart for your reference.

请注意,我不能使用 CategoryDataset ,因为它不提供域轴上的缩放功能.这是我实施的基本要求.

Note that I cannot use CategoryDataset because this does not provide zooming capabilities on the Domain Axis. This is an essential requirement for my implementation.

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

这是屏幕截图

推荐答案

EDIT 使用ClusteredXYBarRenderer代替XYBarRenderer.这样可以绘制相邻的条(而不是StackedBars)并提供缩放功能.

EDIT Use ClusteredXYBarRenderer instead of XYBarRenderer. This draws adjacent bars (instead of StackedBars) and provides zooming capabilities.

ChartFactory中没有工厂方法可以创建ClusteredXYBarRenderer.

There is no factory method in ChartFactory to create ClusteredXYBarRenderer.

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

Use the below method to create the Bar Chart.

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.这将产生相邻的条,而不是堆积的条.

XYBarRenderer that you are using is correct. But I think you should use CategoryDataSet instead of XYSeriesCollection. Try using below dataset instead of XYSeriesCollection. This will produce adjacent bars instead of stacked bars.

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

这篇关于JFreeChart-XYBarChart为每个系列显示单独的条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆