pom文件中添加jar包的引用
<!--用于生成图片 -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.19</version>
</dependency>
项目代码
package com.jeeplus.modules.management.web;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
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.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
public class JFreeChartUtil {
public static void main(String[] args) {
pie();
line();
czZzt();
spZzt();
}
//饼状图
public static void pie() {
DefaultPieDataset pds = new DefaultPieDataset();
pds.setValue("00点-04点", 100);
pds.setValue("04点-08点", 200);
pds.setValue("08点-12点", 300);
pds.setValue("12点-16点", 400);
pds.setValue("16点-20点", 500);
pds.setValue("20点-24点", 600);
String filePath = "d:/pie.jpg";
createPieChart(pds,filePath);
}
//折线图
public static void line() {
DefaultCategoryDataset ds = new DefaultCategoryDataset();
ds.setValue(10, "ibm", "2018-05-21");
ds.setValue(20, "ibm", "2018-05-22");
ds.setValue(32, "ibm", "2018-05-23");
ds.setValue(25, "ibm", "2018-05-24");
ds.setValue(0, "ibm", "2018-05-25");
ds.setValue(4, "ibm", "2018-05-26");
ds.setValue(32, "ibm", "2018-05-27");
ds.setValue(0, "ibm", "2018-05-28");
ds.setValue(358, "ibm", "2018-05-29");
ds.setValue(4, "ibm", "2018-05-30");
String filePath = "d:/lgg.jpg";
createLineChart(ds,filePath);
}
//水平柱状图柱状图
public static void spZzt() {
JFreeChart chart = ChartFactory.createBarChart("环境污染指数分布图",
"", "", createDataset2(),PlotOrientation.HORIZONTAL, //显示方向
false, //是否显示图例如图一的均值、差值
false, // 是否生成工具
false); // 是否生成URL链接
iSetBarSpChart(chart);
try {
ChartUtilities.saveChartAsJPEG(new File("d:/spZzt.jpg"),chart, 800,500);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//垂直柱状图
public static void czZzt() {
JFreeChart chart = ChartFactory.createBarChart("环境污染指数分布图",
"城市", "污染指数", createDataset2(),PlotOrientation.VERTICAL, //显示方向
false, //是否显示图例如图一的均值、差值
false, // 是否生成工具
false); // 是否生成URL链接
iSetBarCzChart(chart);
try {
ChartUtilities.saveChartAsJPEG(new File("d:/czZzt.jpg"),chart, 800,500);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 数据集合
*
* @return
*/
public static CategoryDataset createDataset2() {
DefaultCategoryDataset result = new DefaultCategoryDataset();
String series1 = "海南";
String series2 = "青藏";
String series3 = "青海";
String series4 = "上海";
String series5 = "北京";
String series6 = "山西";
String type1 = "城市状况";
result.addValue(0.1, type1, series1);
result.addValue(0.2, type1, series2);
result.addValue(0.3, type1, series3);
result.addValue(0.4, type1, series4);
result.addValue(0.5, type1, series5);
result.addValue(0.7, type1, series6);
return result;
}
/**
* 水平柱状图的样式
*
* @param chart
*/
public static void iSetBarSpChart(JFreeChart chart) {
CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身
ValueAxis rangeAxis = categoryplot.getRangeAxis();
CategoryAxis domainAxis = categoryplot.getDomainAxis();
// 设置Y轴的提示文字样式
rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12));
// 设置Y轴刻度线的长度
rangeAxis.setTickMarkInsideLength(10f);
// rangeAxis.setTickMarkOutsideLength(10f);
// 设置X轴下的标签文字
domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12));
// 设置X轴上提示文字样式
domainAxis.setTickLabelFont(new Font("微软雅黑", Font.PLAIN, 12));
// 设置Y轴的数字为百分比样式显示 start
// NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis();
// DecimalFormat df = new DecimalFormat("0.0%");
// vn.setNumberFormatOverride(df);
// 设置Y轴的数字为百分比样式显示 end
// 使柱状图反过来显示
// vn.setInverted(true);
// vn.setVerticalTickLabels(true);
// 自定义柱状图中柱子的样式
BarRenderer brender = (BarRenderer) categoryplot.getRenderer();
// 设置柱状图的顶端显示数字
brender.setIncludeBaseInRange(true);
brender.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
brender.setBaseItemLabelsVisible(true);
// 设置柱子为平面图不是立体的
brender.setBarPainter(new StandardBarPainter());
// 设置柱状图之间的距离0.1代表10%;
// brender.setItemMargin(0.1);
// 设置柱子的阴影,false代表没有阴影
brender.setShadowVisible(false);
// 设置图的背景为白色
categoryplot.setBackgroundPaint(Color.WHITE);
// 设置背景虚线的颜色
categoryplot.setRangeGridlinePaint(Color.decode("#B6A2DE"));
// 去掉柱状图的背景边框,使边框不可见
categoryplot.setOutlineVisible(false);
// 设置标题的字体样式
chart.getTitle().setFont(new Font("微软雅黑", Font.PLAIN, 24));
// 设置图表下方图例上的字体样式
/*------这句代码解决了底部汉字乱码的问题-----------*/
// chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
categoryplot.setRenderer(brender);
}
/**
* 垂直柱状图的样式
*
* @param chart
*/
public static void iSetBarCzChart(JFreeChart chart) {
CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身
ValueAxis rangeAxis = categoryplot.getRangeAxis();
CategoryAxis domainAxis = categoryplot.getDomainAxis();
// 设置Y轴的提示文字样式
rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12));
// 设置Y轴刻度线的长度
rangeAxis.setTickMarkInsideLength(10f);
// rangeAxis.setTickMarkOutsideLength(10f);
// 设置X轴下的标签文字
domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12));
// 设置X轴上提示文字样式
domainAxis.setTickLabelFont(new Font("微软雅黑", Font.PLAIN, 12));
NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis();
// 设置Y轴的数字为百分比样式显示
DecimalFormat df = new DecimalFormat("0.0%");
vn.setNumberFormatOverride(df);
// 使柱状图反过来显示
// vn.setInverted(true);
// vn.setVerticalTickLabels(true);
// 自定义柱状图中柱子的样式
BarRenderer brender = new BarRenderer();
brender.setSeriesPaint(1, Color.decode("#C0504D")); // 给series1 Bar
brender.setSeriesPaint(0, Color.decode("#E46C0A")); // 给series2 Bar
brender.setSeriesPaint(2, Color.decode("#4F81BD")); // 给series3 Bar
brender.setSeriesPaint(3, Color.decode("#00B050")); // 给series4 Bar
brender.setSeriesPaint(4, Color.decode("#7030A0")); // 给series5 Bar
brender.setSeriesPaint(5, Color.decode("#00BF00")); // 给series6 Bar
// 设置柱状图的顶端显示数字
brender.setIncludeBaseInRange(true);
brender.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
brender.setBaseItemLabelsVisible(true);
// 设置柱子为平面图不是立体的
brender.setBarPainter(new StandardBarPainter());
// 设置柱状图之间的距离0.1代表10%;
brender.setItemMargin(0.1);
// 设置柱子的阴影,false代表没有阴影
brender.setShadowVisible(false);
// 设置图的背景为白色
categoryplot.setBackgroundPaint(Color.WHITE);
// 设置背景虚线的颜色
categoryplot.setRangeGridlinePaint(Color.decode("#B6A2DE"));
// 去掉柱状图的背景边框,使边框不可见
categoryplot.setOutlineVisible(false);
// 设置标题的字体样式
chart.getTitle().setFont(new Font("微软雅黑", Font.PLAIN, 24));
// 设置图表下方图例上的字体样式
/*------这句代码解决了底部汉字乱码的问题-----------*/
// chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
categoryplot.setRenderer(brender);
}
/**
* 饼图
* @param pds
* @param filePath
*/
public static void createPieChart(DefaultPieDataset pds, String filePath) {
try {
// 分别是:显示图表的标题、需要提供对应图表的DateSet对象、是否显示图例、是否生成贴士以及是否生成URL链接
JFreeChart chart = ChartFactory.createPieChart("今日放屁次数:时间段分布图", pds, false, false, true);
// 如果不使用Font,中文将显示不出来
Font font = new Font("宋体", Font.BOLD, 12);
// 设置图片标题的字体
chart.getTitle().setFont(font);
// 得到图块,准备设置标签的字体
PiePlot plot = (PiePlot) chart.getPlot();
// 设置标签字体
plot.setLabelFont(font);
plot.setStartAngle(new Float(3.14f / 2f));
plot.setOutlineVisible(false);
// 设置plot的前景色透明度
plot.setForegroundAlpha(0.7f);
// 设置plot的背景色透明度
plot.setBackgroundAlpha(0.0f);
// 设置标签生成器(默认{0})
// {0}:key {1}:value {2}:百分比 {3}:sum
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1}占{2})"));
// 将内存中的图片写到本地硬盘
ChartUtilities.saveChartAsJPEG(new File(filePath), chart, 600, 300);
} 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("近30天每日放屁次数趋势图", "", "次数", 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);
// 配置字体(解决中文乱码的通用方法)
Font xfont = new Font("仿宋", Font.BOLD, 12); // X轴
Font yfont = new Font("宋体", Font.BOLD, 12); // Y轴
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 = (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();
}
}
}