JFreeChart初学者入门实例详细解析之二

转载 2005年05月26日 11:48:00
前面的系列文章JFreeChart初学者入门实例详细解析已经介绍过了 JFreeChart 生成饼状图的实例,下面我们介绍 JFreeChart 如何生成柱状图。这次我们介绍使用 JFreeChart 生成柱状图,同样也是首先从一个最简单的例子开始。

一、最简单的例子为了降低门槛,让大家心理有个底,先介绍一个简单的不能再简单的例子,图片中的各类属性都采用默认值。


<%@ page contentType=
"text/html;charset=GBK"%>
<%@ page import=
"org.jfree.chart.ChartFactory,
org.jfree.chart.JFreeChart,
org.jfree.chart.plot.PlotOrientation,
org.jfree.chart.servlet.ServletUtilities,
org.jfree.data.DefaultCategoryDataset"%>
<%
DefaultCategoryDataset dataset =
new DefaultCategoryDataset();
dataset.addValue(300, "广州", "苹果");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(500, "广州", "葡萄");
dataset.addValue(340, "广州", "芒果");
dataset.addValue(280, "广州", "荔枝");

JFreeChart chart = 
ChartFactory.createBarChart3D
("水果销量统计图", 
          "水果",
        "销量",
        dataset,
   PlotOrientation.VERTICAL,
        false,
      false,
         false);

String filename =
ServletUtilities.saveChartAsPNG
(chart, 500, 300, null, session);
String graphURL =
request.getContextPath()
+ "/servlet/DisplayChart?filename=" 
+ filename;
%>
<ccid_file values="<%=" graphURL % />"
width=500 height=300 border=0 
usemap="#<%= filename %>">


这个 JSP 程序运行的结果如下图



图一


二、柱状图高级特性

上面的程序简单,但生成的柱状图也很简单。更多的时候,我们可能需要不同的效果。org.jfree.chart.ChartFactory 这个工厂类有 createBarChart, createStackedBarChart, createBarChart3D, createStackedBarChart3D 这几个工厂方法创建不同类型的柱状图。

关于这四个方法的 JFreeChart 的 Java Doc API 文档有详细说明,比较重要的是 PlotOrientation.VERTICAL 让平行柱垂直显示,而 PlotOrientation.HORIZONTAL 则让平行柱水平显示。

几个对柱状图影响较大的几个类,它们分别是:

org.jfree.chart.axis.CategoryAxis

org.jfree.chart.axis.ValueAxis

org.jfree.chart.renderer.BarRenderer

org.jfree.chart.renderer.BarRenderer3D

我们还是以实例来说明这几个类,先来假设一个需要统计的数据表:

北京上海广州成都深圳
苹果672766223540126
梨子325521210340106
葡萄332256523240526


根据上表数据,首先构造 CategoryDataset, 这里不再使用上面简单例子里面的 DefaultCategoryDataset 类,而是 DatasetUtilities 更有效的构造 CategoryDataset,如下列代码:

double[][] data = new double[][]
{
{
672, 766, 223, 540, 126
},
{
325, 521, 210, 340, 106
},
{
332, 256, 523, 240, 526
}
};
String[] rowKeys =
{
"苹果","梨子","葡萄"
};
String[] columnKeys = 
{
"北京","上海","广州","成都","深圳"
};
CategoryDataset dataset = 
DatasetUtilities.createCategoryDataset
(rowKeys, columnKeys, data);


用上面的 dataset 生成的 3D 柱状图



图二


org.jfree.chart.axis.CategoryAxis

CategoryAxis domainAxis =
plot.getDomainAxis();
//设置 columnKey 是否垂直显示
domainAxis.setVerticalCategoryLabels
(true);
//设置距离图片左端距离
domainAxis.setLowerMargin(0.1);
//设置距离图片右端距离
domainAxis.setUpperMargin(0.1);
//设置 columnKey 是否间隔显示
domainAxis.setSkipCategoryLabelsToFit(true);
plot.setDomainAxis(domainAxis); 
上面代码产生的效果如下图,
注意与图二的区别。




图三


org.jfree.chart.axis.ValueAxis

ValueAxis rangeAxis = plot.getRangeAxis();
//设置最高的一个柱与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
//设置最低的一个柱与图片底端的距离
//rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis); 
上面代码产生的效果如下图,注意与图二的区别。




图四


org.jfree.chart.renderer.BarRenderer3D

BarRenderer3D renderer =
new BarRenderer3D();
renderer.setBaseOutlinePaint
(Color.BLACK);
//设置 Wall 的颜色
renderer.setWallPaint(Color.gray);
//设置每种水果代表的柱的颜色
renderer.setSeriesPaint
(0, new Color(0, 0, 255));
renderer.setSeriesPaint
(1, new Color(0, 100, 255));
renderer.setSeriesPaint
(2, Color.GREEN);
//设置每种水果代表的柱的 
Outline 颜色
renderer.setSeriesOutlinePaint
(0, Color.BLACK);
renderer.setSeriesOutlinePaint
(1, Color.BLACK);
renderer.setSeriesOutlinePaint
(2, Color.BLACK);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.1);
//显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator
(new StandardCategoryItemLabelGenerator
()
);
renderer.setItemLabelFont(new Font
("黑体",Font.PLAIN,12));
renderer.setItemLabelsVisible(true);


上面代码产生的效果如下图,注意与图二的区别。



图五


补充两个有用的方法

补充 org.jfree.chart.plot.CategoryPlot 的两个方法,这两个方法对所有类型的图表都有作用,因为在前面没有介绍,这里补充一下。

//设置地区、销量的显示位置
plot.setDomainAxisLocation
(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation
(AxisLocation.BOTTOM_OR_RIGHT); 
上面代码产生的效果如下图,
注意与图二的区别。




图六


三 完整范例

前面都是一些代码片段,现在把这些片段组合成一个完整范例。

<%@ page contentType=
"text/html;charset=GBK"%>
<%@ page import=
"java.awt.Color,
 java.awt.Font,
org.jfree.chart.ChartFactory,
org.jfree.chart.JFreeChart,
org.jfree.chart.plot.PlotOrientation,
org.jfree.chart.servlet.ServletUtilities,
org.jfree.data.CategoryDataset,
org.jfree.data.DatasetUtilities,
org.jfree.chart.plot.CategoryPlot,
org.jfree.chart.axis.CategoryAxis,
org.jfree.chart.axis.ValueAxis,
org.jfree.chart.renderer.BarRenderer3D,
org.jfree.chart.labels.
StandardCategoryItemLabelGenerator,
org.jfree.chart.axis.AxisLocation"%>
<%
double[][] data = new double[][]
{
{
672, 766, 223, 540, 126
},
{
325, 521, 210, 340, 106
},
{
332, 256, 523, 240, 526
}
};
String[] rowKeys = 
{
"苹果","梨子","葡萄"
};
String[] columnKeys =
{
"北京","上海","广州","成都","深圳"
};
CategoryDataset dataset = 
DatasetUtilities.createCategoryDataset
(rowKeys, columnKeys, data);

JFreeChart chart =
ChartFactory.createBarChart3D
("水果销量图统计",
null,
null,
dataset,
PlotOrientation.VERTICAL,
true,false,false);
chart.setBackgroundPaint
(Color.WHITE);
CategoryPlot plot =
chart.getCategoryPlot();

CategoryAxis domainAxis =
plot.getDomainAxis();
domainAxis.setVerticalCategoryLabels
(false);
plot.setDomainAxis(domainAxis);

ValueAxis rangeAxis =
plot.getRangeAxis();
//设置最高的一个 
Item 与图片顶端的距离
rangeAxis.setUpperMargin
(0.15);
//设置最低的一个
Item 与图片底端的距离
rangeAxis.setLowerMargin
(0.15);
plot.setRangeAxis
(rangeAxis);

BarRenderer3D renderer =
new BarRenderer3D();
renderer.setBaseOutlinePaint
(Color.BLACK);
//设置 Wall 的颜色
renderer.setWallPaint(Color.gray);
//设置每种水果代表的柱的颜色
renderer.setSeriesPaint
(0, new Color(0, 0, 255));
renderer.setSeriesPaint
(1, new Color(0, 100, 255));
renderer.setSeriesPaint
(2, Color.GREEN);
//设置每个地区所包含的
平行柱的之间距离
renderer.setItemMargin
(0.1);
//显示每个柱的数值,
并修改该数值的字体属性
renderer.setItemLabelGenerator
(new StandardCategoryItemLabelGenerator()
);
renderer.setItemLabelsVisible
(true);
plot.setRenderer(renderer);

//设置柱的透明度
plot.setForegroundAlpha(0.6f);
//设置地区、销量的显示位置
plot.setDomainAxisLocation
(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation
(AxisLocation.BOTTOM_OR_RIGHT);

String filename = 
ServletUtilities.saveChartAsPNG
(chart, 500, 300, null, session);
String graphURL = 
request.getContextPath()
+ "/servlet/DisplayChart?filename="
+ filename;
%s>
<ccid_file values="<%=" graphURL % />" 
width=500 height=300 border=0 
usemap="#<%= filename %>">


看看程序运行的结果吧:



图七

JFreeChart初学者入门实例详细解析(转载)

JFreeChart,开放源码的Java图表生成组件(基于LGPL Licence),可以创建饼图、曲线图、柱状图、甘特图,生成PNG,JPG等图片格式文件。当前最新版本为0.9.11,下面就是一张J...
  • tianbeibei
  • tianbeibei
  • 2007年08月10日 14:18
  • 514

JFreeChart初学者入门实例详细解析(一)

JFreeChart,开放源码的Java图表生成组件(基于LGPL Licence),可以创建饼图、曲线图、柱状图、甘特图,生成PNG,JPG等图片格式文件。当前最新版本为0.9.11,下面就是一张J...
  • zxq1406spys
  • zxq1406spys
  • 2007年12月03日 14:03
  • 549

JFreeChart详解——各类的简单介绍(一)

好多项目中都有JFreeChart 的使用,查阅资料和结合实际使用这里做一个总结,和详解。 简单介绍: JFreeChart是一个免费创建图片的java工具. 目前是最好的 java 图形解决方案,基...
  • sinat_38259539
  • sinat_38259539
  • 2017年06月16日 13:58
  • 221

JFreeChart学习(一)-JfreeChart中的timeSeries(时序图)使用示例

转自:http://www.open-open.com/lib/view/open1400202235004.html 生成时序图: JFreeChart chart = Cha...
  • lvyuan30276
  • lvyuan30276
  • 2016年07月13日 18:19
  • 2757

JFreeChart详细使用说明,附案例

JFreeChart实现曲线走势图 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.eve...
  • sxe18652071425
  • sxe18652071425
  • 2012年10月09日 19:05
  • 7628

JFreeChart -- 柱状图实例解析

2D柱状图   package com; import java.io.File;import org.jfree.chart.ChartColor;import org.jfree.chart...
  • king201210
  • king201210
  • 2013年08月28日 14:34
  • 233

JFreeChart -- 时序图实例解析

时序图   一条时序线   package com;   import java.io.File;import java.text.SimpleDateFormat;import org.jf...
  • king201210
  • king201210
  • 2013年08月28日 14:34
  • 291

JFreeChart -- 饼形图实例解析

package com; import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;import org.jfree.c...
  • king201210
  • king201210
  • 2013年08月28日 14:34
  • 207

JFreeChart 折线图

在我前面的博文讲到了JFreeChart--柱形图:JFreeChart-柱形图 1.现在我们来讲讲JFreeChart-折线图: 1.所需要的架包:  架包下载地址:架包下载 因...
  • lifupingcn
  • lifupingcn
  • 2016年10月14日 11:21
  • 3866

JFreeChart 使用一 饼图之简单实例

使用JFreeChart创建图表共有三个步骤。如下: l创建一个dataset。该dataset包含图表要显示的数据。 l创建一个JFreeChart对象。该对象负责画这个图表。 l...
  • wangcunhuazi
  • wangcunhuazi
  • 2014年10月25日 19:48
  • 612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JFreeChart初学者入门实例详细解析之二
举报原因:
原因补充:

(最多只允许输入30个字)