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


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

    14.8 利用JFreeChart生成组合图表

    * 实例位置:光盘mingrisoft14dxyy2

    通过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轴的组合图表。

  • 相关阅读:
    mailto发送邮件
    使用css实现一个持续的动画效果
    documentFragment添加节点
    删除数组的第一个元素,不要直接修改数组,结果返回新的数组
    js数组去重
    css定位position(侧边栏导航)
    mongoexport导出mongodb数据库中的数据
    textarea头部不顶行问题和textarea禁止拉伸
    HTML meta标签
    textarea
  • 原文地址:https://www.cnblogs.com/meimao5211/p/3262071.html
Copyright © 2020-2023  润新知