三、 混合图表(不同类型的图混合显示)
我们经常用的是柱状图、曲线图、和饼图,这三类型图基本能满足大部分项目的需求。但有些项目比较特殊,可能需要在一张图上同时显示不同类型的图。这在JFreeChart中可以轻松实现。例如我们要做个流量监控的系统,该系统一天中在不同的时间段有不同的阀值(最大值),该阀值表示成阶梯线。而实际流量就是个曲线了。当流量在某个时段内超过阀值时就触发相应的事件(如限流)。要表示阀值和流量的对比关系就需要两种类型的图片在同一张图表上表示,如下图:

首先像创建普通图表一样来创建图片,笔者先创建了一个XYStep Chart。然后创建第二图表的Renderer,再分别将第二图表的Dataset、Renderer添加进第一图表的plot。实例代码如下:
//MultipleChart.java
JFreeChart jfreechart = ChartFactory.createXYStepAreaChart("监控设置",
"时刻",
"流量",
xydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
XYPlot xyplot = jfreechart.getXYPlot();
…………
//设置第二图表的Renderer
StandardXYItemRenderer standardxyitemrenderer = new StandardXYItemRenderer();
standardxyitemrenderer.setToolTipGenerator(new StandardXYToolTipGenerator("{0}({1}) = {2}",
new SimpleDateFormat("HH:mm"),
new DecimalFormat("#,##0")));
//将第二图表的Dataset、Renderer添加进xyplot
xyplot.setDataset(1, lineDataset);
xyplot.setRenderer(1,standardxyitemrenderer);
这样就创建了曲线和阶梯的混合图表。
四、 其它问题
1) 版本问题。
JFreeChart 的各版本变动比较大,这在升级版本时是比较头疼的问题,升级时需要改动你代码的地方可能比较多。因此尽量采用最新的版本,新版本的文档可能比较少,但问题要相对少一些,在旧版中就出现过标注数值重叠在一起这样的问题。好的是JFreeChart是开源的,碰到解决不了的问题可以从源码中找到有参考价值的信息。
2) 设置背景透明度的BUG
不知道这是不是JFreeChart的一个BUG。利用 chart.setBackgroundImageAlpha(0.5f)来设置背景透明度, ServletUtilities.saveChartAsPNG保存图片。将chart.setBackgroundImageAlpha(0.5f) 注释掉再生成图片,发现两张图片是一样的。也就是说setBackgroundImageAlpha方法无效,具体原因笔者还不太清楚,读者大家可以自己测试看看。
以上是笔者在项目开发中总结出来的,希望大家多提宝贵意见!