我们将使用Java和JFreeChart插件绘制重叠柱状图和折线图的组合。
绘制一个像这样的图:
首先添加POM依赖:
<dependency><groupId>jfree</groupId><artifactId>jfreechart</artifactId><version>1.0.13</version></dependency><dependency><groupId>jfree</groupId><artifactId>jcommon</artifactId><version>1.0.16</version></dependency>
然后绘制:
package com.rit.demo.test;import java.awt.Color;import java.awt.Font;import java.io.File;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.NumberTickUnit;import org.jfree.chart.labels.StandardCategoryToolTipGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.DatasetRenderingOrder;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.LayeredBarRenderer;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.data.category.DefaultCategoryDataset;import org.junit.Test;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestpublic class EchartsTest {public final static String filePathBarChart = "E:\\漏检率.png";/*** 绘制重叠柱状图和折线图组合* @Title: drawEcharts* @author Emily1_Zhang* @return: String*/public String drawEcharts() {// 折線圖DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();lineDataset.addValue(0, "漏检率", "F1 设备一部");lineDataset.addValue(0, "漏检率", "F1 设备二部");lineDataset.addValue(0, "漏检率", "F2 设备一部");lineDataset.addValue(0, "漏检率", "F2 设备二部");lineDataset.addValue(0.0364, "漏检率", "F3 AE一部-AW-一课");lineDataset.addValue(0.0123, "漏检率", "F3 AE一部-维护一课");lineDataset.addValue(0, "漏检率", "F3 ME一部-ME FA课");lineDataset.addValue(0.052, "漏检率", "F3 ME一部-ME一课");lineDataset.addValue(0, "漏检率", "F3 电子工程一部-AP课");lineDataset.addValue(0.0101, "漏检率", "F3 电子工程一部-RF课");lineDataset.addValue(0, "漏检率", "F4 AE一部-AE一课");lineDataset.addValue(0.0333, "漏检率", "F4 AE一部-AE一课");lineDataset.addValue(0, "漏检率", "F4 ME一部-ME FA课");lineDataset.addValue(0.0192, "漏检率", "F4 ME一部-ME二课");lineDataset.addValue(0, "漏检率", "F4 电子工程一部-AP课");lineDataset.addValue(0, "漏检率", "F4 电子工程一部-RF课");lineDataset.addValue(0.0217, "漏检率", "F5 AE二部-AF二课");lineDataset.addValue(0.0088, "漏检率", "F5 AE二部-维护二课");lineDataset.addValue(0, "漏检率", "F5 ME二部-ME三课");lineDataset.addValue(0, "漏检率", "F5 电子工程二部-AP课");lineDataset.addValue(0.0156, "漏检率", "F5 电子工程二部-RF课");lineDataset.addValue(0, "漏检率", "F6 AE三部-维护三课");lineDataset.addValue(0, "漏检率", "F6 ME二部-ME三课");// 柱狀圖DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(0, "自检", "F1 设备一部");dataset.addValue(0, "自检", "F1 设备二部");dataset.addValue(0, "自检", "F2 设备一部");dataset.addValue(0, "自检", "F2 设备二部");dataset.addValue(50, "自检", "F3 AE一部-AW-一课");dataset.addValue(70, "自检", "F3 AE一部-维护一课");dataset.addValue(90, "自检", "F3 ME一部-ME FA课");dataset.addValue(195, "自检", "F3 ME一部-ME一课");dataset.addValue(100, "自检", "F3 电子工程一部-AP课");dataset.addValue(100, "自检", "F3 电子工程一部-RF课");dataset.addValue(70, "自检", "F4 AE一部-AE一课");dataset.addValue(50, "自检", "F4 AE一部-AE一课");dataset.addValue(100, "自检", "F4 ME一部-ME FA课");dataset.addValue(100, "自检", "F4 ME一部-ME二课");dataset.addValue(80, "自检", "F4 电子工程一部-AP课");dataset.addValue(100, "自检", "F4 电子工程一部-RF课");dataset.addValue(50, "自检", "F5 AE二部-AF二课");dataset.addValue(110, "自检", "F5 AE二部-维护二课");dataset.addValue(120, "自检", "F5 ME二部-ME三课");dataset.addValue(60, "自检", "F5 电子工程二部-AP课");dataset.addValue(60, "自检", "F5 电子工程二部-RF课");dataset.addValue(60, "自检", "F6 AE三部-维护三课");dataset.addValue(40, "自检", "F6 ME二部-ME三课");dataset.addValue(2, "复检", "F1 设备一部");dataset.addValue(10, "复检", "F1 设备二部");dataset.addValue(3, "复检", "F2 设备一部");dataset.addValue(6, "复检", "F2 设备二部");dataset.addValue(50, "复检", "F3 AE一部-AW-一课");dataset.addValue(80, "复检", "F3 AE一部-维护一课");dataset.addValue(105, "复检", "F3 ME一部-ME FA课");dataset.addValue(200, "复检", "F3 ME一部-ME一课");dataset.addValue(100, "复检", "F3 电子工程一部-AP课");dataset.addValue(101, "复检", "F3 电子工程一部-RF课");dataset.addValue(81, "复检", "F4 AE一部-AE一课");dataset.addValue(70, "复检", "F4 AE一部-AE一课");dataset.addValue(60, "复检", "F4 ME一部-ME FA课");dataset.addValue(105, "复检", "F4 ME一部-ME二课");dataset.addValue(115, "复检", "F4 电子工程一部-AP课");dataset.addValue(80, "复检", "F4 电子工程一部-RF课");dataset.addValue(89, "复检", "F5 AE二部-AF二课");dataset.addValue(50, "复检", "F5 AE二部-维护二课");dataset.addValue(100, "复检", "F5 ME二部-ME三课");dataset.addValue(110, "复检", "F5 电子工程二部-AP课");dataset.addValue(50, "复检", "F5 电子工程二部-RF课");dataset.addValue(40, "复检", "F6 AE三部-维护三课");dataset.addValue(40, "复检", "F6 ME二部-ME三课");// 生成柱狀圖JFreeChart chart = ChartFactory.createBarChart("BY 厂别漏检率汇总", "课别", // x轴的标签"总量", // y轴的标签dataset, // 图标显示的数据集合PlotOrientation.VERTICAL, true, true, false);chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 10));// 处理图像上的乱码// 处理主标题的乱码chart.getTitle().setFont(new Font("黑体", Font.BOLD, 18));// 处理图表区域对象CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();// 获取X轴对象CategoryAxis categoryAxis = categoryPlot.getDomainAxis();// 获取第一条Y轴对象NumberAxis numberAxis0 = (NumberAxis) categoryPlot.getRangeAxis();// 第二条Y轴NumberAxis numberAxis = new NumberAxis("漏检率");// 数据显示格式是百分比DecimalFormat df = new DecimalFormat("0.000%");numberAxis.setNumberFormatOverride(df); // 数据轴数据标签的显示格式categoryPlot.setRangeAxis(1, numberAxis);categoryPlot.mapDatasetToRangeAxis(1, 1);// 处理X轴上的乱码categoryAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));// 处理X轴外的乱码categoryAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));// 处理Y轴上的乱码numberAxis0.setTickLabelFont(new Font("黑体", Font.BOLD, 10));numberAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));// 处理Y轴外的乱码numberAxis0.setLabelFont(new Font("黑体", Font.BOLD, 10));numberAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));// 自定义Y轴上显示的刻度,以30作为1格numberAxis0.setAutoTickUnitSelection(false);NumberTickUnit unit0 = new NumberTickUnit(30);numberAxis0.setTickUnit(unit0);//以1作为1格numberAxis.setAutoTickUnitSelection(false);NumberTickUnit unit = new NumberTickUnit(0.005);numberAxis.setTickUnit(unit);// 获取绘图区域对象// 重叠柱状图LayeredBarRenderer layeredBarRenderer = new LayeredBarRenderer();//设置第一个柱子的宽度layeredBarRenderer.setSeriesBarWidth(0, 1);//设置第二个柱子的宽度layeredBarRenderer.setSeriesBarWidth(1, 0.6);//设置柱子最小的高度layeredBarRenderer.setMinimumBarLength(0.1);//设置数字边框是否可见layeredBarRenderer.setDrawBarOutline(true);//设置第一个柱子颜色layeredBarRenderer.setSeriesPaint(0, new Color(82, 255, 66));//设置第二个柱子颜色layeredBarRenderer.setSeriesPaint(1, new Color(105, 90, 255));//设置每个课所包含的平行柱的之间距离layeredBarRenderer.setItemMargin(0.4);layeredBarRenderer.setBaseItemLabelFont(new Font("宋体", Font.BOLD, 10));categoryPlot.setRenderer(layeredBarRenderer);// 放折線圖categoryPlot.setDataset(1, lineDataset);// 設置折線LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();lineAndShapeRenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());categoryPlot.setRenderer(1, lineAndShapeRenderer);// 柱狀圖和縱軸緊靠categoryAxis.setLowerMargin(0.0);categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);categoryPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);File file = new File(filePathBarChart);try {ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);return filePathBarChart;} catch (Exception e) {e.printStackTrace();}return null;}@Testpublic void echart() {EchartsTest et=new EchartsTest();et.drawEcharts();}}
