/** * 画图 * * @param histogramValueVoList * @return */ private ImageEntity generatePicture(List<HistogramValueVo> histogramValueVoList, String pictureTitle, String xName, String yName, String dataName) { DefaultCategoryDataset dateSet = new DefaultCategoryDataset(); for (HistogramValueVo histogramValueVo : histogramValueVoList) { dateSet.setValue(histogramValueVo.getValue(), dataName, histogramValueVo.getName()); } /** * 标题,目录轴的显示标签,数值的显示标签,数据,图标方向 水平/垂直,是否显示图例,是否生成工具,是否生成URL链接 */ JFreeChart chart = ChartFactory.createBarChart(pictureTitle, xName, yName, dateSet, PlotOrientation.HORIZONTAL, true, true, false); //头部字体修改 chart.getTitle().setFont(FontUtils.getFont("simsun.ttf", "新宋体", Font.BOLD, 20f)); //图部分 CategoryPlot categoryPlot = chart.getCategoryPlot(); //背景颜色 categoryPlot.setBackgroundPaint(new Color(241, 241, 245)); //X轴 CategoryAxis domainAxis = categoryPlot.getDomainAxis(); //X轴下标 90°显示 domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); //自动换行 最多显示多少行 domainAxis.setMaximumCategoryLabelLines(100); //下标 domainAxis.setLabelFont(FontUtils.getFont("simsun.ttf", "黑体", Font.PLAIN, 14f)); //X轴标题 domainAxis.setTickLabelFont(FontUtils.getFont("simsun.ttf", "宋体", Font.PLAIN, 14f)); //Y轴 ValueAxis rangeAxis = categoryPlot.getRangeAxis(); //下标 rangeAxis.setLabelFont(FontUtils.getFont("simsun.ttf", "黑体", Font.PLAIN, 14f)); //Y轴标题 rangeAxis.setTickLabelFont(FontUtils.getFont("simsun.ttf", "宋体", Font.PLAIN, 14f)); NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis(); //取消自动设置Y轴刻度 numberAxis.setAutoTickUnitSelection(false); //刻度大小 numberAxis.setTickUnit(new NumberTickUnit(20)); //和下面一行搭配使用 设置Y轴都是正数 numberAxis.setAutoRangeStickyZero(true); numberAxis.setRangeType(RangeType.POSITIVE); //设置Y轴上的数值精度 numberAxis.setNumberFormatOverride(new DecimalFormat("0")); //图标字体 chart.getLegend().setItemFont(FontUtils.getFont("simsun.ttf", "黑体", Font.PLAIN, 14f)); chart.getTitle().setFont(FontUtils.getFont("simsun.ttf", "黑体", Font.PLAIN, 14f)); //图形修改 BarRenderer renderer = (BarRenderer) categoryPlot.getRenderer(); //设置柱状图上的数值精度 renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.00"))); //设置柱子之间的距离 renderer.setItemMargin(0); renderer.setPositiveItemLabelPositionFallback(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER)); renderer.setDefaultItemLabelFont(FontUtils.getFont("simsun.ttf", "黑体", Font.PLAIN, 14f)); renderer.setDrawBarOutline(false); //设置柱子宽度 renderer.setMaximumBarWidth(0.1); //设置柱子高度 renderer.setMinimumBarLength(0.00); //设置最高柱子离顶部位置 rangeAxis.setUpperMargin(0.18); //柱状体上的数值显示 renderer.setDefaultItemLabelsVisible(true); //柱子颜色 renderer.setSeriesPaint(0, new Color(0, 144, 230)); String tempImgPath = this.getClass().getResource("/").getPath() + File.separator + "templates" + File.separator + getCharFileName(); int height = 40 * histogramValueVoList.size(); ImageEntity imageEntity = ChartUtils.creatImag(chart, tempImgPath, 500, height > 200 ? height : 200); return imageEntity; }
package com.utils; import com.google.common.collect.Maps; import java.awt.*; import java.io.File; import java.util.Map; /** * @author leo.xiong * @version 2020/6/23 * @className FontUtils * @Description */ public class FontUtils { private static Map<String, File> nameFileMap = Maps.newHashMap(); private static synchronized void initFontFile(String fileName) { File file = nameFileMap.get(fileName); if (file == null) { String vPath = FontUtils.class.getResource("/").getPath() + File.separator + "bin" + File.separator + fileName; file = new java.io.File(vPath); nameFileMap.put(fileName, file); } } /** * LINUX中文乱码处理 * * @param fileName * @param fontName * @param style * @param size * @return */ public static Font getFont(String fileName, String fontName, int style, Float size) { Font defFont = new Font(fontName, style, 12); try { initFontFile(fileName); File file = nameFileMap.get(fileName); if (file == null || !file.exists()) { return defFont; } java.io.FileInputStream fi = new java.io.FileInputStream(file); Font nf = Font.createFont(Font.TRUETYPE_FONT, fi); fi.close(); // 这一句需要注意 // Font.deriveFont() 方法用来创建一个新的字体对象 nf = nf.deriveFont(style, size); return nf; } catch (Exception e) { } return defFont; } }
package com.utils; import cn.afterturn.easypoi.entity.ImageEntity; import com.alibaba.dubbo.common.utils.Assert; import com.alibaba.dubbo.common.utils.StringUtils; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.StandardChartTheme; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.xy.XYSeriesCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.awt.*; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * @author leo.xiong * @version 2020/6/18 * @className ChartUtils * @Description */ public class ChartUtils { private static final Logger LOGGER = LoggerFactory.getLogger(ChartUtils.class); /** * 将图片转化为字节数组 * * @return 字节数组 */ private static byte[] imgToByte(String tempImgPath) { File file = new File(tempImgPath); byte[] buffer = null; try { FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); byte[] b = new byte[1000]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); bos.close(); buffer = bos.toByteArray(); } catch (IOException e) { e.getMessage(); } //删除临时文件 file.delete(); return buffer; } public static JFreeChart xYLineChart(String title, String xAxisLabel, String yAxisLabel, XYSeriesCollection datas) { //创建主题样式 StandardChartTheme standardChartTheme = new StandardChartTheme("CN"); //设置标题字体 standardChartTheme.setExtraLargeFont(FontUtils.getFont("simsun.ttf", "新宋体", Font.PLAIN, 18f)); // //设置图例的字体 // standardChartTheme.setRegularFont(FontUtils.getFont(path,"yqyzh.ttf","文泉驿正黑", Font.PLAIN, 12f)); // //设置轴向的字体 // standardChartTheme.setLargeFont(FontUtils.getFont(path,"yqyzh.ttf","文泉驿正黑", Font.PLAIN, 12f)); // standardChartTheme.setSmallFont(FontUtils.getFont(path,"yqyzh.ttf","文泉驿正黑", Font.PLAIN, 10f)); //设置图例的字体 standardChartTheme.setRegularFont(FontUtils.getFont("simhei.ttf", "黑体", Font.PLAIN, 12f)); //设置轴向的字体 standardChartTheme.setLargeFont(FontUtils.getFont("simhei.ttf", "黑体", Font.PLAIN, 12f)); standardChartTheme.setSmallFont(FontUtils.getFont("simhei.ttf", "黑体", Font.PLAIN, 10f)); //设置主题样式 ChartFactory.setChartTheme(standardChartTheme); //图标标题、数据集合、是否显示图例标识、是否显示tooltips、是否支持超链接 JFreeChart chart = ChartFactory.createXYLineChart(title, xAxisLabel, yAxisLabel, (XYSeriesCollection) datas, PlotOrientation.VERTICAL, true, true, false); //将jfreechart里RenderingHints做文字渲染参数的修改 chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(560, 367)); final XYPlot plot = chart.getXYPlot(); // setContentPane( chartPanel ); //原文出自【易百教程】,商业转载请联系作者获得授权,非商业请保留原文链接:https://www.yiibai.com/jfreechart/jfreechart_xy_chart.html ValueAxis domainAxis = plot.getDomainAxis(); domainAxis.setTickLabelsVisible(true);//X轴的标题文字是否显示 domainAxis.setTickMarksVisible(true); domainAxis.setAutoRange(true); // ValueAxis rAxisR = plot.getRangeAxis(1); // ((Axis) rAxisR).setTickLabelsVisible(true);//Y轴的标题文字是否显示 // ((NumberAxis) rAxisR).setAutoRangeStickyZero(true); //设置抗锯齿 chart.setTextAntiAlias(false); // plot.setNoDataMessage("no data"); //设置背景图片颜色 plot.setBackgroundImageAlpha(0.0f); //设置背景色 plot.setBackgroundPaint(Color.WHITE); //设置网格横线颜色 plot.setRangeGridlinePaint(Color.black); //忽略无值的分类 // plot.setIgnoreNullValues(true); // plot.setBackgroundAlpha(0f); // //设置标签阴影颜色 // plot.setShadowPaint(new Color(255,255,255)); // //设置标签生成器(默认{0}) // plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}")); return chart; } public static JFreeChart addYLineChart(JFreeChart chart, XYSeriesCollection datas2, String twoyAxisLabel) { if (StringUtils.isEmpty(twoyAxisLabel)) { return chart; } NumberAxis axis2 = new NumberAxis(twoyAxisLabel); // axis2.setLabelFont(FontUtils.getFont(path,"yqyzh.ttf","文泉驿正黑", Font.PLAIN, 12f)); axis2.setLabelFont(FontUtils.getFont("simhei.ttf", "黑体", Font.PLAIN, 12f)); // -- 修改第2个Y轴的显示效果 axis2.setAxisLinePaint(Color.BLUE); axis2.setLabelPaint(Color.BLUE); axis2.setTickLabelPaint(Color.BLUE); chart.getXYPlot().setRangeAxis(1, axis2); chart.getXYPlot().setDataset(1, datas2); chart.getXYPlot().mapDatasetToRangeAxis(1, 1); return chart; } public static ImageEntity creatImag(JFreeChart chart, String tempImgPath, int width, int height) { try { org.jfree.chart.ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, width, height); } catch (IOException e1) { LOGGER.warn("Failed to generate line chart!", e1); } ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath), width, height); Assert.notNull(imageEntity.getData(), "Failed to generate line chart!"); return imageEntity; } }