JFreeChart—输出柱形图

如何将数据以柱状图的形式显示出来?

实现过程:

1、获取数据;

2、根据工厂模式生成图形对象,通过获取该图形对象,来进一步获得该图形对象内部的小对象,并对它们的字体等进行设置;

3、将图形放到面板中;

4、构建一个方法,将放置了图形的面板返回出去,当需要使用该面板时只需调用该方法即可(封装);

5、创建一个窗体,将面板放到该窗体中进行显示;

柱形图比饼状图复杂,生成的图标数据需要有两个维度。两个维度从数据集的生成角度可以按照类别分为数据集(DefaultCategoryDataset )和XY分的数据集(XYDataset)两种。

使用DefaultCategoryDataset数据集绘制柱形图

BarChartServlet.java

import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

/** * @author lmb *报表图形实现类 */
public class BarChartServlet {

    //用于获取数据
    private static CategoryDataset getDataset(){

        DefaultCategoryDataset dataset=new DefaultCategoryDataset();//创建数据集对象
        //往数据集对象中添加数据(实际应用中是从数据库,Excel文件或者文本文件中获取数据,这里为了方便起见将数据直接给出)
        //-------------------------------苹果的销售记录
        dataset.addValue(100,"北京","苹果");//数据值,X轴,Y轴 
        dataset.addValue(150,"深圳","苹果");    
        dataset.addValue(80,"广州","苹果");
        //-------------------------------橘子的销售记录
        dataset.addValue(120,"北京","梨子");    
        dataset.addValue(110,"深圳","梨子");    
        dataset.addValue(170,"广州","梨子");
        //-------------------------------葡萄的销售记录
        dataset.addValue(140,"北京","葡萄");
        dataset.addValue(90,"深圳","葡萄");
        dataset.addValue(100,"广州","葡萄");
        //-------------------------------香蕉的销售记录
        dataset.addValue(380,"北京","香蕉");
        dataset.addValue(420,"深圳","香蕉");    
        dataset.addValue(140,"广州","香蕉");
        //-------------------------------榴莲的销售记录
        dataset.addValue(320,"北京","荔枝");
        dataset.addValue(270,"深圳","荔枝");
        dataset.addValue(300,"广州","荔枝");

        return dataset;
    }

    //构建容器面板,用于存放已经画好的图形报表
        private ChartPanel frame1;

    //在构造方法中将图形报表初始化
    public BarChart(){
        //获取数据
        CategoryDataset dataset = getDataset();
        //创建图形实体对象
        JFreeChart chart=ChartFactory.createBarChart3D(//工厂模式
                "水果", //图形的标题
                "水果种类", //目录轴的显示标签(X轴)
                "数量",  //数据轴的显示标签(Y轴)
                dataset, //数据集
                PlotOrientation.VERTICAL, //垂直显示图形
                true,  //是否生成图样
                false, //是否生成提示工具
                false);//是否生成URL链接
        CategoryPlot plot=chart.getCategoryPlot();//获取图形区域对象
        //------------------------------------------获取X轴
        CategoryAxis domainAxis=plot.getDomainAxis();
        domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));//设置X轴的标题的字体
        domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));//设置X轴坐标上的字体
        //-----------------------------------------获取Y轴
        ValueAxis rangeAxis=plot.getRangeAxis();
        rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));//设置Y轴坐标上的标题字体
        //设置图样的文字样式
        chart.getLegend().setItemFont(new Font("黑体",Font.BOLD ,15));
        //设置图形的标题
        chart.getTitle().setFont(new Font("宋体",Font.BOLD ,20));

        frame1 =new ChartPanel(chart,true);//将已经画好的图形报表存放到面板中
    }

    //构建一个方法,用于获取存放了图形的面板(封装:隐藏具体实现)
    public ChartPanel getChartPanel(){
        return frame1;
    }
}

DemoFrame.java

/** * @author lmb *窗体类 */
public class DemoFrame extends JFrame{

    //在构造方法中初始化窗体
    public DemoFrame(){
        //----------------------设置窗体大小
        this.setSize(800,600);
        //---------------------------将报表面板添加到窗体中
        this.add(new BarChart().getChartPanel());
        //----------------------设置窗体大小不可变
        this.setResizable(false);
        //----------------------设置窗体相对于屏幕居中
        this.setLocationRelativeTo(null);
        //------------------------设置窗体可见
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new DemoFrame();
    }
}

显示结果:

为了方便起见该例中的数据直接使用的自定义数据,但在实际应用中我们使用的数据多来自于数据库、Excel文件或者文本文件。

总结:

1、利用DefaultCategoryDataset数据集绘制柱形图数据集对象DefaultCategoryDataset;

2、生成数据的方法是addValue(),添加数据时需要指定比较的种类和分类;

3、对应创建柱形图的方法是createBarChart3D();

4、可以对图标的X轴对象CategoryAxis对象进行设置。

使用XYDataset数据集绘制柱形图

按照XY轴分类生成的柱形图可以将数据按照两个维度显示为柱形图,此时生成数据集时要有XYDataset对象。

BarChartServlet2.java

package com.lmb.jfreechart;

import java.awt.Color;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYBarDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class BarChartServlet2 extends HttpServlet {

    private static final long serialVersionUID = 935480272440185396L;

    public BarChartServlet2() {
        super();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse 

response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse 

response)
            throws ServletException, IOException {

        // 设置返回类型为图片
        response.setContentType("image/png");
        // 获取数据集对象
        IntervalXYDataset dataset = createDataset();
        // 创建图形对象
        JFreeChart jfreechart = ChartFactory.createXYBarChart("08年图 书销售量", null,
                false, "销量", dataset, 

PlotOrientation.VERTICAL, true, false,
                false);
        // 设置背景为白色
        jfreechart.setBackgroundPaint(Color.white);
        // 获得图表区域对象
        XYPlot xyplot = (XYPlot) jfreechart.getPlot();
        // 设置区域对象背景为灰色
        xyplot.setBackgroundPaint(Color.lightGray);
        // 设置区域对象网格线调为白色
        xyplot.setDomainGridlinePaint(Color.white);
        xyplot.setRangeGridlinePaint(Color.white);
        // 获显示图形对象
        XYBarRenderer xybarrenderer = (XYBarRenderer) 

xyplot.getRenderer();
        // 设置不显示边框线
        xybarrenderer.setDrawBarOutline(false);

        // 将图表已数据流的方式返回给客户端
        ChartUtilities.writeChartAsPNG(response.getOutputStream(), 

jfreechart,
                500, 270);
    }

    /** * 返回数据集 * * @return */
    private static IntervalXYDataset createDataset() {
        // 创建基本数据
        XYSeries xyseries = new XYSeries("JAVA");
        XYSeries xyseries1 = new XYSeries("PHP");
        for (int i = 1; i <= 12; i++) {
            // 添加数据
            xyseries.add(i,DataUtils.getRandomData());
            xyseries1.add(i,DataUtils.getRandomData());
        }
        XYSeriesCollection xyseriescollection = new 

XYSeriesCollection();
        xyseriescollection.addSeries(xyseries);
        xyseriescollection.addSeries(xyseries1);
        return new XYBarDataset(xyseriescollection, 

0.90000000000000002D);
    }
}

web.xml略。。。

总结:

1、利用XYDataset数据集绘制柱形图数据集对象IntervalXYDataset;

2、生成数据的方法是通过XYSeries对象,并且XYSeriesCollection对象将其转化成XYDataset;

3、对应创建柱状图的方法createXYBarChart();

4、可以对图形渲染对象XYBarRenderer设置图形的显示。

你可能感兴趣的:(jfreechart,柱形图)