欢迎访问宙启技术站
智能推送

利用Java函数快速生成符合业务需求的报表图表

发布时间:2023-05-21 02:32:15

随着机器学习、数据挖掘等技术的发展,大数据分析已经成为许多行业的风向标。作为数据挖掘的重要手段之一,数据可视化不仅可以将复杂的数据变得直观易懂,而且还能让人们更好地发现数据中的规律和趋势。因此,用Java函数快速生成符合业务需求的报表图表成为了许多开发者的追求。

I. 报表设计思路

在Java函数快速生成报表图表之前,先来了解一下报表的设计思路。

1. 明确目标

在设计报表之前,要清楚自己的目标是什么,是做数据可视化报表,还是统计相关数据指标,还是排版整洁易懂。

2. 确定数据来源

数据来源有很多,可以是数据库、电子表格、文本文件等,确定数据来源可以为我们后续选择实现方式提供方向。

3. 选择报表类型

报表类型众多,例如线图、柱状图、饼图等,我们应该选择属性合适的类型来展现数据。

4. 设计报表布局

报表布局应该体现报表的主题和呈现方式,将布局设计得合理、美观,方便用户阅读和引导用户发现数据诱人。

5. 添加数据展示元素

在报表图中添加数据展示元素能够让人们更直观地了解数据,包括数据标签、图例、坐标轴等。

II. 使用Java函数快速生成报表图表

Java SE 6中的JFreeChart图表库为我们快速生成报表图表提供了很多便利。我们可以用JFreeChart实现以下报表类型:

1. 线图

使用JFreeChart库,我们可以快速利用Java函数生成下面的线图报表。

import java.awt.Color;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

public class LineChartUtil {
    public static JFreeChart getLineChart(String title, String xTitle, String yTitle, 
    String[] category, String[] series, Double[][] data) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < series.length; i++) {
            for (int j = 0; j < category.length; j++) {
                dataset.setValue(data[i][j], series[i], category[j]);
            }
        }

        JFreeChart chart = ChartFactory.createLineChart(title, xTitle, yTitle, dataset, PlotOrientation.VERTICAL, true, true, true);

        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setBackgroundPaint(Color.white);
        plot.setDomainGridlinePaint(Color.gray);
        plot.setDomainGridlinesVisible(true);
        plot.setRangeGridlinePaint(Color.gray);
        plot.setRangeGridlinesVisible(true);
        plot.setRangeZeroBaselineVisible(true);

        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setTickLabelFont(new Font(null, Font.PLAIN, 12));

        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setAutoRangeIncludesZero(true);
        rangeAxis.setTickLabelFont(new Font(null, Font.PLAIN, 12));

        LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
        renderer.setBaseShapesFilled(true);
        renderer.setUseOutlinePaint(true);
        renderer.setBaseOutlinePaint(Color.white);

        return chart;
    }
}

2.柱状图

import java.awt.Color; 
import java.awt.Font; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.CategoryAxis; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.CategoryPlot; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.renderer.category.BarRenderer; 
import org.jfree.data.category.DefaultCategoryDataset; 

public class BarChartUtil {
	public static JFreeChart getBarChart(String chartTitle, String xLabel, String yLabel, String[] category, String[] series, Double[][] data) {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		for (int i = 0; i < series.length; i++) {
			for (int j = 0; j < category.length; j++) {
				dataset.setValue(data[i][j], series[i], category[j]);
			}
		}

		JFreeChart chart = ChartFactory.createBarChart(chartTitle, xLabel, yLabel, dataset, PlotOrientation.VERTICAL, true, true, true);

		CategoryPlot plot = (CategoryPlot) chart.getPlot();
		plot.setBackgroundPaint(Color.white);
		plot.setDomainGridlinePaint(Color.lightGray);
		plot.setDomainGridlinesVisible(true);
		plot.setRangeGridlinePaint(Color.lightGray);
		plot.setRangeGridlinesVisible(true);

	    CategoryAxis domainAxis = plot.getDomainAxis();
	    domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
	    
		NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
		rangeAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
		
		BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setSeriesPaint(0, new Color(115, 229, 255));
        renderer.setSeriesPaint(1, new Color(255, 123, 136));
        renderer.setDrawBarOutline(false);
		
        return chart;
	}
}

3.饼图

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Font; 
import java.text.DecimalFormat; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.labels.PieSectionLabelGenerator; 
import org.jfree.chart.labels.StandardPieSectionLabelGenerator; 
import org.jfree.chart.plot.PiePlot; 
import org.jfree.data.general.DefaultPieDataset; 
import org.jfree.ui.GradientPaintTransformType; 
import org.jfree.ui.RectangleInsets; 

public class PieChartUtil {
	public static JFreeChart getPieChart(String chartTitle, String[] labels, Double[] data) {
		DefaultPieDataset dataset = new DefaultPieDataset();
		for(int i = 0; i < labels.length; i++) {
			dataset.setValue(labels[i], data[i]);
		}

		JFreeChart chart = ChartFactory.createPieChart(chartTitle, dataset, true, true, false);

		PiePlot plot = (PiePlot) chart.getPlot();
//        plot.setSimpleLabels(true);
		plot.setBackgroundPaint(null);
		plot.setOutlinePaint(null);
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 18));
		plot.setNoDataMessage("No data available");
		plot.setShadowPaint(Color.white);
		plot.setCircular(false);
		
//        plot.setLabelGenerator(new CustomPieLabelGenerator());
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}/{1} ({2})",
        		new DecimalFormat("0"), new DecimalFormat("0%")));
        plot.setForegroundAlpha(1f);
        plot.setInteriorGap(new RectangleInsets(0, 0, 0, 0));
        GradientPaintTransformType gptt = GradientPaintTransformType.VERTICAL;
        plot.setDrawingSupplier(new ChartDrawingSupplier());
        plot.setStartAngle(270);
        plot.setDirection(Rotation.CLOCKWISE);
		
		return chart;
	}
}

III. 总结

Java函数在处理复杂数据时具有很好的优势。线图、柱状图和饼图是数据挖掘中最常用的类型,而这些类型也是Java函数中最为基础的类型。综上所述,Java函数对于快速生成符合业务需求的报表图表具有很大的帮助作用。