JFreeChart如何做柱状图

时间:2008-05-10 11:55:07   来源:论坛整理  作者:  编辑:chinaitzhe
楼里的各位!小弟现在也在学习JFreeChart这个东东,现在也是想做个柱状图的程序,目的是实现按月份(或者按天)显示不同产品的销售量,这个销售量和日期都从数据库取得,能不能给个例子啊?谢谢了!
网友回复:
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



package cn.netjava.jFreeChart;



import java.awt.BasicStroke;

import java.awt.Color;

import java.io.IOException;



import javax.servlet.*;

import javax.servlet.http.*;



import org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartUtilities;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.plot.MeterPlot;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.chart.plot.ThermometerPlot;

import org.jfree.data.Range;

import org.jfree.data.category.DefaultCategoryDataset;

import org.jfree.data.general.DefaultPieDataset;

import org.jfree.data.general.DefaultValueDataset;



/**

 * 生成jFreeChart图片的Servlet

 * @author 胡东峰

 */

public class ChartServlet extends HttpServlet {

    /**

     * 根据客户端请求的图表类型chartType的值,返回对应的图表,

     */

    public void service(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 输出图片格式为png格式

        response.setHeader("Cache-Control", "no-cache");

        response.setContentType("image/png");

        //请求的图表类型

        String chartType = request.getParameter("chartType");

        System.out.println("请求的图表类型是 : "   chartType);

        // for export Chart:

        JFreeChart chart = null;

        if (chartType.equalsIgnoreCase("PieChart3D")) {

            // 创建pie图的数据集方法

            DefaultPieDataset data = ChartTools.getPieDataSet();

            chart = ChartFactory.createPieChart3D("这是PieChart3D图:", data, true,

                    false, false);

        } else if (chartType.equalsIgnoreCase("PieChart")) {

            // 创建pie图的数据集方法

            DefaultPieDataset data = ChartTools.getPieDataSet();

            chart = ChartFactory.createPieChart("这是PieChart图:", data, true,

                    false, false);

        } else if (chartType.equalsIgnoreCase("RingChart")) {

            // 创建pie图的数据集方法

            DefaultPieDataset data = ChartTools.getPieDataSet();

            chart = ChartFactory.createRingChart("这是RingChart图:", data, true,

                    false, false);

        } else if (chartType.equalsIgnoreCase("BarChart3D")) {

            // 创建bar图的数据集方法

            DefaultCategoryDataset data = ChartTools.getCategoryDataset();

            // PlotOrientation.HORIZONTAL这个参数说明是水平还是垂直方向VERTICAL

            chart = ChartFactory.createBarChart3D("这是BarChart3D", "数量", "地点",

                    data, PlotOrientation.VERTICAL, true, false, false);

        } else if (chartType.equalsIgnoreCase("LineChart")) {

            // 创建线图

            DefaultCategoryDataset data = ChartTools.getCategoryDataset();

            chart = ChartFactory.createLineChart("这是LineChart", "数量", "地点",

                    data, PlotOrientation.VERTICAL, true, false, false);

        } else if (chartType.equalsIgnoreCase("AreaChart")) {

            // 创建区域形图

            DefaultCategoryDataset data = ChartTools.getCategoryDataset();

            chart = ChartFactory.createAreaChart("这是AreaChart", "数量", "地点",

                    data, PlotOrientation.VERTICAL, true, false, false);

        } else if (chartType.equalsIgnoreCase("WaterfallChart")) {

            // 搞不明白这是什么图:(

            DefaultCategoryDataset data = ChartTools.getCategoryDataset();

            chart = ChartFactory.createWaterfallChart("这是WaterfallChart", "数量",

                    "地点", data, PlotOrientation.VERTICAL, true, false, false);

        } else if (chartType.equalsIgnoreCase("Thermometer")) {

            // 整个温度计。。。。。。。。。。

            // 数据集,初始值为0

            DefaultValueDataset valuedataset = new DefaultValueDataset(0);

            // 创建漫度计的Plot对象

            ThermometerPlot thermometerplot = new ThermometerPlot(valuedataset);

            chart = new JFreeChart("设备温度", JFreeChart.DEFAULT_TITLE_FONT,

                    thermometerplot, false);

            thermometerplot.setThermometerStroke(new BasicStroke(2.0F));

            // 图表的轮廓颜色

            thermometerplot.setThermometerPaint(Color.BLUE);

            thermometerplot.setOutlinePaint(null);

            // 图表计数单位

            thermometerplot.setUnits(10);

            // 数值范围

            thermometerplot.setRange(-40, 40);

            thermometerplot.setForegroundAlpha(1f);

            // 图表的当前值

            valuedataset.setValue(20);

        } else if (chartType.equalsIgnoreCase("MeterChart")) {

            // 整个仪表盘

            // 数据集,初始值为30

            DefaultValueDataset valuedataset = new DefaultValueDataset(30);

            // 创建Plot对象

            MeterPlot meterplot = new MeterPlot(valuedataset);

            chart = new JFreeChart("当前流量速度", JFreeChart.DEFAULT_TITLE_FONT,

                    meterplot, false);

            // 表盘上显示的数据单位说明

            meterplot.setUnits("条/秒)");

            // 表盘分害的单位,即30为一格

            meterplot.setTickSize(30);

            // 显示数据范围,0~600

            meterplot.setRange(new Range(0, 600));

            // 图表的当前值

            valuedataset.setValue(100);

        }

        if (null != chart) {

            // 将图片对象输出到客户端

            java.io.OutputStream ous = response.getOutputStream();

            ChartUtilities.writeChartAsPNG(ous, chart, 500, 300);

            // 使用这样的代码输出可能会出错!

            // ChartUtilities.writeChartAsJPEG(ous,100,chart,500,300,null);

            ous.flush();

            ous.close();

            System.out.println("******ho ho..*****图片输出完毕....... "   chartType);

        }

    }

}



/**

 * 生成图片数据集的工具类:

 * @author 胡东峰

 */

class ChartTools {

    /**

     * 生成bar图的数据集:

     * @return:可用于Bar图的数据集

     */

    public static DefaultCategoryDataset getCategoryDataset() {

        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        for (int series = 0; series < seriesTimes.length; series  ) {

            for (int i = 0; i < seriesNames.length; i  ) {

                nameValueOfTime[series][i] = new java.util.Random()

                        .nextInt(300)   100;

                dataset.addValue(nameValueOfTime[series][i], seriesNames[i],

                        seriesTimes[series]);

            }

        }

        return dataset;

    }



    /**

     * 创建用于填充pie图的数据集

     * @return DefaultPieDataset对象

     */

    public static DefaultPieDataset getPieDataSet() {

        // 用来填充pie图的数据集

        DefaultPieDataset dataset = new DefaultPieDataset();

        // 饼图分块名字

        String[] seriesNames = { "芙蓉路", "八一路", "五一路", "大学路", };

        for (int i = 0; i < seriesNames.length; i  ) {

            int value = new java.util.Random().nextInt(1000)   500;

            // 设置pie数据集中的数据对

            dataset.setValue(seriesNames[i], value);

        }

        return dataset;

    }

  

    private ChartTools(){};

    /** X轴时间维数据序型(当然也可以为标签维度)* */

    private static String[] seriesTimes = { "一月", "二月", "三月", "四月", "五月", "六月","七月" };

    /** 柱状标签序列(比如做为地点序列) */

    private static String[] seriesNames = { "芙蓉路立交桥", "五一立交桥", "长岭路口" };

    /** 每个时间点上每个地区/类型序列的值 */

    private static int[][] nameValueOfTime = new int[seriesTimes.length][seriesNames.length];

}




网友回复:以上什么类型的图都包括了,呵呵
网友回复:中文资料 自己看
http://julycn.javaeye.com/topics/download/59dda134-0cc7-4eb9-9802-58de27c3350e
网友回复:1楼非常感谢你,不过似乎我用不太上,我是说数据从数据库里取得,不是给个数组,而且根据资料似乎是只有用XYDateset接口才可以用来绘制与日期相关的统计图.我现在的问题是比如有三种商品要出图,但是我做完后,在图上只能显示一个产品的图(也就是说是最先赋值的哪个产品的图).可是下边的图例上却能显示有三种产品.我用的是createXYBarChart().
网友回复:晕楼上的 你不会把数据放到数组里面吗?
网友回复:哎呀,让您见笑了,我只是想不通过数组再转一遍.
网友回复:先看看咯
关键字:JFreeChart,柱状图,

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面