Jfreechart生成图表图片
1、先引入对应的依赖
<!--用于jfreechart生成图片 -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.19</version>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.17</version>
</dependency>
2、生成柱状图
/**
* 生成柱状图
* @return
*/
public static String DefaultCategoryDataset(){
// List<T> list
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
//添加数据
dataset.addValue(20, "", "瑞安市政府");
dataset.addValue(35, "", "三位一体");
dataset.addValue(10, "", "司鉴院都好好的");
dataset.addValue(38, "", "方法反反复复");
dataset.addValue(15, "", "瑞安市政府1");
dataset.addValue(23, "", "三位一体1");
dataset.addValue(3, "", "司鉴院都好好的1");
dataset.addValue(78, "", "方法反反复复1");
JFreeChart chart = ChartFactory.createBarChart3D(
"数据支撑业务",
"",//X轴的标签
"",//Y轴的标签
dataset, //图标显示的数据集合
PlotOrientation.VERTICAL, //图像的显示形式(水平或者垂直)
false,//是否显示子标题 就是图例 显示的话需要设置为true把56、99、100行代码取消注释
false,//是否生成提示的标签
true); //是否生成URL链接
//处理图形上的乱码
//处理主标题的乱码
chart.getTitle().setFont(new Font("宋体",Font.BOLD,18));
//处理子标题乱码
// chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
//获取图表区域对象
CategoryPlot categoryPlot = (CategoryPlot)chart.getPlot();
//获取X轴的对象
CategoryAxis3D categoryAxis3D = (CategoryAxis3D)categoryPlot.getDomainAxis();
// 设置X轴文本倾斜45度
categoryAxis3D.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
//获取Y轴的对象
NumberAxis3D numberAxis3D = (NumberAxis3D)categoryPlot.getRangeAxis();
//处理X轴上的乱码
categoryAxis3D.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//处理X轴外的乱码
categoryAxis3D.setLabelFont(new Font("宋体",Font.BOLD,15));
//处理Y轴上的乱码
numberAxis3D.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//处理Y轴外的乱码
numberAxis3D.setLabelFont(new Font("宋体",Font.BOLD,15));
//处理Y轴上显示的刻度,以10作为1格
numberAxis3D.setAutoTickUnitSelection(false);
NumberTickUnit unit = new NumberTickUnit(10);
numberAxis3D.setTickUnit(unit);
//获取绘图区域对象
BarRenderer3D barRenderer3D = (BarRenderer3D)categoryPlot.getRenderer();
//设置柱形图的宽度
barRenderer3D.setMaximumBarWidth(0.03);
//在图形上显示数字
barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
// 设置为false柱子上就不显示数字
barRenderer3D.setBaseItemLabelsVisible(false);
barRenderer3D.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
//设定柱子上面的颜色
CategoryPlot plot = (CategoryPlot) chart.getCategoryPlot();
BarRenderer3D customBarRenderer = (BarRenderer3D) plot.getRenderer();
customBarRenderer.setSeriesPaint(0, Color.decode("#005AB5"));
// 设置背景透明度
plot.setBackgroundAlpha(0.1f);
// 设置网格横线颜色
plot.setRangeGridlinePaint(Color.gray);
// 设置网格横线大小
plot.setDomainGridlineStroke(new BasicStroke(0.2F));
plot.setRangeGridlineStroke(new BasicStroke(0.2F));
// 设置图例展示位置
// LegendTitle legend = chart.getLegend();
// legend.setPosition(RectangleEdge.RIGHT);
//bar实例化
BarRenderer renderer = (BarRenderer) plot.getRenderer();
//设置条形图上bar是否显示背景阴影
renderer.setDrawBarOutline(false);
//在D盘目录下生成图片
File file = new File("D:/数据支撑业务.jpeg");
try {
ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
System.out.println(getImageBase(file.getPath()));
} catch (IOException e) {
e.printStackTrace();
}
//使用ChartFrame对象显示图像
/*ChartFrame frame = new ChartFrame("xyz",chart);
frame.setVisible(true);
frame.pack();*/
return getImageBase(file.getPath());
}
public static void main(String[] args) {
DefaultCategoryDataset();
}
public static void main(String[] args) {
double[] forwardItems = {12,34,45};//转发量
double[] commentItems = {24,14,35};//评论量
// double[] seeItems = {};//查看量
String[] items = { "残疾人联合会", "财政局", "公用集团" };
String[] series = new String[] { "已归集", "未归集"};
double[][] data = new double[][] { forwardItems, commentItems};
CategoryDataset barDataset = DatasetUtilities.createCategoryDataset(series, items, data);
DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();
lineDataset.addValue(10, "归集数据量", items[0]);
lineDataset.addValue(5, "归集数据量", items[1]);
lineDataset.addValue(25, "归集数据量", items[2]);
getPhoFilePathYulun(barDataset, lineDataset, "图片标题", "pubOpinion");
}
/**
*
* 柱状图(堆叠)+折线图
* @param categoryBarDataset 柱状图数据
* @param categoryLineDataset 折线图数据
* @param title 图片标题
* @return
*/
public static String getPhoFilePathYulun(CategoryDataset categoryBarDataset, CategoryDataset categoryLineDataset, String title, String fileName){
JFreeChart chart = createCharts(categoryBarDataset,categoryLineDataset, title);
// 处理主标题的乱码
chart.getTitle().setFont(new Font("黑体", Font.BOLD, 18));
chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,10));//图例文字
// 获取图表区域对象
CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
// 获取X轴的对象
CategoryAxis categoryAxis = (CategoryAxis) categoryPlot.getDomainAxis();
categoryAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));
categoryAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));
// 设置X轴文本倾斜45度
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
// 获取Y轴的对象
NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis();
// 处理X轴上的乱码
categoryAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));
// 处理X轴外的乱码
categoryAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));
// 处理Y轴上的乱码
numberAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));
// 处理Y轴外的乱码
numberAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));
/*String path = System.getProperty("user.dir") + File.separator + "template" + File.separator;
String filePath = path + fileName + ".png";
File file = new File(filePath);
try {
ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
} catch (IOException e) {
e.printStackTrace();
}
return filePath;*/
ChartFrame chartFrame=new ChartFrame("汽车口碑排行榜",chart);
CategoryPlot plot = (CategoryPlot) chart.getCategoryPlot();
BarRenderer customBarRenderer = (BarRenderer) plot.getRenderer();
//设置柱状图颜色
// customBarRenderer.setSeriesPaint(0, Color.decode("#F75000"));
// customBarRenderer.setSeriesPaint(1, Color.decode("#FFD306"));
//设置柱形图的宽度
customBarRenderer.setMaximumBarWidth(0.03);
//在图形上显示数字
customBarRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
// 设置为false柱子上就不显示数字
customBarRenderer.setBaseItemLabelsVisible(false);
customBarRenderer.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
// 设置背景透明度
plot.setBackgroundAlpha(0.1f);
// 设置网格横线颜色
plot.setRangeGridlinePaint(Color.gray);
// 设置网格横线大小
plot.setDomainGridlineStroke(new BasicStroke(0.2F));
plot.setRangeGridlineStroke(new BasicStroke(0.2F));
//以合适的大小展现图形
chartFrame.pack();
//在D盘目录下生成图片
File file = new File("D:/数据归集情况.jpeg");
try {
ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
} catch (IOException e) {
e.printStackTrace();
}
//图形是否可见
// chartFrame.setVisible(true);
return getImageBase(file.getPath());
}
/**
* 初始化
* @param categoryBarDataset
* @param categoryLineDataset
* @return
*/
private static JFreeChart createCharts(CategoryDataset categoryBarDataset, CategoryDataset categoryLineDataset, String title) {
//参数: title,x轴说明,y轴说明,图例
JFreeChart chart = ChartFactory.createBarChart(title, "", "", categoryBarDataset, PlotOrientation.VERTICAL,
true, true, true);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
//设置折线图颜色
/*BarRenderer customBarRenderer = (BarRenderer) plot.getRenderer();
customBarRenderer.setSeriesPaint(0, Color.decode("#F75000"));
customBarRenderer.setSeriesPaint(1, Color.decode("#FFD306"));
customBarRenderer.setSeriesPaint(2, Color.decode("#00A600"));*/
// set right margin
plot.getDomainAxis().setUpperMargin(0.1);
// set X axis Label lines
plot.getDomainAxis().setMaximumCategoryLabelLines(2);
//NumberAxis na = (NumberAxis) plot.getRangeAxis();
// stack bar chart
StackedBarRenderer rederer = new StackedBarRenderer();
plot.setRenderer(0, rederer);
rederer.setBaseItemLabelsVisible(false);
rederer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
rederer.setBaseItemLabelFont(new Font("Calibri", Font.ITALIC, 15));
rederer.setMaximumBarWidth(0.07);
rederer.setMinimumBarLength(0.1);
rederer.setBarPainter(new StandardBarPainter());
rederer.setSeriesPaint(0, new Color(65,105,225));
rederer.setSeriesPaint(1, new Color(203,196,52));
rederer.setSeriesPaint(2, new Color(128,7,248));
// line chart
LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();
plot.setRenderer(1, lineRenderer);
lineRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
lineRenderer.setBaseItemLabelFont(new Font("Calibri", Font.ITALIC, 15));
lineRenderer.setBasePositiveItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.INSIDE12, TextAnchor.BASELINE_LEFT));
lineRenderer.setBaseItemLabelsVisible(false);
lineRenderer.setBaseShapesVisible(false);
// point style
lineRenderer.setSeriesShape(0, new Rectangle(5, 5));
lineRenderer.setBaseShapesVisible(false);
NumberAxis rightYAxis = new NumberAxis("");
rightYAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
plot.setRangeAxis(1, rightYAxis);
plot.setDataset(1, categoryLineDataset);
plot.mapDatasetToRangeAxis(1, 1);
// set render order
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
return chart;
}
调用方法
@ApiOperation(value = "下载健康报告文件")
@GetMapping("/downloadResWord")
public void downloadResWord(HttpServletResponse response) throws IOException, TemplateException, BizException {
String newDte = DateUtil.dateToString(new Date(), "yyyyMMddHHmmss");
String startMerge = "<w:vMerge w:val=\"restart\"/>";
String endMerge = "<w:vMerge/>";
Map<String, Object> dataMap = new HashMap<>(16);
// 手动填充数据
List<HealthReport> healthReport = healthReportService.list();
dataMap.put("healthReport",healthReport.get(0));
//数据业务支撑图表数据查询 业务场景多少事项
Page<BusinessScene> page = new Page<>();
Page<BusinessSceneDTO> data = businessSceneService.getBusinessScenePage(page,"","");
// 生成柱状图表的数据
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String imageStr = "";
if(data.getRecords().size() >0) {
for (BusinessSceneDTO dto: data.getRecords()) {
dataset.addValue(dto.getMatterTotal(),"",dto.getName());
}
imageStr = JfreeChartUtil.DefaultCategoryDataset(dataset, "数据支撑业务",2);
}
dataMap.put("imageStr", imageStr);
// 业务场景所需资源项清单-表格数据
List<Map<String, Object>> dataList = new ArrayList<>();
List<BusinessScene> list = businessSceneService.list(Wrappers.<BusinessScene>lambdaQuery()
.orderByDesc(BusinessScene::getUpdateTime));
if(list.size() >0) {
int a = 1;
for (int i=0;i< list.size(); i++) {
// 根据场景ID查询事项
List<BusinessMatter> matterList = matterService.list(Wrappers.<BusinessMatter>lambdaQuery()
.eq(BusinessMatter::getBusinessId, list.get(i).getId()));
if(matterList.size() >0) {
for (int j = 0; j < matterList.size(); j++) {
Map<String, Object> map = new HashMap<>();
map.put("number", a);
// 场景名称
map.put("name", list.get(i).getName());
map.put("matterName", matterList.get(j).getMatterName());
if(j == 0) {
map.put("startMerge", startMerge);
} else {
map.put("endMerge", endMerge);
}
dataList.add(map);
}
a++;
}
}
}
dataMap.put("dataList", dataList);
// 风险规则列表数据
List<RiskPlanning> riskPlanningList = riskPlanningService.list(Wrappers.<RiskPlanning>lambdaQuery()
.orderByDesc(RiskPlanning::getUpdateTime));
dataMap.put("riskPlanningList", riskPlanningList);
// 异常监测列表数据
List<AnomalyDetection> anomalyDetectionList = anomalyDetectionService.list(Wrappers.<AnomalyDetection>lambdaQuery()
.orderByDesc(AnomalyDetection::getUpdateTime));
dataMap.put("anomalyDetectionList", anomalyDetectionList);
// 数据归集告警列表数据
List<AlarmManage> alarmManageList = alarmManageService.getAlarmManageList(0);
dataMap.put("alarmManageList", alarmManageList);
// 数据共享告警
List<AlarmManage> alarmManages = alarmManageService.getAlarmManageList(1);
dataMap.put("alarmManages", alarmManages);
// 提供接口图表数据列表
/*Date date = new Date();
String startDate = DateUtil.dateToString(DateUtil.addDate(date,-7),DATE_FORMAT);
String endDate = DateUtil.dateToString(date,DATE_FORMAT);*/
List<CountDataDTO> callSituation = dataCollectionMapper.callSituationAll();
// 生成柱状图表的数据
DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();
String interFaceImag = "";
if(callSituation.size() >0) {
for (int k=0; k<callSituation.size();k++) {
if(k<10){
dataset1.addValue(Double.valueOf(callSituation.get(k).getValue()),"",callSituation.get(k).getAbscissaName());
}
}
interFaceImag = JfreeChartUtil.DefaultCategoryDataset(dataset1, "接口调用量",100000);
}
dataMap.put("interFaceImag", interFaceImag);
@SuppressWarnings("deprecation")
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(this.getClass(), "/file");
//文件名,获取模板
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(("数据健康分析报告" + newDte + ".doc").getBytes("GBK"), "ISO-8859-1"));
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
Template template = configuration.getTemplate("数据健康分析报告.ftl", "utf-8");
template.process(dataMap, out);
out.flush();
out.close();
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战