JFreeChart生成PDF或图片保存本地效果图及完整代码。

代码主要是计算不同组别平均值、标准差数据之间的绝对偏差。解决了columnKey的中文乱码问题
根据自己的需要做修改,有生成pdf和生成JPG图片,两种保存到本地的方式,客户端形式的也挺多的,代码内就不添加了。看完基础教程,理清楚一共有几个部分再进行相应功能的修改还是可以的。
放一下JFreeChart作者的github传送门
https://github.com/jfree?page=1&tab=repositories
在这里插入图片描述

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.block.BlockContainer;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.CategoryItemRendererState;
import org.jfree.chart.renderer.category.StatisticalBarRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.statistics.DefaultStatisticalCategoryDataset;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;

public class JPGBarChartDemo {
//模拟数据集
private static CategoryDataset createDataset() {
DefaultStatisticalCategoryDataset dataset = new DefaultStatisticalCategoryDataset();
dataset.add(0.07, 0.21, “Row 1”, “子”);
dataset.add(0.09, 0.28, “Row 1”, “丑”);
dataset.add(0.05, 0.18, “Row 1”, “寅”);
dataset.add(0.0, 0.0, “Row 1”, “卯”);
dataset.add(0.01, 0.1, “Row 1”, “辰”);
dataset.add(0.03, 0.2, “Row 1”, “巳”);
dataset.add(0.0, 0.01, “Row 1”, “午”);
dataset.add(0.0, 0.05, “Row 1”, “未”);
dataset.add(0.05, 0.18, “Row 1”, “申”);
dataset.add(0.04, 0.21, “Row 1”, “酉”);
dataset.add(0.01, 0.28, “Row 1”, “戌”);
dataset.add(0.05, 0.18, “Row 1”, “亥”);
return dataset;
}

private static JFreeChart createChart(CategoryDataset dataset) {
    JFreeChart chart = ChartFactory.createLineChart(
            "",
            "",
            "绝对偏差",
            dataset
    );
    //获取绘图实例并定制渲染器
    CategoryPlot plot = chart.getCategoryPlot();
    StatisticalBarRenderer renderer = new CustomStatisticalBarRenderer();
    plot.setRenderer(renderer);
    //移除图例,可以删掉代码自已定义命名
    chart.removeLegend();
    //设置Y轴-可以自定义,但是系统也会自动匹配刻度
    /*NumberAxis yAxis = (NumberAxis) plot.getRangeAxis();
    yAxis.setRangeWithMargins(-1, 2);
    yAxis.setTickUnit(new NumberTickUnit(0.1));
    yAxis.setAxisLinePaint(Color.PINK);*/
    //设置柱体
    renderer.setMinimumBarLength(0.0);
    renderer.setMaximumBarWidth(0.0);
    //中文乱码处理问题
    Font chineseFont = new Font("SimSun", Font.PLAIN, 12);
    CategoryAxis domainAxis = plot.getDomainAxis();
    domainAxis.setLabelFont(chineseFont);
    domainAxis.setTickLabelFont(chineseFont);
    // 设置 Y 轴字体
    ValueAxis rangeAxis = plot.getRangeAxis();
    rangeAxis.setLabelFont(chineseFont);

    return chart;
}

// 重写方法自定义渲染器在数据值处显示圆圈。
private static class CustomStatisticalBarRenderer extends StatisticalBarRenderer {
    @Override
    public CategoryItemLabelGenerator getItemLabelGenerator(int row, int column) {
        return new StandardCategoryItemLabelGenerator();
    }

    @Override
    public Paint getItemPaint(int row, int column) {
        return super.getItemPaint(row, column);
    }

    @Override
    public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea,
                         CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis,
                         CategoryDataset dataset, int row, int column, int pass) {
        super.drawItem(g2, state, dataArea, plot, domainAxis, rangeAxis, dataset, row, column, pass);

        double x = domainAxis.getCategoryMiddle(column, getColumnCount(), dataArea, plot.getDomainAxisEdge());
        double y = rangeAxis.valueToJava2D(dataset.getValue(row, column).doubleValue(), dataArea, plot.getRangeAxisEdge());

        Ellipse2D.Double circle = new Ellipse2D.Double(x - 3, y - 3, 6, 6);
        g2.setColor(Color.BLACK);
        g2.fill(circle);
    }
}

/**
 * 生成JPG图片
 *
 * @param args ignored.
 * @throws IOException IO异常
 */
public static void main(String[] args) throws IOException {
/* //创建一个JFreechart图表对象
    JFreeChart chart = createChart(createDataset());
    //创建一个文档对象
    PDFDocument pdfDoc = new PDFDocument();
    //设置标题
    pdfDoc.setTitle("PDFBarChartDemo1");
    //设置作者
    pdfDoc.setAuthor("jfree.org");
    //创建一个矩形图传入到创建页面方法
    Page page = pdfDoc.createPage(new Rectangle(612, 468));
    //获取页面的绘图上下文对象,用于绘制图形。
    PDFGraphics2D g2 = page.getGraphics2D();
    //用 JFreeChart 的 draw() 方法将图表绘制到 PDF 页面上。chart 是一个 JFreeChart 图表对象,new Rectangle(0, 0, 612, 468) 是要绘制的区域。
    chart.draw(g2, new Rectangle(0, 0, 612, 468));
    //生成PDF写入到文件位置
    pdfDoc.writeToFile(new File("E:\\XX\\Test\\PDFBarChartDemo1.pdf"));*/
    //创建一个JFreechart图表对象
    JFreeChart chart = createChart(createDataset());
    // 保存图表为JPG格式的图片
    try {
        ChartUtilities.saveChartAsJPEG(new File("E:\\XX\\Test\\chart1.jpg"), chart, 800, 600);
        System.out.println("Chart saved as JPG successfully.");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值