JFreeChart绘制XY折线图(工具类设计)
准备用Java写通信的仿真平台作为毕业设计,相比matlab绘图,Java绘图需要自己去写很多工具类,博主在这采用了JFreeChart的开源解决方案,摸索着自己写了一个XY折线图工具类,话不多说贴源码,源码中写了很多注释,配了一套自己用的绘图样式,需要的童鞋可以借鉴借鉴,希望对你有帮助。源代码已上传我的github上。
首先用Maven引入Jar包
<!-- Java 绘图 -->
<dependency>
<groupId>jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.13</version>
</dependency>
DrawingToolsTest工具类设计
先看效果
下方是我的测试方法,准备了x和y的数据放入Map中,然后传入已经写好的接口中,就一行代码。底层的过程都封装好了,调的话很方便
public class DrawingToolsTest {
@Test
public void testTools() {
int sum = 20;//随机生成20对数
Map<Double, Double> map1 = new HashMap<>();
double[] restX = RandomTools.getRadomDouble(1, 20, 1, sum);
double[] restY = RandomTools.getRadomDouble(1, 20, 1, sum);
for (int i = 0; i < sum; i++) {
map1.put(restX[i], restY[i]);
}
Map<Double, Double> map2 = new HashMap<>();
for (int i = 0; i < sum; i++) {
map2.put(restY[i], restX[i]);
}
Map<Double, Double>[] dataSet = new Map[]{map1, map2};
String[] types = new String[]{"A", "B"};
//调用绘图工具
DrawingTools.drawLineChart("axin", "测试", "这是X轴",
"这是y轴", dataSet, types);
Scanner in = new Scanner(System.in);
in.hasNext();
}
}
/**
* @author Axin
*/
public class RandomTools {
/**
* @param start
* @param end
* @param retain 保留几位小数
* @param sum 生成多少个数
* @return
*/
public static double[] getRadomDouble(int start, int end, int retain, int sum) {
double[] res = new double[sum];
for (int i = 0; i < sum; i++) {
BigDecimal db = new BigDecimal(Math.random() * (end - start) + start);
//四舍五入
res[i] = db.setScale(retain, BigDecimal.ROUND_HALF_UP).doubleValue();
}
return res;
}
}
运行后:
工具类源码
/**
* 后端绘图类
*
* @author Axin
* @date 2018-10-16
*/
@ConfigurationProperties(prefix = "draw")
public class DrawingTools extends ApplicationFrame {
private String titleFont;
private int titleFontSize;
private String xyFont;
private int xyFontSize;
DrawingTools() {
this("Axin");
}
public DrawingTools(String appTitle) {
super(appTitle);
this.titleFont = "微软雅黑";
this.titleFontSize = 20;
this.xyFont = "微软雅黑";
this.xyFontSize = 15;
}
/**
* @param appTitle 标题
* @param chartTitle 图标题
* @param xName x轴命名
* @param yName y轴命名
* @param dataSet 数据集
* @param types 线条种类
*/
public static void drawLineChart(String appTitle, String chartTitle,
String xName,
String yName,
Map<Double, Double>[] dataSet,
String[] types) {
DrawingTools tools = new DrawingTools(appTitle);
IntervalXYDataset dataset = tools.getLineDataset(dataSet, types);
JFreeChart chart = tools.getLineChart(chartTitle, xName, yName, dataset);
//绘图模式化
tools.setChartCSS(chart);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(900, 600));
tools.setContentPane(chartPanel);
tools.pack();
RefineryUtilities.centerFrameOnScreen(tools);
tools.setVisible(true);
}
private JFreeChart getLineChart(String title, String xName, String yName, XYDataset dataset) {
/**
* 图标标题,x轴名称,y轴名称,数据集合,图标显示方向,是否使用图示,是否生成工具栏,是否生成URL链接
*/
JFreeChart chart = ChartFactory.createXYLineChart(
title,
xName,
yName,
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
return chart;
}
/**
* 自定义设置图表字体样式
*
* @param chart
*/
private void setChartCSS(JFreeChart chart) {
//初始化
chart.setBackgroundPaint(ChartColor.WHITE);
XYPlot plot = chart.getXYPlot();
//标题
TextTitle textTitle = chart.getTitle();
textTitle.setFont(new Font(titleFont, Font.BOLD, titleFontSize));
LegendTitle legendTitle = chart.getLegend();
legendTitle.setItemFont(new Font(titleFont, Font.PLAIN, titleFontSize));
//图表xy轴字体设置
plot.getDomainAxis().setLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
plot.getDomainAxis().setTickLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
plot.getRangeAxis().setTickLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
plot.getRangeAxis().setLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
//设置背景色-xy轴格子色
plot.setBackgroundPaint(ChartColor.WHITE);
plot.setRangeGridlinePaint(ChartColor.lightGray);
// plot.setDomainGridlinePaint(ChartColor.lightGray);
//折线图渲染
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
plot.setRenderer(renderer);
// renderer.setPaint(ChartColor.BLACK);
chart.getLegend().setPosition(RectangleEdge.RIGHT);
}
/**
* @param dataSets int:double
* @param types 折线的种类
* @return
*/
private IntervalXYDataset getLineDataset(Map<Double, Double>[] dataSets, String[] types) {
XYSeriesCollection dataSet = new XYSeriesCollection();
int index = 0;
for (String type : types) {
XYSeries series = new XYSeries(type);
for (Map.Entry<Double, Double> data : dataSets[index++].entrySet()) {
series.add(data.getKey(), data.getValue());
}
dataSet.addSeries(series);
}
return dataSet;
}
}
结语
其实在真实生产环境中,后端已经不渲染报表图片之类了,都是后端传数据给前端,由前端来进行可视化,这里使用JFreeChart是为了后端做单元测试而编写的。
JFreeChart绘制XY折线图(工具类设计)的更多相关文章
- JFreeChart在制作折线图
JFreeChart在制作折线图的时候可以使用两种不同的方式 package Line; import java.awt.Color; import java.awt.Font; import org ...
- JFreeChart应用实例-折线图
http://www.tuicool.com/articles/Nr2Yna JFreeChart在制作折线图的时候可以使用两种不同的方式 package Line; import java.awt. ...
- struts2整合JFreechart 饼图、折线图、柱形图
struts2整合JFreechart 饼图.折线图.柱形图 上效果图: 当然可以将数据导出图片格式存储.具体下的链接里的文件有保存成图片的操作. 因为是strust2整合JFreechart,所以s ...
- canvas绘制经典折线图(一)
最终效果图如下: 实现步骤如下:注-引用了jQuery HTML代码 <!doctype html> <html lang="en"> <head&g ...
- 思维导图工具 & 原型设计工具
最近需要画出系统流程架构什么的,就用到了几个思维导图工具 1. XMind -- 思维导图工具 2. MindManager -- 思维导图工具 3. AXURE RP --原型设计工具
- HttpClient 4.5.x 工具类设计与实现
最近,业务需要在java服务端发起http请求,需要实现"GET","POST","PUT"等基本方法.于是想以 "HttpCli ...
- 使用RedisTemplate进行Redis存取的工具类设计
通常在访问量大数据更新频率不高的系统中会使用第三方的缓存组件来降低数据库服务的负载,鉴于模块独立分工独立的考虑,针对缓存组件操作的工作全部应该统一接口对其他业务提供服务,这样业务操作只需要关注业务实现 ...
- 基于Java反射的map自动装配JavaBean工具类设计
我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...
- 百度推出的echarts,制表折线图柱状图饼图等的超级工具(转)
一.简介: 1.绘制数据图表,有了它,想要网页上绘制个折线图.柱状图,从此easy. 2.使用这个百度的echarts.js插件,是通过把图片绘制在canvas上在显示在页面上. 官网对echarts ...
随机推荐
- 【SpringBoot系列4】SpringBoot定制自己的bean
起因:SpringBoot我是越用越喜欢,但当SpringBoot出了问题的时候,我却无从下手,因为封装实在是太高度化了.然后之前有一个需求,使用SpringBoot提供的StringRedisTem ...
- 局域网内客户端无法使用机器名连接SQLServer服务器
在生产环境中有时会要求使用机器名连接SQLServer服务器,但有时捣好久都没法连上~ 针对这个问题做个简短记录,防止以后自己再遇到记不起原因,也方便一下其他同行! 废话不多说,作为工作多年的老家伙了 ...
- [日常] Go语言圣经--复合数据类型,数组习题
go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...
- 深入理解Java线程池:ThreadPoolExecutor
线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...
- java自动探测文件的字符编码
Mozilla有一个C++版的自动字符集探测算法代码,然后sourceforge上有人将其改成java版的~~ 主页:http://jchardet.sourceforge.net/ jchardet ...
- 对vector等STL标准容器进行排序操作(转!)
西方有句谚语:不要重复发明轮子! STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已 ...
- 面试中常问的List去重问题,你都答对了吗?
面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固. 我们大家都知道,set集合的特点就是没有重复的元素.如果集合中的数据类型是基本 ...
- springboot —— 多数据源
本文主要介绍如何在一个springboot项目配置两个数据源(mysql和oracle): 1.引进相关依赖 <!-- https://mvnrepository.com/artifact/my ...
- 【 js 基础 】【读书笔记】关于this
this 关键字是 Javascript 中很特别的一个关键字,被自动定义在所有函数的作用域中.this提供了一种更优雅的方式隐式“传递”一个对象的引用.今天就来说说 this 的指向问题. this ...
- python-组合模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 组合模式主要用来处理一类具有“容器特征”的对象——它们即充当对象又可以作为容器包 ...