14.8 利用JFreeChart生成组合图表
实例位置:光盘\\mingrisoft\\14\\dxyy\\02 通过JFreeChart插件还可以生成拥有多个绘图区的图表,简称组合图表,在生成组合图表时,必须通过绘图区对象,因为JFreeChart允许向绘图区对象中添加子绘图区对象。
下面是一个组合图表的典型应用,下面将以此讲解组合图表的具体生成方法。
分析一下图14.11中的两个绘图区,每个绘图区拥有各自的X轴,该图左侧的Y轴为两个绘图区共用的Y轴,使用该Y轴的图例有“涨幅百分比”和“今日涨幅之最”,图例“今日股价之最”使用右侧的Y轴,右侧的Y轴为右侧绘图区的附加轴,生成原理同14.7节,然后看一下图14.11的具体生成方法。
该典型应用生成的组合图表的效果如图14.11所示。
图14.11 利用JFreeChart生成组合图表
程序实现过程如下。
(1)首先定义右侧子绘图区,代码如下:
// 创建一个绘图区对象 XYPlot plot1 = new XYPlot(); // 定义的X轴
DateAxis axis1 = new DateAxis(\"今日之最\");
DateTickUnit unit1 = new DateTickUnit(DateTickUnit.HOUR, 1, new SimpleDateFormat(\"HH\"));
axis1.setTickUnit(unit1); plot1.setDomainAxis(axis1); // 因为共用Y轴,所以将其设为空 plot1.setRangeAxis(null);
// 设定绘图数据集,数据集在前面已经封装完毕,这里不再详细介绍 plot1.setDataset(dataset1); // 定义绘图风格
XYLineAndShapeRenderer xyArea1 = new XYLineAndShapeRenderer(); plot1.setRenderer(xyArea1);
(2)在右侧的绘图区中添加一个附加轴,用来统计股票的具体价格,代码如下:
// 创建附加轴对象,并添加到绘图区
ValueAxis axis11 = new NumberAxis(\"股票价格(单位:元 / 股)\"); axis11.setUpperBound(30.0); // 设置Y轴最大值 axis11.setLowerBound(10.0); // 设置Y轴最小值 plot1.setRangeAxis(1, axis11);
// 创建与附加轴对应的数据集,并添加到绘图区
TimeSeries timeSeries11 = new TimeSeries(\"今日股价之最\Minute.class); timeSeries11.add(startMinute, yesterdayValue);
timeSeries11.add(minMinute, yesterdayValue + yesterdayValue * minPercent); timeSeries11.add(maxMinute, yesterdayValue + yesterdayValue * maxPercent); timeSeries11.addOrUpdate(endMinute, yesterdayValue + yesterdayValue * endPercent);
IntervalXYDataset dataset11 = new TimeSeriesCollection(timeSeries11); plot1.setDataset(1, dataset11); // 将绘图数据集映射到附加轴上
plot1.mapDatasetToRangeAxis(1, 1); // 定义附加轴的绘图风格,这里为折线
XYLineAndShapeRenderer xyArea11 = new XYLineAndShapeRenderer(); plot1.setRenderer(1, xyArea11);
(3)定义左侧子绘图区,代码如下:
// 创建一个绘图区对象 XYPlot plot2 = new XYPlot(); // 定义的X轴
DateAxis axis2 = new DateAxis(\"统计时间\");
DateTickUnit unit2 = new DateTickUnit(DateTickUnit.MINUTE, 30, new SimpleDateFormat(\"HH:mm\")); axis2.setTickUnit(unit2); plot2.setDomainAxis(axis2); // 因为共用Y轴,所以将其设为空 plot2.setRangeAxis(null);
// 设定绘图数据集,数据集在前面已经封装完毕,这里不再详细介绍 plot2.setDataset(dataset2); // 定义绘图风格
XYAreaRenderer xyArea2 = new XYAreaRenderer(); plot2.setRenderer(xyArea2);
(4)定义父绘图区,代码如下:
// 创建一个绘图区对象
CombinedRangeXYPlot plot = new CombinedRangeXYPlot(); // 定义共用坐标轴
NumberAxis axis = new NumberAxis(\"股票涨幅百分比\");
axis.setTickUnit(new NumberTickUnit(0.025,new DecimalFormat(\"0.0%\")));//定义度量值风格
plot.setRangeAxis(axis);
// 添加子绘图区 plot.add(plot2, 5); plot.add(plot1, 2);
说明:在通过绘图区对象的add()方法添加子绘图区对象时,第一个入口参数为欲添加的子绘图区对象,第二个入口参数为该绘图区所占的比例,上面代码的意思是plot2占5/7,plot1占2/7,还需要注意的是,绘图区从左到右的排列顺序是由添加子绘图区的先后顺序决定的。
下面的代码是通过上面的父绘图区对象生成图表,并获得浏览路径:
// 创建图表
JFreeChart chart = new JFreeChart(chartTitle, plot); // 添加图表副标题
chart.addSubtitle(new TextTitle(subtitle)); // 固定用法
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); // 生成指定格式的图片,并返回图片名称
String fileName = ServletUtilities.saveChartAsPNG(chart, width, height, info, session); // 返回图片浏览路径
return servletURI + \"?filename=\" + fileName;
至此,一个组合图表就绘制完成了,这里绘制的是共用Y轴的组合图表,同样也可以绘制出共用X轴的组合图表。