概述:前段时间交付的一个数据库压力测试项目,使用的是信创的操作系统(统信操作系统以及银河麒麟v10操作系统,架构是arch64),在涉密机房无法联网所以无法下载安装相应的依赖库,导致原本用R语言写的折线图生成代码无法正常执行,所以需要通过Java后端生成折线图,将折线图提供给Java 开发的client显示。
环境:jdk1.8+、eclipse
jar包:fastjson-1.2.59.jar、jcommon-1.0.23.jar、jfreechart-1.0.19.jar
免费链接:jfreechart所需jar包.zip-Java文档类资源-CSDN下载 绝对是无偿给大家的哈,因为这些本身就是开源的东西,如果被收费与作者无关,也可以去官网下载对应版本。
生成的图:
实现代码:
import java.awt.Font;
import java.awt.Paint;
import java.io.File;
import java.io.IOException;
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.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* @author liujian
* Echarts折线图生成demo
* 咕呱咕呱
*/
public class Demomain {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String json1="{\"lineNewOrder\":[{\"y\":\"20\",\"name\":\"new_order(新订单)\",\"x\":\"0.0\"},{\"y\":\"10\",\"name\":\"new_order(新订单)\",\"x\":\"0.2\"},{\"y\":\"15\",\"name\":\"new_order(新订单)\",\"x\":\"0.4\"},{\"y\":\"25\",\"name\":\"new_order(新订单)\",\"x\":\"0.6\"},{\"y\":\"20\",\"name\":\"new_order(新订单)\",\"x\":\"0.8\"},{\"y\":\"15\",\"name\":\"new_order(新订单)\",\"x\":\"1.0\"}],\"linePayment\":[{\"y\":\"20\",\"name\":\"payment(付款)\",\"x\":\"0.0\"},{\"y\":\"28\",\"name\":\"payment(付款)\",\"x\":\"0.2\"},{\"y\":\"35\",\"name\":\"payment(付款)\",\"x\":\"0.4\"},{\"y\":\"30\",\"name\":\"payment(付款)\",\"x\":\"0.6\"},{\"y\":\"40\",\"name\":\"payment(付款)\",\"x\":\"0.8\"},{\"y\":\"35\",\"name\":\"payment(付款)\",\"x\":\"1.0\"}],\"lineOrderStatus\":[{\"y\":\"40\",\"name\":\"order_status(订单状态)\",\"x\":\"0.0\"},{\"y\":\"65\",\"name\":\"order_status(订单状态)\",\"x\":\"0.2\"},{\"y\":\"50\",\"name\":\"order_status(订单状态)\",\"x\":\"0.4\"},{\"y\":\"70\",\"name\":\"order_status(订单状态)\",\"x\":\"0.6\"},{\"y\":\"80\",\"name\":\"order_status(订单状态)\",\"x\":\"0.8\"},{\"y\":\"140\",\"name\":\"order_status(订单状态)\",\"x\":\"1.0\"}],\"lineStockLevel\":[{\"y\":\"40\",\"name\":\"stock_level(库存)\",\"x\":\"0.0\"},{\"y\":\"65\",\"name\":\"stock_level(库存)\",\"x\":\"0.2\"},{\"y\":\"70\",\"name\":\"stock_level(库存)\",\"x\":\"0.4\"},{\"y\":\"80\",\"name\":\"stock_level(库存)\",\"x\":\"0.6\"},{\"y\":\"110\",\"name\":\"stock_level(库存)\",\"x\":\"0.8\"},{\"y\":\"150\",\"name\":\"stock_level(库存)\",\"x\":\"1.0\"}],\"lineDelivery\":[{\"y\":\"50\",\"name\":\"delivery(发货)\",\"x\":\"0.0\"},{\"y\":\"110\",\"name\":\"delivery(发货)\",\"x\":\"0.2\"},{\"y\":\"140\",\"name\":\"delivery(发货)\",\"x\":\"0.4\"},{\"y\":\"120\",\"name\":\"delivery(发货)\",\"x\":\"0.6\"},{\"y\":\"130\",\"name\":\"delivery(发货)\",\"x\":\"0.8\"},{\"y\":\"145\",\"name\":\"delivery(发货)\",\"x\":\"1.0\"}]}";
creatLine( json1, 1000 ,400,1.0f );
}
/**
* @author liujian
* @param json 数据
* @param width 图片宽度
* @param height 图片高度
* @param quality 图片质量0.0f——1.0f 值越大越高
*/
public static void creatLine(String json, int width ,int height,float quality ) {
JSONObject obj= (JSONObject) JSON.parse(json);
DefaultCategoryDataset line_chart_dataset = new DefaultCategoryDataset();
JSONArray lineNewOrder= (JSONArray) obj.get("lineNewOrder");
for(int i=0;i<lineNewOrder.size();i++) {
line_chart_dataset.addValue( lineNewOrder.getJSONObject(i).getLong("y") ,lineNewOrder.getJSONObject(i).getString("name") , lineNewOrder.getJSONObject(i).getString("x") );
}
JSONArray linePayment= (JSONArray) obj.get("linePayment");
for(int i=0;i<linePayment.size();i++) {
line_chart_dataset.addValue( linePayment.getJSONObject(i).getLong("y") ,linePayment.getJSONObject(i).getString("name") , linePayment.getJSONObject(i).getString("x") );
}
JSONArray lineOrderStatus= (JSONArray) obj.get("lineOrderStatus");
for(int i=0;i<lineOrderStatus.size();i++) {
line_chart_dataset.addValue( lineOrderStatus.getJSONObject(i).getLong("y") ,lineOrderStatus.getJSONObject(i).getString("name") , lineOrderStatus.getJSONObject(i).getString("x") );
}
JSONArray lineStockLevel= (JSONArray) obj.get("lineStockLevel");
for(int i=0;i<lineStockLevel.size();i++) {
line_chart_dataset.addValue( lineStockLevel.getJSONObject(i).getLong("y") ,lineStockLevel.getJSONObject(i).getString("name") , lineStockLevel.getJSONObject(i).getString("x") );
}
JSONArray lineDelivery= (JSONArray) obj.get("lineDelivery");
for(int i=0;i<lineDelivery.size();i++) {
line_chart_dataset.addValue( lineDelivery.getJSONObject(i).getLong("y") ,lineDelivery.getJSONObject(i).getString("name") , lineDelivery.getJSONObject(i).getString("x") );
}
JFreeChart lineChartObject = ChartFactory.createLineChart(
null,"已用分钟数",
"延迟(毫秒)",
line_chart_dataset,PlotOrientation.VERTICAL,
true,true,false);
//主标题
Font fontMain= new Font("宋体",Font.BOLD,20);
TextTitle mainTitle= new TextTitle("软件与管理平台 v5",fontMain);
mainTitle.setMargin(20.0, 0, 5, 0);
lineChartObject.setTitle(mainTitle);
//副标题
Font subFont= new Font("黑体",Font.BOLD,15);
TextTitle subtitle = new TextTitle("事务延迟",subFont);
lineChartObject.addSubtitle(subtitle);
//x轴
Font xFont= new Font("宋体",Font.BOLD,15);
CategoryPlot categoryPlot =lineChartObject.getCategoryPlot();
CategoryAxis domainAxis= categoryPlot.getDomainAxis();
//x轴坐标上的文字设置
// domainAxis.setTickLabelFont(xFont);
//设置x轴坐标标题
domainAxis.setLabelFont(xFont);
Paint paint= lineChartObject.getBorderPaint();
NumberAxis numberAxis= (NumberAxis) categoryPlot.getRangeAxis();
//y轴坐标上文字设置
Font yFont= new Font("宋体",Font.BOLD,15);
//设置Y轴坐标上的文字
// numberAxis.setTickLabelFont(yFont);
//设置Y轴标题文字
numberAxis.setLabelFont(yFont);
lineChartObject.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));//控制底部中文正常显示
File lineChart = new File( "D:/Line1Chart.jpeg" );
try {
ChartUtilities.saveChartAsJPEG(lineChart ,quality,lineChartObject, width ,height);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}