利用JFreeChart生成柱形图

利用JFreeChart生成柱形图

 

14.2.1  利用DefaultCategoryDataset数据集绘制柱形图

通过JFreeChart插件,既可以生成普通效果的柱形图,也可以生成3D效果的柱形图。如果想生成普通效果的柱形图,需要通过工厂类ChartFactorycreateBarChart()方法获得JFreeChart类的实例;如果想生成3D效果的柱形图,需要通过工厂类ChartFactorycreateBarChart3D()方法获得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);

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

ll     Year.class,按年统计。

l     Month.class,按月统计。

ll     Day.class,按日统计。

ll     Hour.class,按小时统计。

ll     Minute.class,按分统计。

ll     Second.class,按秒统计。

ll     Millisecond.class,按毫秒统计。

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

ll     Week.class,按周统计。

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

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

TimeSeriesCollection tsc = new TimeSeriesCollection(timeSeries);

IntervalXYDataset dataset = tsc;

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

在创建JFreeChart类的实例时,需要通过工厂类ChartFactorycreateXYBarChart方法,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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值