Fork me on GitHub

JFreeChart初学习

前言

JFreeChart是JAVA平台上的一个开放的图表绘制类库,可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表。

贴上JFreeChart的git地址:https://github.com/jfree/jfreechart

本文对JFreeChart做一个初步的介绍及使用,博主做了一个简单的封装,拿来即用。

工具类介绍

maven 依赖引入

在项目工程的 pom.xml 中引入 JFreeChart 依赖

1
2
3
4
5
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.3</version>
</dependency>
chart 配置类

用于外部配置 chart 配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.awt.Color;
import java.awt.Font;
import java.util.List;

/**
* Description:chart 配置信息
*
* @author fy
* @version 1.0
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Getter
@Setter
public class ChartConfig {

/***
* <p>
* 图标题
* </p>
*/
private String title;
/***
* <p>
* x 轴
* </p>
*/
private String labelX;
/***
* <p>
* y 轴
* </p>
*/
private String labelY;
/***
* <p>
* 是否显示图例
* </p>
*/
private boolean legend;
/***
* <p>
* 采用标准生成器
* </p>
*/
private boolean tooltips;
/***
* <p>
* 是否生成超链接
* </p>
*/
private boolean urls;
/***
* <p>
* 标题字体
* </p>
*/
private Font titleFont;
/***
* <p>
* 轴字体
* </p>
*/
private Font labelFont;

/***
* <p>
* x 轴是否是 number 类型
* </p>
*/
private boolean isNumX;

/***
* <p>
* 线条颜色,按数据的设置顺序指定,跳过需指定null
* </p>
*/
private List<Color> lineColorList;

/***
* <p>
* 线条粗细,按数据的设置顺序指定,跳过需指定null
* 默认的粗细为:2.0f
* </p>
*/
private List<Float> lineStrokeList;

}
chart 数据

用于外部输入需要绘图的 chart 数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import lombok.Data;

/**
* Description:chart 数据
*
* @author fy
* @version 1.0
*/
@Data
public class ChartBean {

private String columnKey;
private Number columnKeyNum;
private double val;

public ChartBean(String columnKey, double val) {
this.columnKey = columnKey;
this.val = val;
}

public ChartBean(Number columnKeyNum, double val) {
this.columnKeyNum = columnKeyNum;
this.val = val;
}
}
逻辑处理工具类

封装 绘制 JFreeChart 图 的逻辑代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import com.fy.util.chart.bean.ChartBean;
import com.fy.util.chart.bean.ChartConfig;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.util.List;
import java.util.Map;

/**
* Description:JFreeChart 工具类
*
* @author fy
* @version 1.0
*/
public class JFreeChartUtil {

/***
* <p>
* 绘制 JFreeChart 图
* </p>
* @author fy
*
* @param dataMap 数据信息
* @param config 绘制的配置信息
*/
public static void makeJFreeChart(Map<String, List<ChartBean>> dataMap,
ChartConfig config) {
boolean isNumX = false;
if (config != null) {
isNumX = config.isNumX();
}
if (isNumX) {
doMakeJFreeChartNum(dataMap, config);
} else {
doMakeJFreeChart(dataMap, config);
}
}

private static void doMakeJFreeChart(Map<String, List<ChartBean>> dataMap,
ChartConfig config) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
for (Map.Entry<String, List<ChartBean>> entry : dataMap.entrySet()) {
String rowKey = entry.getKey();
List<ChartBean> list = entry.getValue();
for (ChartBean chartBean : list) {
dataset.addValue(chartBean.getVal(), rowKey, chartBean.getColumnKey());
}
}
JFreeChart jFreeChart = buildLineChart(config, dataset);
CategoryPlot plot = (CategoryPlot)jFreeChart.getPlot();
// 设置轴字体
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
Font labelFont = config.getLabelFont();
if (labelFont != null) {
domainAxis.setLabelFont(labelFont);
rangeAxis.setLabelFont(labelFont);
}
// 背景底部横虚线
plot.setRangeGridlinePaint(Color.BLUE);
// 设置是否显示水平方向背景线,默认值为 true
plot.setRangeGridlinesVisible(true);
// 设置是否显示垂直方向背景线,默认值为 false
plot.setDomainGridlinesVisible(true);
showPlot(plot, jFreeChart, config.getTitle());
}

private static void doMakeJFreeChartNum(Map<String, List<ChartBean>> dataMap,
ChartConfig config) {
XYSeriesCollection collection = new XYSeriesCollection();
for (Map.Entry<String, List<ChartBean>> entry : dataMap.entrySet()) {
XYSeries xySeries = new XYSeries(entry.getKey());
List<ChartBean> list = entry.getValue();
for (ChartBean chartBean : list) {
xySeries.add(chartBean.getColumnKeyNum(), chartBean.getVal());
}
collection.addSeries(xySeries);
}
JFreeChart jFreeChart = buildXYLineChart(config, collection);
XYPlot plot = (XYPlot) jFreeChart.getPlot();
// 设置轴字体
// X 轴
ValueAxis domainAxis = plot.getDomainAxis();
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
Font labelFont = config.getLabelFont();
if (labelFont != null) {
domainAxis.setLabelFont(labelFont);
rangeAxis.setLabelFont(labelFont);
}
// 背景底部横虚线
plot.setRangeGridlinePaint(Color.BLUE);
// 设置是否显示水平方向背景线,默认值为 true
plot.setRangeGridlinesVisible(true);
// 设置是否显示垂直方向背景线,默认值为 false
plot.setDomainGridlinesVisible(true);

// 设置数据线条颜色及粗细
buildLineColorAndStroke(plot, config);

showPlot(plot, jFreeChart, config.getTitle());
}

private static void buildLineColorAndStroke(XYPlot plot, ChartConfig config) {
XYItemRenderer renderer = plot.getRenderer();
List<Color> lineColorList = config.getLineColorList();
if (lineColorList != null && lineColorList.size() > 0) {
for (int i = 0; i < lineColorList.size(); i++) {
Color color = lineColorList.get(i);
if (color != null) {
renderer.setSeriesPaint(i, color);
}
}
}
List<Float> lineStrokeList = config.getLineStrokeList();
if (lineStrokeList != null && lineStrokeList.size() > 0) {
for (int i = 0; i < lineStrokeList.size(); i++) {
Float stoke = lineStrokeList.get(i);
if (stoke != null) {
renderer.setSeriesStroke(i, new BasicStroke(stoke));
}
}
}
}

private static void showPlot(Plot plot, JFreeChart jFreeChart, String title) {
// 设置背景色
plot.setBackgroundPaint(Color.LIGHT_GRAY);
// 边界线
plot.setOutlinePaint(Color.RED);
plot.setBackgroundAlpha(0.5f);
plot.setNoDataMessage("无对应的数据,请检查数据信息!");
ChartFrame chartFrame = new ChartFrame(title, jFreeChart);
chartFrame.pack();
chartFrame.setVisible(true);
}

private static JFreeChart buildLineChart(ChartConfig config, CategoryDataset dataset) {
JFreeChart jFreeChart = ChartFactory.createLineChart(config.getTitle(),
config.getLabelX(), config.getLabelY(),
dataset,
PlotOrientation.VERTICAL,
// 是否显示图例
config.isLegend(),
// 采用标准生成器
config.isTooltips(),
// 是否生成超链接
config.isUrls());

Font titleFont = config.getTitleFont();
if (titleFont != null) {
jFreeChart.getTitle().setFont(titleFont);
}
return jFreeChart;
}

private static JFreeChart buildXYLineChart(ChartConfig config, XYDataset xyDataset) {
JFreeChart jFreeChart = ChartFactory.createXYLineChart(config.getTitle(),
config.getLabelX(), config.getLabelY(),
xyDataset,
PlotOrientation.VERTICAL,
// 是否显示图例
config.isLegend(),
// 采用标准生成器
config.isTooltips(),
// 是否生成超链接
config.isUrls());

Font titleFont = config.getTitleFont();
if (titleFont != null) {
jFreeChart.getTitle().setFont(titleFont);
}
return jFreeChart;
}
}
工具类使用

指定需要的配置,输入数据源信息,简单调用即可绘制,下面用简单的数据做示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ChartConfig config = ChartConfig.builder()
.title("性能分析")
.labelX("数据数量/w条")
.labelY("耗时/s")
.legend(true)
.tooltips(true)
.titleFont(new Font("宋体", Font.BOLD, 14))
.labelFont(new Font("宋体", Font.PLAIN, 12))
.isNumX(true)
.lineColorList(Arrays.asList(Color.pink, null, Color.YELLOW))
.lineStrokeList(Arrays.asList(3f, 5f, 3f))
.build();
Map<String, List<ChartBean>> dataMap = new HashMap<>(3);
dataMap.put("ONE", Arrays.asList(
new ChartBean(1, 1.6),
new ChartBean(80, 42),
new ChartBean(24, 10)));
dataMap.put("TWO", Arrays.asList(
new ChartBean(1, 0.5),
new ChartBean(80, 34),
new ChartBean(24, 20)));
dataMap.put("THREE", Arrays.asList(
new ChartBean(1, 1.1),
new ChartBean(80, 180),
new ChartBean(24, 18)));
JFreeChartUtil.makeJFreeChart(dataMap, config);

结语

到此,该简单的工具类就介绍完毕了,可以作为初步的学习及使用,当然,还有更多完善的空间,等待咱们一起完善 loading

-------------本文结束感谢您的阅读-------------
如果您对博主的原创满意,欢迎您继续支持下博主~