使用JFreeChart生成条形图

1. 准备工作

  • 下载JFreeChart,我使用的版本为1.0.19,相关内容参见JFreeChart,下载链接为https://sourceforge.net/projects/jfreechart/files/
  • 导入jar包,本例子使用jcommon-1.0.23.jarjfreechart-1.0.19.jar,所以只需要导入这两个包即可。在java项目下新建目录lib,将上述两个包复制到该目录下,然后在Eclipse下选中这两个包,右键单击选中Build Path菜单项,接着单击Add to Build Path子项添加jar包到该项目中。

2. 实例

数据如下:
这里写图片描述

完整代码如下:

//CreateImage.java
package jfreechart_test;

import java.awt.Font;
import java.io.File;
import java.io.IOException;

import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.data.category.DefaultCategoryDataset;

public class CreateImage {
    public static void createImage() {
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.addValue(26, "参考值", "MMSE");
        dataset.addValue(4, "参考值", "言语记忆N5");
        dataset.addValue(29, "参考值", "注意功能");
        dataset.addValue(30, "参考值", "言语流畅性");
        dataset.addValue(22, "参考值", "命名测验");
        dataset.addValue(38, "参考值", "执行功能");

        dataset.addValue(28, "测量值", "MMSE");
        dataset.addValue(4, "测量值", "言语记忆N5");
        dataset.addValue(30, "测量值", "注意功能");
        dataset.addValue(46, "测量值", "言语流畅性");
        dataset.addValue(24, "测量值", "命名测验");
        dataset.addValue(48, "测量值", "执行功能");

        // 创建主题样式
        StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
        // 设置标题字体
        standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 15));
        // 设置图例的字体
        standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 12));
        // 设置轴向的字体
        standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 12));
        // 应用主题样式
        ChartFactory.setChartTheme(standardChartTheme);

        JFreeChart barChart = ChartFactory.createBarChart("认知能力得分", null, null, dataset,
                PlotOrientation.VERTICAL, true, true, false);
        //图表背景色
        barChart.setBackgroundPaint(ChartColor.WHITE);

        CategoryPlot categoryplot = (CategoryPlot) barChart.getPlot();
        categoryplot.setBackgroundPaint(ChartColor.WHITE);

        //柱图的呈现器
        BarRenderer renderer = new BarRenderer();
        renderer.setBarPainter(new StandardBarPainter());//取消渐变效果
        renderer.setIncludeBaseInRange(true); // 显示每个柱的数值,并修改该数值的字体属性
        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        renderer.setBaseOutlinePaint(ChartColor.BLACK); // 设置柱子边框颜色
        renderer.setDrawBarOutline(true); // 设置柱子边框可见
        renderer.setItemMargin(0.05); // 组内柱子间隔为组宽的10%
        renderer.setMaximumBarWidth(0.05);// 设置条形柱最大宽度
        renderer.setBaseItemLabelsVisible(true, true);
        renderer.setShadowVisible(false);//不显示阴影

        categoryplot.setRenderer(renderer); // 给柱图添加呈现器


        //修改x轴标签方向
        CategoryAxis categoryaxis = barChart.getCategoryPlot().getDomainAxis();
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);


        int width = 500; //图像宽度
        int height = 380; //图像高度
        File BarChart = new File("d:\\test.png");
        try {
            ChartUtilities.saveChartAsJPEG(BarChart, barChart, width, height);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

//CreateImageIns.java
package jfreechart_test;

public class CreateImageIns {
    public static void main(String[] args) {
        CreateImage.createImage();
    }
}

结果展示:
这里写图片描述

3. 其他

1. 改变柱子颜色

renderer.setSeriesPaint(i, ChartColor.WHITE);//将第i个柱子设置为白色

在上述CreateImage.java的createImage()方法中的柱图呈现器下面添加如下代码:

//设置柱子颜色
for(int i = 0; i < 12; i++) {
    if(i % 2 == 0) {
        renderer.setSeriesPaint(i, ChartColor.GRAY);
    } else {
        renderer.setSeriesPaint(i, ChartColor.WHITE);
    }
}       

结果为:
这里写图片描述

posted @ 2017-01-12 17:19  海拉鲁捡垃圾  阅读(459)  评论(0编辑  收藏  举报