Springboot整合 jfreechart, 实现纯后端生成 折线图、饼状图、柱状图


不多说,直接开搞。


①pom.xml 导入核心依赖

        <!--用于生成图片  -->
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.0.19</version>
        </dependency>
        


② 创建工具类 MyChartUtil.java
 

import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;

/**
 * @Author: JCccc
 * @Date: 2022-6-15 16:53
 * @Description:
 */
public class MyChartUtil {

    /**
     * 生成饼状图
     * @param dataset
     * @param filePath
     * @return
     */
    public static String createPieChart( PieDataset dataset,String filePath) {

        JFreeChart chart = ChartFactory.createPieChart("xx饼状图", dataset, true, true, false);
        // 设置抗锯齿,防止字体显示不清楚
        chart.setTextAntiAlias(false);
        PiePlot plot = (PiePlot) chart.getPlot();
        //边框线为白色
        plot.setOutlinePaint(Color.white);
        //连接线类型为直线
        plot.setLabelLinkStyle(PieLabelLinkStyle.QUAD_CURVE);
        //设置Label字体
        plot.setLabelFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD, 12));
        //设置legend字体
        chart.getLegend().setItemFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD, 12));
        // 图片中显示百分比:默认方式
        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}={1}({2})"));
        // 指定图片的透明度(0.0-1.0)
        plot.setForegroundAlpha(1.0f);
        // 指定显示的饼图上圆形(false)还椭圆形(true)
        plot.setCircular(true);
        //设置图表背景透明度
        plot.setBackgroundAlpha(0f);
        // 设置背景色为白色
        chart.setBackgroundPaint(Color.WHITE);
        // 设置标注无边框
        chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
        // 标注位于右侧
        chart.getLegend().setPosition(RectangleEdge.RIGHT);
        // 设置图标题的字体
        java.awt.Font font = new java.awt.Font("黑体", java.awt.Font.CENTER_BASELINE, 20);
        TextTitle textTitle = new TextTitle("xx饼状图");
        textTitle.setFont(font);
        chart.setTitle(textTitle);
        //图片存放位置
        try {
            FileOutputStream outputStream = new FileOutputStream(filePath);
            ChartUtilities.writeChartAsJPEG(outputStream, 1.0f, chart, 800, 450, null);
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 生成柱状图
     * @param dataset
     * @param filePath
     */
    public static void createBarChart( CategoryDataset dataset,String filePath) {

        final JFreeChart chart = ChartFactory.createBarChart(
                "xxx柱状图",
                "年份", // 目录轴的显示标签
                "数值", // 数值轴的显示标签
                dataset, // 数据集
                PlotOrientation.VERTICAL, // 图表方向
                true, // 是否显示图例,对于简单的柱状图必须为false
                true, // 是否生成提示工具
                false); // 是否生成url链接
        final CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
        final NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
        final CategoryAxis domainAxis = categoryplot.getDomainAxis();
        // 设置背景透明度
        categoryplot.setBackgroundAlpha(0f);
        /*------设置X轴坐标上的文字-----------*/
        domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
        /*------设置X轴的标题文字------------*/
        domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
        /*------设置Y轴坐标上的文字-----------*/
        numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
        /*------设置Y轴的标题文字------------*/
        numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));
        /*------这句代码解决了底部汉字乱码的问题-----------*/
        chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
        /******* 这句代码解决了标题汉字乱码的问题 ********/
        chart.getTitle().setFont(new Font("宋体", Font.PLAIN, 12));

        try {
            FileOutputStream out = new FileOutputStream(filePath);
            ChartUtilities.writeChartAsJPEG(out, 1.0f, chart, 800, 450, null);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 生成折线图
     * @param ds
     * @param filePath
     */
    public static void createLineChart(DefaultCategoryDataset ds, String filePath) {
        try {
            // 创建柱状图.标题,X坐标,Y坐标,数据集合,orientation,是否显示legend,是否显示tooltip,是否使用url链接
            JFreeChart chart = ChartFactory.createLineChart("XX次数趋势图", "", "次数", ds, PlotOrientation.VERTICAL,false, true, true);
            chart.setBackgroundPaint(Color.WHITE);
            Font font = new Font("宋体", Font.BOLD, 12);
            chart.getTitle().setFont(font);
            chart.setBackgroundPaint(Color.WHITE);
            // 配置字体(解决中文乱码的通用方法)
            // X轴
            Font xfont = new Font("仿宋", Font.BOLD, 12);
            // Y轴
            Font yfont = new Font("宋体", Font.BOLD, 12);
            // 图片标题
            Font titleFont = new Font("宋体", Font.BOLD, 12);
            CategoryPlot categoryPlot = chart.getCategoryPlot();
            categoryPlot.getDomainAxis().setLabelFont(xfont);
            categoryPlot.getDomainAxis().setLabelFont(xfont);
            categoryPlot.getRangeAxis().setLabelFont(yfont);
            chart.getTitle().setFont(titleFont);
            categoryPlot.setBackgroundPaint(Color.WHITE);
            // x轴 // 分类轴网格是否可见
            categoryPlot.setDomainGridlinesVisible(true);
            // y轴 //数据轴网格是否可见
            categoryPlot.setRangeGridlinesVisible(true);
            // 设置网格竖线颜色
            categoryPlot.setDomainGridlinePaint(Color.LIGHT_GRAY);
            // 设置网格横线颜色
            categoryPlot.setRangeGridlinePaint(Color.LIGHT_GRAY);
            // 没有数据时显示的文字说明
            categoryPlot.setNoDataMessage("没有数据显示");
            // 设置曲线图与xy轴的距离
            categoryPlot.setAxisOffset(new RectangleInsets(0d, 0d, 0d, 0d));
            // 设置面板字体
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
            // 取得Y轴
            NumberAxis rangeAxis = (NumberAxis) categoryPlot.getRangeAxis();
            rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            rangeAxis.setAutoRangeIncludesZero(true);
            rangeAxis.setUpperMargin(0.20);
            rangeAxis.setLabelAngle(Math.PI / 2.0);
            // 取得X轴
            CategoryAxis categoryAxis = (CategoryAxis) categoryPlot.getDomainAxis();
            // 设置X轴坐标上的文字
            categoryAxis.setTickLabelFont(labelFont);
            // 设置X轴的标题文字
            categoryAxis.setLabelFont(labelFont);
            // 横轴上的 Lable 45度倾斜
            categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
            // 设置距离图片左端距离
            categoryAxis.setLowerMargin(0.0);
            // 设置距离图片右端距离
            categoryAxis.setUpperMargin(0.0);
            // 获得renderer
            LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryPlot.getRenderer();
            // 是否显示折点
            lineandshaperenderer.setBaseShapesVisible(true);
            // 是否显示折线
            lineandshaperenderer.setBaseLinesVisible(true);
            // series 点(即数据点)间有连线可见 显示折点数据
            lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            lineandshaperenderer.setBaseItemLabelsVisible(true);
            ChartUtilities.saveChartAsJPEG(new File(filePath), chart, 1207, 500);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //获取模拟数据
        DefaultCategoryDataset mDataset = getCateGoryDataset();

        String filePath = "d:/zhe.jpg";
        //生成折线图
        createLineChart(mDataset,filePath);

        String filePath2 = "d:/zhu.jpg";
        //生成柱状图
        createBarChart(mDataset,filePath2);

        //获取模拟数据
        DefaultPieDataset pieDataset = getPieDataset();
        String filePath3 = "d:/bing.jpg";
        //生产饼状图
        createPieChart(pieDataset,filePath3);

    }

    private static DefaultPieDataset getPieDataset() {
        DefaultPieDataset pieDataset = new DefaultPieDataset();
        pieDataset.setValue("go", new Double(10));
        pieDataset.setValue("C++", new Double(13));
        pieDataset.setValue("C", new Double(12));
        pieDataset.setValue("mysql", new Double(10));
        pieDataset.setValue("Java", new Double(55.1));
        pieDataset.setValue("go", new Double(9.9));
        pieDataset.setValue("python", new Double(10));
        return pieDataset;
    }

    private static DefaultCategoryDataset getCateGoryDataset() {
        DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
        mDataset.addValue(1, "First", "2013");
        mDataset.addValue(3, "First", "2014");
        mDataset.addValue(2, "First", "2015");
        mDataset.addValue(6, "First", "2016");
        mDataset.addValue(5, "First", "2017");
        mDataset.addValue(12, "First", "2018");
        mDataset.addValue(14, "Second", "2013");
        mDataset.addValue(13, "Second", "2014");
        mDataset.addValue(12, "Second", "2015");
        mDataset.addValue(9, "Second", "2016");
        mDataset.addValue(5, "Second", "2017");
        mDataset.addValue(7, "Second", "2018");
        return mDataset;
    }


}

柱状、折线 都用 DefaultCategoryDataset 来装需要用到数据 ;

饼状 用 DefaultPieDataset 来装需要用到数据;



注意点 ,折线图和柱状图 里面涉及到 多线或多柱 ,也是可以支持的,rowKey 一样的为同个,不同rowKey就不同线/柱。

调用一下看看效果:
 

    public static void main(String[] args) {
        //获取模拟数据
        DefaultCategoryDataset mDataset = getCateGoryDataset();

        String filePath = "d:/zhe.jpg";
        //生成折线图
        createLineChart(mDataset,filePath);

        String filePath2 = "d:/zhu.jpg";
        //生成柱状图
        createBarChart(mDataset,filePath2);

        //获取模拟数据
        DefaultPieDataset pieDataset = getPieDataset();
        String filePath3 = "d:/bing.jpg";
        //生产饼状图
        createPieChart(pieDataset,filePath3);

    }

可以看到三个图片都出来了:

 饼状图效果:
 

 折线图:

柱状图:


好了,该篇就到这

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小目标青年

对你有帮助的话,谢谢你的打赏。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值