JFreeChart 使用一 直方图之简单柱状图

来源:互联网 发布:彩票平台源码 编辑:程序博客网 时间:2022/08/17 13:13

JFreeChart创建直方条形图包括了:堆栈式直方条形图、时序数据的条形直方图、柱状图等。

本文先对直方图进行介绍。了解简单柱状图的创建过程。

1、概述

直方条形图常常被用来显示表列数据。如下表,为一个简单的两行、三列数据。


 

 

Colnums1

Colnums2

Colnums3

Row1

1.0

5.0

3.0

Row2

2.0

3.0

2.0

JFreeChart里,这个表格数据封装为一个dataset数据对象,每列标题为一个种类,每行为一个系列。每行标题为一个系列名称(或者系列关键值)。直方条形图展现的数据图如下图:

 

 

在这个图表的实例中,我们可以看到JFreeChart将每列数据(即一个种类)组合在一起。而且对每行数据(即每个系列)使用各种颜色高亮显示。图表的图例将颜色和系列的名称/关键值对应起来。

2、创建一个DataSet

创建直方条形图的第一步就是创建一个合适的dataset数据集。JFreeChart为直方条形图提供的访问表列数据的一系列方法,必须符合接口CategoryDataset定义。

JFreeChart中提供了一个便利的实现CategoryDataset接口的类为DefaultCategoryDataset。下面显示我们如何使用这个类来封装数据。代码如下:

 

复制代码
private CategoryDataset createDataset() {       DefaultCategoryDataset dataset = new DefaultCategoryDataset();       dataset.addValue(1.0, "Row 1", "Column 1");       dataset.addValue(5.0, "Row 1", "Column 2");       dataset.addValue(3.0, "Row 1", "Column 3");       dataset.addValue(2.0, "Row 2", "Column 1");       dataset.addValue(3.0, "Row 2", "Column 2");       dataset.addValue(2.0, "Row 2", "Column 3");       return dataset;   }
复制代码


 

3、创建一个Chart图表

 

接下来就是要创建一个JFreeChart的实例,使用上面提供的dataset数据集画一个直方条形图。简单的,我们使用ChartFactory类来创建这个JFreeChart实例。代码如下:

 

复制代码
private JFreeChart createChart(CategoryDataset dataset) {       JFreeChart chart = ChartFactory.createBarChart("BarChartDemo", // chart title                   "Category", // domain axis label                   "Value", // range axis label                   dataset, // data                   PlotOrientation.VERTICAL, // 图标方向                   true, // 是否显示legend                   true, // 是否显示tooltips                   false // 是否显示URLs           );       return chart;   }
复制代码

 

4、理解ChartFactory类

在上面的实例代码中,我们使用ChartFactory类来组装一个JFreeChart实例来显示一个直方条形图。下面我们更仔细的看一下该类是如何工作的,因此我们可以看到直方条形图更多底层的框架结构。理解底层结构的关键是能定制图表的外观。下面是ChartFactory方法createBarChart()方法部分代码:

复制代码
1.CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);   2.ValueAxis valueAxis = new NumberAxis(valueAxisLabel);   3.BarRenderer renderer = new BarRenderer();   ……   4.CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);   5.plot.setOrientation(orientation);   6.JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
复制代码

以下就是代码所做的工作。

l我们的直方条形图有两个轴,一个轴显示datasetCategoryAxis)的种类,另一个是显示带有数据(NumberAxis)刻度的数据轴。上面代码中代码12行建立了这两个轴,轴的标签是createBarChart()方法传入的。

l第三行,创建了一个BarRender——该类为每一个数据项目画直方图。该render处理大部分画图工作,我们后续代码也会看到可以使用另一个类型的render替换现有的render,来改变图表的整个外观。

lDatasetaxesrender都由CategorryPlot来管理,CategorryPlot系统组件之间的大部分交互工作。当我们定制一个图表时,我们经常需要先获得整个图表plotrendererdataset的引用。在代码的第四行,创建了一个plot,然后其他组件对它进行赋值。

l最后,在JFreeChart实例中,这个plot用指定的标题被封装。JFreeChart类提供了比较高层次的访问图表。但在这个plot曾思图表就大部分被定义出来了(Plot管理很多对象,例如axesdatasetrenderer)。

图表的内部结构基本上是由上面的知识理论组成。在后续的章节,我们会逐渐学习更多的定制我们图表的方法。

5、简单柱形图实例

柱形图实例代码:

复制代码
 public class BarChartExample       {                                       /**            * 创建BarChart            * @author 马建新(mervin)            * @return 生成Chart图片的地址            */    public String createBarChart()           {               String filePath = "D:\\testJfreeChart.jpg";               try        {                   //设置Chart主题                   setChartTheme();                         DefaultCategoryDataset dataset = getBarDataSet();                   JFreeChart    chart = ChartFactory.createBarChart3D("水果产量图-复合数据", "水果",                               "产量", dataset, PlotOrientation.VERTICAL, true, true, false);                                            ChartUtilities.saveChartAsJPEG(new File(filePath), chart, 400, 300);               } catch (IOException e)               {                   e.printStackTrace();               }               return filePath;           }                                                    /**            * 设置ChartFactory主题,可解决乱码问题            */    private void setChartTheme()           {               // 创建主题样式               StandardChartTheme standardChartTheme = new StandardChartTheme("CN");               // 设置标题字体               standardChartTheme.setExtraLargeFont(new Font("宋书", Font.BOLD, 20));               // 设置图例的字体               standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 15));               // 设置轴向的字体               standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 15));               // 应用主题样式               ChartFactory.setChartTheme(standardChartTheme);           }              /**            * 获得复杂(组合)BarChart的数据集            * @return BarChart数据集            */    private DefaultCategoryDataset getBarDataSet()           {               DefaultCategoryDataset dataset = new DefaultCategoryDataset();               dataset.addValue(100, "北京", "苹果");               dataset.addValue(100, "上海", "苹果");               dataset.addValue(100, "广州", "苹果");               dataset.addValue(200, "北京", "梨子");               dataset.addValue(200, "上海", "梨子");               dataset.addValue(200, "广州", "梨子");               dataset.addValue(300, "北京", "葡萄");               dataset.addValue(300, "上海", "葡萄");               dataset.addValue(300, "广州", "葡萄");               dataset.addValue(400, "北京", "香蕉");               dataset.addValue(400, "上海", "香蕉");               dataset.addValue(400, "广州", "香蕉");               dataset.addValue(500, "北京", "荔枝");               dataset.addValue(500, "上海", "荔枝");               dataset.addValue(500, "广州", "荔枝");               return dataset;           }                                                    /**            * @param args            */    public static void main(String[] args)           {               BarChartExample piechart = new BarChartExample();               String filePath = piechart.createBarChart();               System.out.println("PieChart file path : " + filePath);               try        {                   Runtime.getRuntime().exec(                           "rundll32 url.dll FileProtocolHandler " + filePath);               } catch (IOException e)               {                   e.printStackTrace();               }           }                                   }
复制代码

 

运行结果:

 

转载自:   http://www.cnblogs.com/jtmjx/archive/2013/04/23/simple_bar_chart.html

0 0