分享
 
 
 

初探JFreeChart

王朝java/jsp·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

官方网站:http://www.jfree.org/jfreechart/index.php

最新版本:jfreechart-1.0.0-rc1

一、先介绍一个简单的不能再简单的例子,图片中的各类属性都采用默认值。

<%@ 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

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

北京

上海

广州

成都

深圳

苹果

672

766

223

540

126

梨子

325

521

210

340

106

葡萄

332

256

523

240

526

根据上表数据,首先构造 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 %>">

看看程序运行的结果吧:

本文为引用文档详细内容参考

http://www.javaeasy.com/ArticleShow.asp?ArticleID=777

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有