代码主要是计算不同组别平均值、标准差数据之间的绝对偏差。解决了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();
}
}
}