JFreeChart生成柱形图(2) (转自 JSP开发技术大全)

14.2 利用JFreeChart生成柱形图14.2.1 利用DefaultCategoryDataset数据集绘制柱形图

通过JFreeChart插件,既可以生成普通效果的柱形图,也可以生成3D效果的柱形图。如果想生成普通效果的柱形图,需要通过工厂类ChartFactory的createBarChart()方法获得JFreeChart类的实例;如果想生成3D效果的柱形图,需要通过工厂类ChartFactory的createBarChart3D()方法获得JFreeChart类的实例,这两个方法的入口参数是完全相同的,各个入口参数的类型及功能如表14.2所示。

表14.2                                      绘制柱形图方法的入口参数类型及功能

参 数 序 号

入 口 参 数

参 数 功 能

1

String title

图表标题

2

String categoryAxisLabel

统计种类轴标题,可以理解为X轴标题

3

String valueAxisLabel

统计值轴标题,可以理解为Y轴标题

4

CategoryDataset dataset

绘图数据集

5

PlotOrientation orientation

用于设定柱形图的绘制方向

垂直:PlotOrientation.VERTICAL

水平:PlotOrientation.HORIZONTAL

6

boolean legend

用于设定是否显示图例

7

boolean tooltips

用于设定是否采用标准生成器

8

boolean urls

用于设定是否包生成链接

工厂类ChartFactory中的方法的返回值均为JFreeChart类的实例,通过返回的JFreeChart类的实例,可以设置绘图属性,也可以省略该步,直接生成图片,JFreeChart插件将采用默认的绘图属性进行绘制。

可以通过JFreeChart实例设置整个图片的绘制属性,例如通过setBackgroundPaint(Paint paint)方法设置图片的背景色,入口参数可以是Color类的实例,也可以是GradientPaint类的实例,通过GradientPaint类的实例可以实现渐变的背景色效果。

还可以通过JFreeChart实例的getCategoryPlot()方法获得CategoryPlot类的实例,通过CategoryPlot类的实例可以设置绘图区的绘图属性,例如设置绘图区的背景色,标准线的绘制属性等。通过CategoryPlot实例的getRenderer()方法可以获得BarRenderer类的实例,通过BarRenderer类的实例可以设置柱形的绘制属性,例如是否绘制柱形的轮廓线,以及柱形的填充色等,通过BarRenderer实例的setSeriesPaint(int series, Paint paint)方法设置柱形的填充色,第一个入口参数为图例的索引位置,从0开始,第二个入口参数为填充色,同样既可以接受Color类的实例,也可以接受GradientPaint类的实例。

 示例14-01 利用DefaultCategoryDataset数据集绘制柱形图

下面来看一个绘制柱形图的完整例子,该例绘制的柱形图效果如图14.1和图14.2所示。

       

图14.1 当绘图数据全部为正数时绘制出的柱形图       图14.2 当绘图数据存在负数时绘制出的柱形图

代码14-01 光盘位置:光盘\mingrisoft\14\sl\01

绘图时需要用到的相关信息如下:

int width = 500;     // 图像宽度

int height = 375;      // 图像高度

String chartTitle = "编程类图书年销量柱形图分析";     // 图表标题

String subtitle = "------统计时间:2008年";     // 副标题

String xTitle = "销售时间:2008年";     // X轴标题

String yTitle = "销售量    单位:万册";     // Y轴标题

String[] cutline = new String[] { "ASP", "JSP", "PHP" };     // 图例名称

String category[] = new String[] {"第1季度","第2季度","第3季度","第4季度"};   // 统计种类

Double[][] data = new Double[cutline.length][category.length];     // 绘图数据

for (int m = 0; m < cutline.length; m++) {     // 随机获取绘图数据

for (int n = 0; n < category.length; n++) {

data[m][n] = 1 + Math.random() * 100;

}

}

String servletURI = "/servlet/DisplayChart";     // 映射路径

   注意:仔细观察上面的for循环代码,会发现外循环是根据图例个数循环的,内循环是根据数据类别个数循环的,所以,在向绘图数据集中添加数据时,是按照图例的顺序添加的,即添加一个图例所有类别数据后再添加另一个图例的数据(对于竖向柱形图来说,并不是按照柱形从左到右的顺序添加数据的)。

    说明:上面给出的绘图数据为图14.1的绘图数据,限于篇幅,在这里就不给出图14.2的绘图数据了。

首先通过DefaultCategoryDataset类的实例封装绘图数据,代码如下:

DefaultCategoryDataset dataset = new DefaultCategoryDataset();

for (int m = 0; m < cutline.length; m++) {

for (int n = 0; n < category.length; n++) {

dataset.addValue(data[m][n], cutline[m], category[n]);

}

}

本示例绘制3D效果的柱形图,所以通过createBarChart3D()方法获得JFreeChart类的实例,只要改为createBarChart()方法,就可以绘制普通效果的柱形图,代码如下:

JFreeChart chart = ChartFactory.createBarChart3D(chartTitle,     // 图表标题

xTitle,     // X轴标题

yTitle,     // Y轴标题

dataset,     // 绘图数据集

PlotOrientation.VERTICAL,     // 柱形图绘制方向

True,     // 显示图例

True,     // 显示图例名称

False     // 生成链接

);

下面开始自定义绘图属性,没有下面的代码,同样可以得到漂亮的3D效果的柱形图。

为图片添加副标题,代码如下:

chart.addSubtitle(new TextTitle(subtitle));

将图片的背景色设置为渐变效果,代码如下:

GradientPaint chartGP = new GradientPaint(0, 0,

new Color(219, 227, 251), 0, height, Color.WHITE, False);     // 创建渐变色对象

chart.setBackgroundPaint(chartGP);     // 设置图片背景色

通过JFreeChart实例的getCategoryPlot()方法获得CategoryPlot类的实例,目的是设置绘图区的绘图属性,代码如下:

CategoryPlot plot = chart.getCategoryPlot();

设置绘图区的相关绘图属性,代码如下:

plot.setBackgroundPaint(new Color(241, 219, 127));     // 设置绘图区背景色

plot.setRangeGridlinePaint(Color.RED);     // 设置水平方向背景线颜色

plot.setRangeGridlinesVisible(True);     // 设置是否显示水平方向背景线,默认值为True

plot.setDomainGridlinePaint(Color.RED);     // 设置垂直方向背景线颜色

plot.setDomainGridlinesVisible(True);     // 设置是否显示垂直方向背景线,默认值为False

通过CategoryPlot实例的getRenderer()方法获得BarRenderer类的实例,目的是设置柱形的绘制属性,代码如下:

BarRenderer renderer = (BarRenderer) plot.getRenderer();

在这里不绘制柱形的轮廓线,JFreeChart默认为绘制,代码如下:

renderer.setDrawBarOutline(False);

下面设置柱形的填充颜色,同样采用渐变效果,代码如下:

Color color[] = new Color[cutline.length];

color[0] = new Color(99, 99, 0);

color[1] = new Color(255, 169, 66);

color[2] = new Color(33, 255, 66);

for (int i = 0; i < color.length; i++) {

GradientPaint gp = new GradientPaint(0, 0, color[i].brighter(), 0,

height, color[i].darker());

renderer.setSeriesPaint(i, gp);

}

下面通过CategoryPlot实例的getDomainAxis()方法获得CategoryAxis类的实例,目的是设置统计种类轴标题(X轴)的绘制属性,在这里设置为倾斜45°输出,代码如下:

CategoryAxis domainAxis = plot.getDomainAxis();

domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

本示例中就定义了上述的这些绘图属性,读者可以尝试着定义其他属性。下面的代码是利用JFreeChart绘制图片时必须用到的,记住就可以了:

ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());

通过ServletUtilities类的saveChartAsPNG()方法生成PNG格式的图片,并返回图片的名称,如果想生成JPG格式的图片,可以通过ServletUtilities类的saveChartAsJPEG()方法,代码如下:

String fileName = "";

try {

fileName = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);

} catch (IOException e) {}

下面的代码是在组织图片的浏览路径,供显示到JSP页面时使用:

String graphURL = contextPath + servletURI + "?filename=" + fileName;

14.2.2 利用XYDataset数据集绘制柱形图

利用实现XYDataset接口的数据集,也可以绘制柱形图,XYDataset数据集主要用来绘制与日期相关的统计图。

在封装数据集时,首先需要通过TimeSeries类的实例进行封装,TimeSeries类提供了3个构造函数,在这里我们采用入口参数最多的一个,代码如下:

TimeSeries timeSeries = new TimeSeries(chartTitle, xTitle, yTitle, Month.class);

入口参数依次为图表标题、日期轴标题、数据轴标题和统计种类,第二个和第三个入口参数可以为空,第四个入口参数的可选类型如下。

l     Year.class,按年统计。

l     Month.class,按月统计。

l     Day.class,按日统计。

l     Hour.class,按小时统计。

l     Minute.class,按分统计。

l     Second.class,按秒统计。

l     Millisecond.class,按毫秒统计。

l     Quarter.class,按一刻钟统计。

l     Week.class,按周统计。

l     FixedMillisecond.class,按指定时间段统计。

通过TimeSeries实例的add()方法向TimeSeries实例中添加统计数据,添加完成后以TimeSeries实例为入口参数创建一个TimeSeriesCollection类的实例,并将TimeSeriesCollection实例直接传给IntervalXYDataset类的实例,代码如下:

TimeSeriesCollection tsc = new TimeSeriesCollection(timeSeries);

IntervalXYDataset dataset = tsc;

    说明:类TimeSeriesCollection和类IntervalXYDataset均为XYDataset接口的实现类。

在创建JFreeChart类的实例时,需要通过工厂类ChartFactory的createXYBarChart方法,createXYBarChart方法与14.2.1节使用的createBarChart3D()方法类似,请对照学习。

 示例14-02 利用XYDataset数据集绘制与日期相关的柱形图

下面来看一个利用XYDataset数据集绘制柱形图的例子,该例绘制的柱形图效果如图14.3所示。

图14.3 利用XYDataset数据集绘制与日期相关的柱形图

代码14-02 光盘位置:光盘\mingrisoft\14\sl\02

在本示例中可以在前台向后台传入Map集合,Map集合元素的键为日期、值为统计值,本示例中用来创建数据集的代码如下:

Map data = new HashMap();     // 创建绘图数据集

for (int i = 1; i < 13; i++) {     // 为绘图数据集赋值

data.put(i, 1 + Math.random() * 100);

}

TimeSeries timeSeries = new TimeSeries(chartTitle, xTitle, yTitle, Month.class);

Iterator it = data.keySet().iterator();

while (it.hasNext()) {

int key = (Integer) it.next();

timeSeries.add(new Month(key, new Year(2008)), (Double) data .get(key));

}

TimeSeriesCollection tsc = new TimeSeriesCollection(timeSeries);

IntervalXYDataset dataset = tsc;

本示例中用来创建JFreeChart实例的代码如下:

JFreeChart chart = ChartFactory.createXYBarChart(chartTitle, xTitle,

True, yTitle, dataset, PlotOrientation.VERTICAL, False, False, False);

 

JFreeChart生成柱形图(2) (转自 JSP开发技术大全)的更多相关文章

  1. JFreeChart生成饼形图(3) (转自 JSP开发技术大全)

    JFreeChart生成饼形图(3) (转自 JSP开发技术大全) 14.3 利用JFreeChart生成饼形图 通过JFreeChart插件,即可以生成普通效果的饼形图,也可以生成3D效果的饼形图: ...

  2. JFreeChart生成饼形图(3)11 (转自 JSP开发技术大全)

    FreeChart生成饼形图(3) (转自 JSP开发技术大全) 14.3 利用JFreeChart生成饼形图 通过JFreeChart插件,即可以生成普通效果的饼形图,也可以生成3D效果的饼形图:如 ...

  3. 利用JFreeChart生成时序图(6) (转自 JSP开发技术大全)

    利用JFreeChart生成时序图(6) (转自 JSP开发技术大全) 14.6 利用JFreeChart生成时序图 通过JFreeChart插件只能生成普通效果的时序图,利用工厂类ChartFact ...

  4. 利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全)

    利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全) 14.5 利用JFreeChart生成区域图 通过JFreeChart插件只能生成普通效果的区域图,利用工厂类ChartFac ...

  5. 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)

    利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...

  6. 利用JFreeChart生成组合图表 (8) (转自 JSP开发技术大全)

    利用JFreeChart生成组合图表 (8) (转自 JSP开发技术大全) 14.8 利用JFreeChart生成组合图表  实例位置:光盘\mingrisoft\14\dxyy\02 通过JFree ...

  7. 利用JFreeChart生成多轴图表(7) (转自 JSP开发技术大全)

    利用JFreeChart生成多轴图表(7) (转自 JSP开发技术大全) 14.7 利用JFreeChart生成多轴图表 通过JFreeChart插件还可以生成拥有多个坐标轴的图表,简称多轴图表.在生 ...

  8. JFreeChart基础(1) (转自 JSP开发技术大全)

    JFreeChart基础(1) (转自 JSP开发技术大全) JFreeChart是一个Java开源项目,是一款优秀的Java图表生成插件,它提供了在Java Application.Servlet和 ...

  9. Java Web开发技术教程入门-初识动态网页

    这段时间学校搞了一个"阅战阅勇"的阅读活动,奖品还是挺丰富的~于是,奔着这些奖品,我去图书馆借了这本<Java Web开发技术教程>.一是为了那些丰富的奖品,二是为了回 ...

随机推荐

  1. JavaScript中数据类型的转换规则

    JavaScript中数据类型的转换规则 制作人:全心全意 JavaScript是一种无类型语言,也就是说,在声明变量时无须指定数据类型,这使得JavaScript更具有灵活性和简单性. 在代码执行过 ...

  2. CSS——可视化格式模型

    CSS的可视化格式模型 CSS中规定每一个元素都有自己的盒子模型(相当一规定了这个元素如何显示): 然后可视化格式模型则是把这些盒子模型按照规则摆放到页面上,也就是如何布局: 换句话说,盒子模型规定了 ...

  3. Spider-scrapy日志处理

    Scrapy生成的调试信息非常有用,但是通常太啰嗦,你可以在Scrapy项目中的setting.py中设置日志显示等级: LOG_LEVEL = 'ERROR' 日志级别 Scrapy日志有五种等级, ...

  4. Qt 多语言支持

    简介 Qt 多语言支持很强大,很好用. 首先要强调的是程序中需要翻译的字符串最好都用 tr("message") 这种形式,这里的 "message" 就是需要 ...

  5. 集训第四周(高效算法设计)A题 Ultra-QuickSort

    原题poj 2299:http://poj.org/problem?id=2299 题意,给你一个数组,去统计它们的逆序数,由于题目中说道数组最长可达五十万,那么O(n^2)的排序算法就不要再想了,归 ...

  6. BNUOJ 1541 Air Raid

    Air Raid Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: 1 ...

  7. HDU 4948 (傻比图论)

    Kingdom Problem Description Teacher Mai has a kingdom consisting of n cities. He has planned the tra ...

  8. 【HDOJ3047】Zjnu Stadium(带权并查集)

    题意:浙江省第十二届大学生运动会在浙江师范大学举行,为此在浙师大建造了一座能容纳近万人的新体育场. 观众席每一行构成一个圆形,每个圆形由300个座位组成,对300个座位按照顺时针编号1到300,且可以 ...

  9. [bzoj1485][HNOI2009]有趣的数列_卡特兰数_组合数

    有趣的数列 bzoj-1485 HNOI-2009 题目大意:求所有1~2n的排列满足奇数项递增,偶数项递增.相邻奇数项大于偶数项的序列个数%P. 注释:$1\le n\le 10^6$,$1\le ...

  10. hadoop(2)hadoop配置

    hadoop入门(二) hadoop的配置 1.本地模式 2.伪分布式 3.分布式     一.配置linux环境: 1打开虚拟网络编辑器,选择 VMnet1 仅主机模式, 子网 IP 设为 192. ...