JFreeChart最新版本1.0.8a的研究系列——生成柱状图

来源:互联网 发布:3ds淘宝哪家店好 编辑:程序博客网 时间:2024/05/26 07:28

生成柱状图

具体实现步骤

1)创建用于图形生成所要的数据集对象。
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    DefaultPieDataset类提供的setValue(data,rowKey,columnKey)方法,设置柱状图形显示的数据,其中:rowKey表示X轴数据,columnKey表示Y轴数据,data表示填充柱状图所要的实际数据。

2)创建图形对象。
    JFreeChart chart = ChartFactory.createBarChart3D("标题", null,null,dataset,PlotOrientation.VERTICAL,,true,false,false);
    createBarChart3D方法是ChartFactory工厂类里的一个方法,用于3D柱状图的生成,平面柱状图使用createBarChart方法创建,还有createStackedBarChart和createStackedBarChart3D方法可以创建叠加式的平面和3D柱状图。八个参数分别代表:图形的标题、X轴标题、Y轴标题、dataset就是CategoryDataset类的实例对象、柱形图显示形式、是否显示图例、测试未明、是否显示鼠标志向提示,其中柱形图显示形式有,PlotOrientation.VERTICAL表示垂直方式、PlotOrientation.HORIZONTAL表示水平方式。

3)设置图形显示的属性。
   a) ValueAxis类,设置柱到图上下边的距离。实现方法是:

           获取ValueAxis对象
           ValueAxis rangeAxis = (ValueAxis)plot.getRangeAxis();
           设置最高的一个柱与图片顶端的距离:
           rangeAxis.setUpperMargin(0.15)
           设置最低的一个柱与图片底端的距离:
           rangeAxis.setLowerMargin(0.15)
   b)BarRenderer类,设置图形上显示的数值。实现方法如下:

          获取BarRenderer对象
          BarRenderer renderer = (BarRenderer) plot.getRenderer(); 
          renderer.setBaseOutlinePaint(Color.BLACK);
          设置 Wall 的颜色:
          renderer.setWallPaint(Color.gray);
          设置每个柱的颜色:
          renderer.setSeriesPaint(0, new Color(0, 0, 255)); 
          renderer.setSeriesPaint(1, new Color(0, 100, 255));
          renderer.setSeriesPaint(2, Color.GREEN);
          设置每个柱的 Outline 颜色
          renderer.setSeriesOutlinePaint(0, Color.BLACK);
          renderer.setSeriesOutlinePaint(1, Color.BLACK);
          renderer.setSeriesOutlinePaint(2, Color.BLACK);
          设置每个地区所包含的平行柱之间的距离
          renderer.setItemMargin(0.1); 
          显示每个柱的数值,并修改该数值的字体属性
          renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
          renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
          renderer.setItemLabelsVisible(true);

实例应用
package jfreechar.test;

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.Range;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 * 测试生成柱形图实例
 *
 * 
@author 左杰
 *
 
*/

public class BarChartTest {
    
/**
     * 获取简单数据集对象
     *
     * 
@return
     
*/

    
public DefaultCategoryDataset getJdDataSet() {
        DefaultCategoryDataset dataset 
= new DefaultCategoryDataset();
        dataset.addValue(
100"北京""苹果");
        dataset.addValue(
200"北京""梨子");
        dataset.addValue(
300"北京""葡萄");
        dataset.addValue(
400"北京""香蕉");
        dataset.addValue(
500"北京""荔枝");
        
return dataset;
    }


    
/**
     * 获取组合数据集对象
     *
     * 
@return
     
*/

    
public DefaultCategoryDataset getZhDataSet() {
        DefaultCategoryDataset dataset 
= new DefaultCategoryDataset();
        dataset.addValue(
100"北京""苹果");
        dataset.addValue(
100"上海""苹果");
        dataset.addValue(
100"广州""苹果");
        dataset.addValue(
200"北京""梨子");
        dataset.addValue(
200"上海""梨子");
        dataset.addValue(
200"广州""梨子");
        dataset.addValue(
300"北京""葡萄");
        dataset.addValue(
300"上海""葡萄");
        dataset.addValue(
300"广州""葡萄");
        dataset.addValue(
400"北京""香蕉");
        dataset.addValue(
400"上海""香蕉");
        dataset.addValue(
400"广州""香蕉");
        dataset.addValue(
500"北京""荔枝");
        dataset.addValue(
500"上海""荔枝");
        dataset.addValue(
500"广州""荔枝");
        
return dataset;
    }


       
/**
     * 创建图表主对象JFreechart,并设置图像显示
     *
     * 
@return
     
*/

    
public JFreeChart createBarChart() {
        DefaultCategoryDataset dataset 
= getJdDataSet();
        
// 创建JFreechart对象,3D状的
        
// JFreeChart chart = ChartFactory.createBarChart3D("水果产量统计", "水果",
        
// "产量",dataset, PlotOrientation.VERTICAL, true, true, true);
        
// 创建JFreechart对象,平面状的
        JFreeChart chart = ChartFactory.createBarChart("水果产量统计""水果""产量",
                dataset, PlotOrientation.VERTICAL, 
truetruetrue);

        
// 设置图形显示属性
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        
// 目录轴网格是否可见
        plot.setDomainGridlinesVisible(false);
        
// 目录轴网格线的颜色
        plot.setDomainGridlinePaint(Color.red);
        
// 数据轴网格是否可见
        plot.setRangeGridlinesVisible(true);
        
// 数据轴网格线的颜色
        plot.setRangeGridlinePaint(Color.blue);
        
// 设置图像区域背景颜色
        plot.setBackgroundPaint(Color.white);
        
// 设置柱的透明度
        plot.setForegroundAlpha(0.9f);
        
// 设置目录轴和数据轴的显示位置
        plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
        plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

        
// 设置数据轴的刻度
        NumberAxis naxis = (NumberAxis) plot.getRangeAxis();
        
// 设置数据轴的数据范围
        naxis.setRange(new Range(01000));
        
// 设置刻度波动值
        naxis.setTickUnit(new NumberTickUnit(50));

        
// 设置图形的宽度
        CategoryAxis caxis = plot.getDomainAxis();
        
// 设置最高的一个柱图与图片顶端的距离
        caxis.setUpperMargin(0.15);
        
// 设置最低的一个柱图与图片底端的距离
        caxis.setLowerMargin(0.15);

        
// 设置柱图属性
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        
//
        renderer.setBaseOutlinePaint(Color.black);
        
// 设置每个地区代表的柱的颜色
        renderer.setSeriesPaint(0, Color.pink);
        renderer.setSeriesPaint(
1new Color(0100255));
        renderer.setSeriesPaint(
2, Color.green);
        
// 设置每个地区所包含的平行柱的之间距离
        renderer.setItemMargin(0.02);

        
return chart;
    }


    
/**
     * 生成图形,保存图像到临时文件,并返回文件名
     *
     * 
@param chart
     *            JFreeChart对象实例
     * 
@param w
     *            图像宽度
     * 
@param h
     *            图像高度
     * 
@param session
     *            会话session
     * 
@return
     
*/

    
public String getFileName(JFreeChart chart, int w, int h,
            HttpSession session) 
{
        
// 生成图形,保存图像到临时文件,并返回文件名
        String fileName = "";
        StandardEntityCollection sec 
= new StandardEntityCollection();
        ChartRenderingInfo info 
= new ChartRenderingInfo(sec);
        
try {
            fileName 
= ServletUtilities.saveChartAsPNG(chart, w, h, info,
                    session);
        }
 catch (Exception e) {
            System.out.println(
"Exception - " + e.toString());
            fileName 
= "public_error_500x300.png";
        }

        
return fileName;
    }


    
/**
     * 生成图形,保存到指定文件,文件类型为png
     *
     * 
@param fileName
     *            指定保存文件的路径及文件名
     * 
@param chart
     *            JFreeChart对象实例
     * 
@param w
     *            图像宽度
     * 
@param h
     *            图像高度
     
*/

    
public void SaveFileAsPNG(String fileName, JFreeChart chart, int w, int h) {
        
// 生成图形,保存到指定文件,文件类型为png
        try {
            ChartUtilities.saveChartAsPNG(
new File(fileName), chart, w, h);
        }
 catch (IOException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    
/**
     * 生成图形,保存到指定文件,文件类型为jpg
     *
     * 
@param fileName
     *            指定保存文件的路径及文件名
     * 
@param chart
     *            JFreeChart对象实例
     * 
@param w
     *            图像宽度
     * 
@param h
     *            图像高度
     
*/

    
public void SaveFileAsJPEG(String fileName, JFreeChart chart, int w, int h) {
        
// 生成图形,保存到指定文件,文件类型为jpg
        try {
            ChartUtilities.saveChartAsPNG(
new File(fileName), chart, w, h);
        }
 catch (IOException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    
public static void main(String[] args) {
        BarChartTest p 
= new BarChartTest();
        JFreeChart chart 
= p.createBarChart();
        
// 保存为图像文件
        p.SaveFileAsPNG("d://barchart.png", chart, 800600);
        
// 显示在GUI上
        ChartFrame frame = new ChartFrame("水果产量", chart);
        frame.pack();
        frame.setVisible(
true);
    }


}
这个执行后显示的是简单数据的平面柱状图,如果想实现简单数据的3D柱状图,只需要在创建JFreeChart对象时使用ChartFactory.createBarChart3D方法。如果想生成组合数据的柱状图,只需要修改DefaultCategoryDataset dataset = getZhDataSet();
简单数据运行结果如下:
简单数据平面柱状图 简单数据3D饼图

组合数据运行结果如下:

组合数据平面柱状图 组合数据3D饼图

使用createStackedBarChart3D方法创建叠加式的柱状图效果如下:

 欢迎大家研究讨论