基于web的jfreechart的使用

这个模块的主要步骤就是:

前台通过struts调用后台,通过JFreeChart产生图片格式的图表,存储在某个位置,然后前台jsp再去调用图片。

来开工。

JFreeChart的简介大家请百度。

首先需要两个包,jcommon-1.0.16.jar和jfreechart-1.0.13.jar。

jfreechart(下面就简称jfc),有可能会出现中午乱码问题,我建议大家就找上面那两个包,至少不会出那些需要换包的问题。

先看看效果

生成的图片:

前台的显示效果:

后台的方法

public String statistic() {

        //.....

        //diagramType就是前台的那个下拉框

        //可以是饼状图也可以是柱状图
        if (diagramType.equals("barChart"))
            getBarChart();
        else
            getPieChart();

        //getExcel(countArray);

        return SUCCESS;
    }
    /**
     * 生成柱状图
     */
    public void getBarChart() {
        CategoryDataset dataset = getDataSet();// 获取数据结果集
        JFreeChart chart = ChartFactory.createStackedBarChart3D("不同危险等级病人数分布", // 标题
                "危险等级",// x轴显示
                "病人数量(单位:位)", // y轴显示
                dataset, // 数据源
                PlotOrientation.VERTICAL, // 图表方向:水平,垂直
                true, // 是否显示图例(对于简单的柱状图必须是false)
                false,// 是否生成工具
                false);// 是否生成URL链接
        CategoryPlot plot = chart.getCategoryPlot();
        CategoryAxis axis = plot.getDomainAxis(); // 获取X轴
        ValueAxis numberAxis = plot.getRangeAxis();// 获取y轴
        axis.setLowerMargin(0.06);// 设置距离图片左端距离此时为6%
        axis.setUpperMargin(0.06); // 设置距离图片右端此时为6%
        axis.setCategoryLabelPositionOffset(10);// 图表横轴与标签的距离(10像素)
        axis.setCategoryMargin(0.2);// 横轴标签之间的距离20%
        chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));// 设置底部中文乱码
        axis.setTickLabelFont(new Font("黑体", Font.BOLD, 12));// 设置X轴坐标上的文字
        axis.setLabelFont(new Font("黑体", Font.BOLD, 14));// 设置X轴的标题文字

        numberAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 12));// 设置y轴坐标上的文字
        numberAxis.setLabelFont(new Font("黑体", Font.BOLD, 14));// 设置Y轴的标题文字
        chart.getTitle().setFont(new Font("黑体", Font.BOLD, 18));// 设置标题文字

        NumberAxis numberAxis1 = (NumberAxis)chart.getCategoryPlot().getRangeAxis();
        numberAxis1.setAutoTickUnitSelection(false);
        numberAxis1.setTickUnit(new   NumberTickUnit(30D));//1为一个间隔单位

        BarRenderer3D customBarRenderer = (BarRenderer3D) plot.getRenderer();
        customBarRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());//显示每个柱的数值
        customBarRenderer.setBaseItemLabelsVisible(true); //柱子上数值可见

        Date date = new Date();// 获取当前时间
        chartTimeTag = Long.toString(date.getTime());// 获取当前时间的时间戳
        String path = ServletActionContext.getServletContext().getRealPath("/")
                + "resources/chart/" + chartTimeTag + ".png";// 图片的存储路径
        // 输出图片到文件
        FileOutputStream fos_png = null;
        try {
            fos_png = new FileOutputStream(path);
            ChartUtilities.writeChartAsPNG(fos_png, chart, 900, 500, null);// 存储为png图片,宽度为900,高为500
            fos_png.close();
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.toString());
        }
    }
    /**
     * 得到生成柱状图的数据结果集,将方法tongJi()所得到的结果集中的数据依次添加到dataset中
     *
     * @return dataset 返回柱状图所需要的数据结果集
     */
    public CategoryDataset getDataSet() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < hosDegreeDataList.size(); i++) {
            //hosDegreeDataList里面存放的就是数据
            //hosDegreeDataList是一个list 每个element都是一组数据
            //大家对比一下图片中的ss与mm 就知道addValue的三个参数的作用了
            dataset.addValue(Integer.parseInt(hosDegreeDataList.get(i).get(2)
                    .toString()), hosDegreeDataList.get(i).get(0).toString()+"mm",
                    hosDegreeDataList.get(i).get(0).toString()+"ss");  //加上ss与mm 你就知道这两个参数的区别了

        }
        return dataset;
    }
  /**
     * 生成饼状图
     */
    public void getPieChart() {
        System.out.println("create chart start!!!!!!!!!");
        PieDataset dataset = getPieDataSet();// 获取数据结果集
        JFreeChart chart = ChartFactory.createPieChart3D("不同危险等级病人数分布",// 图表标题
                dataset,// 数据源
                true,// 是否显示图例
                true, true);// 是否生成工具,是否生成URL链接
        PiePlot3D plot = (PiePlot3D) chart.getPlot();
        // 图片中显示百分比:默认方式
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值,
        // {2} 表示所占比例 ,小数点后两位
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                "{0}={1}({2})", NumberFormat.getNumberInstance(),
                new DecimalFormat("0.00%")));
        // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
        plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}"));
        // 指定图片的透明度(0.0-1.0)
        plot.setForegroundAlpha(1.0f);
        // 指定显示的饼图上圆形(true)还椭圆形(false)
        plot.setCircular(true);
        // 设置图上分类标签label的字体,解决中文乱码
        plot.setLabelFont(new Font("黑体", Font.PLAIN, 12));
        // 设置图上分类标签label的最大宽度,相对与plot的百分比
        plot.setMaximumLabelWidth(0.2);
        // 设置3D饼图的Z轴高度(0.0~1.0)
        plot.setDepthFactor(0.07);
        // 设置起始角度,默认值为90,当为0时,起始值在3点钟方向
        plot.setStartAngle(45);

        // 设置图标题的字体,解决中文乱码
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("黑体", Font.PLAIN, 20));

        // 设置背景色为白色
        chart.setBackgroundPaint(Color.white);
        // 设置Legend部分字体,解决中文乱码
        chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));

        Date date = new Date();
        chartTimeTag = Long.toString(date.getTime());// 获取当前的时间戳
        String path = ServletActionContext.getServletContext().getRealPath("/")
                  + "resources/chart/" + chartTimeTag + ".png";// 图片的存储路径
        // 输出图片到文件
        //+"resources/chart/abc.png";
        System.out.println(path);
        FileOutputStream fos_png = null;
        try {
            fos_png = new FileOutputStream(path);
            ChartUtilities.writeChartAsPNG(fos_png, chart, 900, 500, null);
            fos_png.close();
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.toString());
        }
    }
   /**
     * 得到生成饼状图的数据结果集:将方法tongJi()所得到的结果集中的数据依次添加到dataset中
     *
     * @return dataset 返回饼状图所需要的数据结果集
     */
    public PieDataset getPieDataSet() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        for (int i = 0; i < hosDegreeDataList.size(); i++) {
            dataset.setValue(hosDegreeDataList.get(i).get(0).toString(), Double
                    .parseDouble(hosDegreeDataList.get(i).get(2).toString()));

        }
        return dataset;
    }

返回的jsp页面部分代码如下:

  <img src="../../../resources/chart/<s:property value = "chartTimeTag"/>.png"
                / width="500px">
            <br>
            <br>
    <input type="button" class="btn_long" value="点击查看大图"
            onclick="window.open('../../../resources/chart/<s:property value="chartTimeTag"/>.png')" />

时间: 2024-08-05 17:04:27

基于web的jfreechart的使用的相关文章

Eclipse Che:下一代基于 Web 的 IDE

即使对于熟练的开发人员,想要去为一个项目贡献代码,正确的安装和配置一个集成开发环境.工作区 workspace和构建工具,都是一个十分艰难和浪费时间的任务.Codenvy 的CEO,Tyler Jewell,也面临着这个问题.当他养好了一些小病,又处理了一些管理工作之后,试图建立一个简单的 Java 项目来找回他曾经的编程技能.经过多天的努力,Jewell 的项目依然无法工作,但这就是给予了他灵感.他想做个可以让"任何人,任何时候都可以为安装软件的项目做贡献"的东西. 正是这个想法引发

[转]建立大容量基于Web的Email系统

建立大容量基于Web的Email系统 王波 最近几年来,基于Web的免费Email系统非常流行.当前,几个著名的免费Email网站基本上已经成为大多数人的选择,建立单纯提供免费Email服务的站点不再像以前那样受到热烈欢迎,但是提供Web界面的Email服务已经成为了一个商业站点为其注册成员提供的基本服务之一. 一个Email系统可以分为服务器端和客户端,Web界面的Email系统则是将Email客户放在了Web服务器端,因此Email系统所需要实现的是一个Web界面的Email客户.然而,由于

基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!

公布 1.1.0 这个版本号改进了非常多细节,已经全然能够用于正式项目的开发 同一时候我们上线了 Wide 在线服务 到眼下,我们提供了 Wide 和 Solo 两个在线服务,详情请看这里. Wide 是什么 Wide 是一个基于 Web 的 Go 语言团队 IDE. 在线开发:打开浏览器就能够进行开发.全快捷键 智能提示:代码自己主动完毕.查看表达式.编译反馈.Lint 实时执行:极速编译.实时结果输出 团队协同:统一开发环境,分布式开发.代码分享 DevOps! 另外,除了使用上面我们提到的

pyDash:一个基于 web 的 Linux 性能监测工具

pyDash 是一个轻量且基于 web 的 Linux 性能监测工具,它是用 Python 和 Django 加上 Chart.js 来写的.经测试,在下面这些主流 Linux 发行版上可运行:CentOS.Fedora.Ubuntu.Debian.Raspbian 以及 Pidora .-- Ravi Saive 本文导航 -如何在 Linux 系统下安装 pyDash12% pyDash 是一个轻量且基于 web 的 Linux 性能监测工具[1],它是用 Python 和 Django[2

基于 Web 的 Go 语言 IDE - Wide 1.5.0 发布!

Wide 是什么 Wide 是一个基于 Web 的 Go 语言团队 IDE. 在线开发:打开浏览器就可以进行开发.全快捷键 智能提示:代码自动完成.查看表达式.编译反馈.Lint 实时运行:极速编译.实时结果输出 团队协同:统一开发环境,分布式开发,代码分享 DevOps! 大家可以使用我们提供的 Wide 在线服务,也可以自行下载并在本地环境运行 Wide 私服! Playground Wide 提供了运行单文件的 Playground,可以看作是 golang.org 的 Go Playgr

一款简单的基于Web的投票工具(PHP+SQLite 实现)

    最近实现了一个简单的投票工具--小兵投票(下文称"本软件").     本软件是一款简单的基于Web的投票工具,使用 PHP+SQLite 实现.      本软件是一款开源.免费软件. 软件下载地址: https://sourceforge.net/projects/xb-vote/files/latest/download?source=files     用户在系统中注册后,即可以创建投票,或参与投票. 首次使用时,请先注册一个用户名为root的用户,用于管理用户与投票.

shellinabox基于web浏览器的终端模拟器

1. Shellinabox介绍 Shellinabox 是一个利用 Ajax 技术构建的基于 Web 浏览器的远程终端模拟器,也就是说安装了该软件之后,服务器端不需要开启 ssh服务,通过 Web 浏览器就可以对远程主机进行操作,但是你的web浏览器需要支持AJAX/Javascript和CSS,因此可以用http://localhost:4200来登录到你的系统,并且默认情况下启用了SSL/TLS证书,需要用https://localhost:4200来登录. 默认情况下shellinabo

基于web的IM软件通信原理分析

关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而web端的IM应用,由于浏览器的兼容性以及其固有的“客户端请求服务器处理并响应”的通信模型,造成了要在浏览器中实现一个兼容性较好的IM应用,其通信过程必然是诸多技术的组合,本文的目的就是要详细探讨这些技术并分析其原理和过程. 1.基于web的固有通信方式 浏览器本身作为一个瘦客户端,不具备直接通过系

基于web的项目管理软件Redmine

Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来, 支持多种数据库,有不少自己独特的功能,例如提供wiki.新闻台等,还可以集成其他版本管理系统和BUG跟踪系统,例如Perforce. SVN.CVS.TD等等.这种 Web 形式的项目管理系统通过“项目(Project)”的形式把成员.任务(问题).文档.讨论以及各种形式的资源组织在一起,大家参与更新任务.文档等内容 来推动项目的进度,同时系统利用时间